教程 | Kubernetes上运行Istio Ingress Controller

Posted K8S技术社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了教程 | Kubernetes上运行Istio Ingress Controller相关的知识,希望对你有一定的参考价值。


,文末二维码报名!



本教程演示了如何在Kubernetes集群中运行Istio Ingress Controller。

 

基本原理


Istio项目承载多个组件,包括:Pilot、Mixer和Auth。这些组件组合起来提供了一个完整的平台来连接,管理和保障微服务的安全。 但是,采用Istio并不是0或1的命题。 你可以选用所需的部件。在本教程中,负责Envoy实例生命周期的Istio Pilot以及基于Envoy的Kubernetes Ingress Controller Istio Ingress将用于提供强大的Ingress解决方案。

 


架构



  •     Istio Pilot由Deployment管理

  •     Istio Ingress Controller由DaemonSet管理

        ——在专用Istio Ingress节点池中的每个节点上运行

  •     前端Load Balancer跨多个Istio入口控制器分配流量

 

教程


 

先决条件

 

Google Cloud Platform


本教程利用Google Cloud Platform简化了Kubernetes集群的配置以及运行Istio Pilot和Ingress Controller所需的必要计算基础设施。

运行本教程的估计费用:每小时0.16美元(每天3.79美元)。

(本教程所需的计算资源超过Google Cloud Platform免费层。)

来源

Istio Ingress Tutorial存储库包含必须下载到用于实践本教程的机器上的配置文件和脚本的集合。使用git命令克隆此存储库:


git clone https://github.com/kelseyhightower/istio-ingress-tutorial.git

 

本教程的其余部分假定你的工作目录是克隆的存储库的根目录。进入istio-ingress-tutorial目录:


cd istio-ingress-tutorial

 

客户端工具


本教程需要与许多工具和服务进行交互,这些工具和服务需要一组特定的命令行实用程序才能安装在用于实践本教程的机器上。

安装以下客户端工具,并确保它们位于你的路径中:


gcloud 166.0.0

kubectl 1.7.3
istioctl 0.1.6

 

(使用gcloud安装kubectl:gcloud组件安装kubectl)


Kubernetes基础设施


配置一个Kubernetes集群

需要一个Kubernetes 1.7.3+集群来托管Istio Pilot和Ingress Controller。使用gcloud命令配置两个节点的Kubernetes集群:


gcloud container clusters create istio \

  --machine-type n1-standard-1 \

  --num-nodes 2 \

  --cluster-version 1.7.

配置istio Kubernetes集群可能需要几分钟的时间。等待上述命令完成或使用gcloud命令来监视单个终端中的进度:


gcloud container clusters list

NAME   ZONE           MASTER_VERSION  MASTER_IP      MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS

istio  us-central1-f  1.7.3           XX.XXX.XXX.XX  n1-standard-1  1.7.3         2          PROVISIONING


预计完成时间:5分钟。

配置Istio Ingress节点池

添加一个附加的节点池,以支持在一组专用机器上运行多个Istio Ingress控制器。


gcloud container node-pools create istio-ingress-pool \

  --cluster istio \

  --machine-type n1-standard-1 \

  --num-nodes 2 \

  --node-labels dedicated=istio-ingress


预计完成时间:2分钟。

列出istio Kubernetes集群的节点池:

 

gcloud container node-pools list --cluster istio

NAME                MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION

default-pool        n1-standard-1  100           1.7.3

istio-ingress-pool  n1-standard-1  100           1.7.3


istio Kubernetes集群就绪之前可能需要几分钟的时间。使用gcloud命令来监视进度:


gcloud container clusters list

NAME   ZONE           MASTER_VERSION  MASTER_IP      MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS

istio  us-central1-f  1.7.3           XXX.XXX.XX.XX  n1-standard-1  1.7.3         4          RECONCILING

 

预计完成时间:3分钟。

污染Istio Ingress节点池

通过污染节点来确保istio-ingress-pool节点池中的节点只接受Istio Ingress工作负载:

kubectl taint nodes \

  $(kubectl get nodes -l dedicated=istio-ingress -o jsonpath='{.items[*].metadata.name}') \

  dedicated=istio-ingress:NoSchedule

node "gke-istio-istio-ingress-pool-XXXXXXXX-XXXX" tainted

node "gke-istio-istio-ingress-pool-XXXXXXXX-XXXX" tainted


授予当前用户集群管理权限

需要管理员权限才能为Istio Pilot和Ingress Controller创建必要的RBAC规则:


kubectl create clusterrolebinding cluster-admin-binding \

  --clusterrole=cluster-admin \

  --user=$(gcloud config get-value core/account)

配置Istio Pilot

创建Istio-pilot服务帐户和集群角色

创建istio-pilot服务帐户

kubectl apply -f serviceaccounts/istio-pilot.yaml


创建istio-pilot集群角色:


kubectl apply -f clusterroles/istio-pilot.yaml


创建istio-pilot角色绑定:

kubectl apply -f rolebindings/istio-pilot.yaml

创建Istio ConfigMap

创建保存Istio配置的istio ConfigMap:


kubectl apply -f configmaps/istio.yaml

创建Istio Piolt部署

创建istio-pilot部署:


kubectl apply -f deployments/istio-pilot.yaml


暴露Istio Pilot部署

创建istio-pilot服务:


kubectl apply -f services/istio-pilot.yaml

此时,Istio Pilot服务可用:


kubectl get pods -l istio=pilot

NAME                          READY     STATUS    RESTARTS   AGE

istio-pilot-XXXXXXXXX-XXXXX   2/2       Running   0          1m


 Istio Ingress Controller


在本部分中,将使用DaemonSet把Istio Ingress Controller部署到
istio-ingress-pool节点池中的每个节点。这样做的原因是为Istio Ingress
控制器提供专用资源,并支持独立于默认节点池扩展istio Ingress
节点池的能力。使用两个不同的节点池也可以为Ingress Controllers和一般
工作负载使用不同的机器类型。

创建Istio Ingress服务帐户和集群角色

创建istio-ingress服务帐户:

kubectl apply -f serviceaccounts/istio-ingress.yaml


创建istio-ingress集群角色:

kubectl apply -f clusterroles/istio-ingress.yaml


创建istio-ingress角色绑定:


kubectl apply -f rolebindings/istio-ingress.yaml


创建Istio Ingress DaemonSet

使用DaemonSet来确保在istio-ingress-pool节点池中的每个节点上运行单
Istio Ingress Controller。


kubectl apply -f daemonsets/istio-ingress.yaml

暴露Istio Ingress Controller

创建istio-ingress服务:

kubectl apply -f services/istio-ingress.yaml


istio-ingress服务将spec.externalTrafficPolicy设置为Local,以确保只有
运行Istio Ingress Controller的istio-ingress-pool节点池中的节点才能接
收流量。

此时,Istio入口控制器已准备好接收流量:


kubectl get pods -l istio=ingress

NAME                  READY     STATUS    RESTARTS   AGE

istio-ingress-XXXXX   1/1       Running   0          5m

istio-ingress-XXXXX   1/1       Running   0          5m


Istio 路由规则

Istio Ingress Controller提供基于Envoy的独特流量管理功能的高级功能集。
本部分将演示如何使用Istio Pilot和istioclt命令行工具动态配置
Istio Ingress Controller。

istio-test HTTP服务将用于演示Istio的流量管理功能。

测试Istio Ingress Controller

部署v1的istio测试应用程序:


kubectl apply -f deployments/istio-test-v1.yaml

暴露istio-test-v1部署:


kubectl apply -f services/istio-test.yaml

创建istio-test Ingress对象:



ISTIO_INGRESS_IP=$(kubectl get svc istio-ingress \

  -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

curl -i http://${ISTIO_INGRESS_IP}

HTTP/1.1 200 OK

date: Fri, 18 Aug 2017 16:26:40 GMT

content-length: 14

content-type: text/plain; charset=utf-8

x-envoy-upstream-service-time: 1

server: envoy

 

istio-test-v1


测试Istio路由规则

Isito Ingress控制器可以由Istio Pilot动态配置,以便在外部客户
端和Kubernetes集群中运行的服务之间提供更高级的路由。为了演示
这些功能,我们需要部署v2的istio-test HTTP服务:


kubectl apply -f deployments/istio-test-v2.yaml


此时,istio-test服务的v1和v2应该运行:


kubectl get pods -l app=istio-test

NAME                             READY     STATUS    RESTARTS   AGE

istio-test-v1-XXXXXXXXX-XXXXX    1/1       Running   0          5m

istio-test-v2-XXXXXXXXX-XXXXX    1/1       Running   0          4m

将curl命令运行几次,观察Istio Ingress Controller的响应:

curl http://${ISTIO_INGRESS_IP}

istio-test-v1

curl http://${ISTIO_INGRESS_IP}

istio-test-v2

请注意,istio-test服务的v1和v2都在响应。

添加路由规则

Istio路由规则可用于强制所有客户端点击v2的istio-test服务。

创建路由规则并将其保存到名为istio-test-default.yaml的文件中:


cat > istio-test-default.yaml <<EOF

type: route-rule

name: istio-test-default

namespace: default

spec:

  destination: istio-test.default.svc.cluster.local

  route:

    - tags:

        version: v2

      weight: 100

EOF

使用istioctl命令提交路由规则:


istioctl create -f istio-test-default.yaml


路由规则存储在Kubernetes ThirdPartyResources中。


kubectl get thirdpartyresources

NAME                    DESCRIPTION           VERSION(S)

istio-config.istio.io   Istio configuration   v1alpha1


检查istio-test-default路由规则配置的详细信息:


kubectl get istioconfigs

NAME                            KIND

route-rule-istio-test-default   IstioConfig.v1alpha1.istio.io


使用kubectl describe命令获取更多详细信息:


kubectl describe istioconfigs route-rule-istio-test-default

Name:         route-rule-istio-test-default

Namespace:    default

Labels:       <none>

Annotations:  <none>

API Version:  istio.io/v1alpha1

Kind:         IstioConfig

Metadata:

  Creation Timestamp:   2017-08-18T16:29:34Z

  Resource Version:     10775

  Self Link:            /apis/istio.io/v1alpha1/namespaces/default/istioconfigs/route-rule-istio-test-default

  UID:                  6b7530f4-8432-11e7-a05d-42010a80004f

Spec:

  Destination:  istio-test.default.svc.cluster.local

  Route:

    Tags:

      Version:  v2

    Weight:     100

Events:         <none>

也可以使用istioctl命令:

istioctl get route-rules istio-test-default

destination: istio-test.default.svc.cluster.local

route:

- tags:

    version: v2

  weight: 100

Istio Ingress Controller进行交互

使用istio-test-default路由规则,重新运行curl命令几次并观察响应:

curl http://${ISTIO_INGRESS_IP}

istio-test-v2

curl http://${ISTIO_INGRESS_IP}

istio-test-v2

注意所有的流量都由istio-test服务的v2处理。

清理


bash clean-up

 

 

译者:Jonathan Zhang

原文:https://github.com/kelseyhightower/istio-ingress-tutorial/blob/master/docs/06-istio-route-rules.md



 

以上是关于教程 | Kubernetes上运行Istio Ingress Controller的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 集群上的 Kafka 与 Istio

istio 三日谈之一 环境准备

Istio安全基础:在零可信网络上运行微服务

Istio实战-Istio 与 Kubernetes 行业主流?

Istio实战-Istio 与 Kubernetes 行业主流?

一键在本地搭建运行Istio 1.0的分布式Kubernetes集群