灵雀云
全栈云原生平台
帮助企业在任何云上构建、运行管理应用程序,覆盖应用全生命周期管理,300+金融/制造/能源等头部企业级云原生解决方案!
注册试用
获取云原生转型之旅
【从小白到专家】Istio技术实践专题(三):在K8s集群上部署Istio的三种方式
2020-05-11

近两年微服务架构成为企业应用架构的流行趋势,除了互联网企业,传统企业也纷纷选择拥抱微服务。加之容器Kubernetes、DevOps、微服务云原生技术“黄金三角”的互相赋能,微服务架构成为当前企业IT架构设计的首选。


Isito是Service Mesh的产品化落地,是目前最受欢迎的服务网格,功能丰富、成熟度高。本文主要根据官网文档整理而成,介绍Istio针对单集群的三种主流部署安装方式:使用Istioctl安装、使用Helm自定义安装、独立Operator安装。多集群安装部署暂不涉及,在今后的文章中我们再做详细阐述。

 


使用 Istioctl 安装


使用默认配置文件安装 Istio


最简单的方法是安装 default  Istio 配置文件使用以下命令:


$ istioctl manifest apply

此命令用于在配置好的 Kubernetes 集群上安装 default 配置文件。default 配置文件是建立生产环境的起点,这与旨在评估广泛的 Istio 功能特性的较大的 demo 配置文件不同。


如果要在 default 配置文件之上启用 Grafana dashboard,用下面的命令设置 addonComponents.grafana.enabled 配置参数:



$ istioctl manifest apply --set addonComponents.grafana.enabled=true

可以像使用 helm 一样在 istioctl 中配置 --set 标志。唯一的区别是必须为配置路径增加 values. 前缀,因为这是 Helm 透传 API 的路径,如下所述。



$ istioctl manifest apply --set addonComponents.grafana.enabled=true


可以像使用 helm 一样在 istioctl 中配置 —set 标志。这其中唯一的区别是必须为配置路径增加 values. 前缀,因为这是 Helm 透传 API 的路径,如下所述。

 

从外部Chart安装


通常,istioctl 使用内置 Chart 生成安装清单。这Chart 会和与 istioctl 一起发布,用于审核和自定义,它们 放置在 install/kubernetes/operator/charts 目录下。除了使用内置 Chart 外,istioctl 还可以使用外部 Chart 生成安装清单。要选择外部 Chart ,请配置 installPackagePath 参数(接收本地文件系统路径):



$ istioctl manifest apply --set installPackagePath=< base directory where installed >/istio-releases/istio-1.5.1/install/kubernetes/operator/chart


如果使用 istioctl 1.5.1 二进制文件,该命令执行结果与通过 istioctl manifest apply 安装相同,因为它指向的 Chart 与内置 Chart 相同。除了试验或测试新特性之外,我们建议使用内置 Chart 而不是外部提供,以确保 istioctl 二进制文件与 Chart 的兼容性。

 

安装其他配置文件


可以通过在命令行上设置配置文件名称安装其他 Istio 配置文件到群集中。例如,可以使用以下命令,安装 demo 配置文件:


$ istioctl manifest apply --set profile=demo

显示可用配置文件的列表


您可以使用以下 istioctl 命令来列出 Istio 配置文件名称:




$ istioctl profile list

Istio configuration profiles:    

remote    

separate   

 default   

 demo    

empty    

minimal



显示配置文件的配置


您可以查看配置文件的配置设置。通过以下命令查看 default 配置文件的设置:


$ istioctl profile dump demo

addonComponents:  

grafana:      enabled: true  kiali:      enabled: true  

  prometheus:      enabled: true   

 tracing:      enabled: true  

components:    egressGateways:    

  - enabled: true        k8s:        

  resources:           

 requests:                      

  cpu: 10m                      

  memory: 40Mi       

 name: istio-egressgateway 

...

查看整个配置的子集,可以使用 --config-path 标志,这一标志仅选择部分给定路径下的配置:



$ istioctl profile dump --config-path components.pilot demo

enabled: true

k8s: 

 env:  

 - name: POD_NAME 

   valueFrom:      

 fieldRef:       

 apiVersion: v1  

       fieldPath: metadata.name

  - name: POD_NAMESPACE   

 valueFrom:       

fieldRef:       

 apiVersion: v1         

fieldPath: metadata.namespace  

- name: GODEBUG   

 value: gctrace=1 

 - name: PILOT_TRACE_SAMPLING   

 value: "100" 

 - name: CONFIG_NAMESPACE  

  value: istio-config

...


显示配置文件中的差异


profile diff 子命令可用于显示配置文件之间的差异,在将更改应用于集群之前,这对于检查自定义的效果很有用。您可以使用以下命令显示default和 demo 配置文件之间的差异:






$ istioctl profile diff default demo gateways:    egressGateways:    -  - enabled: false    +  - enabled: true    ...         k8s:            requests:-                         cpu: 100m-                         memory: 128Mi+                         cpu: 10m+                         memory: 40Mi                strategy:...


安装前生成清单


您可以在安装 Istio 之前使用 manifest generate 子命令生成清单,而不是 manifest apply。例如,使用以下命令为 default 配置文件生成清单:



$ istioctl manifest generate > $HOME/generated-manifest.yaml

根据需要检查清单,然后使用以下命令应用清单:




$ kubectl apply -f $HOME/generated-manifest.yaml


由于集群中的资源不可用,此命令可能显示暂时错误。


验证安装成功


使用 verify-install 命令检查 Istio 安装是否成功,它将集群上的安装与您指定的清单进行比较。


如果未在部署之前生成清单,请运行以下命令以现在生成它:



$ istioctl manifest generate <your original installation options> > $HOME/generated-manifest.yamlerated-manifest.yaml


然后运行以下 verify-install 命令以查看安装是否成功:



$ istioctl verify-install -f $HOME/generated-manifest.yaml

 


二、使用 Helm 自定义安装



这种安装方式使用 Helm charts 自定义 Istio 控制平面和 Istio 数据平面的 sidecar。你只需使用 helm template 生成配置并使用 kubectl apply 命令安装它, 或者你可以选择使用 helm install 让 Tiller 来完全管理安装。


通过这些说明, 您可以选择 Istio 内置的任何一个 配置文件 并根据的特定的需求进行进一步的自定义配置。


添加 Helm chart 仓库


下面的命令使用了包含 Istio 发行版镜像的 Helm charts。如果要使用 Istio 发行版 Helm chart ,建议使用下面的命令添加 Istio 发行版仓库:



$ helm repo add istio.io https://storage.googleapis.com/istio-release/releases/1.5.1/charts/



安装步骤


将目录切换到 Istio 发行版的根目录,然后在以下两个选项中选择一种安装方式:


1.  如果不使用 Tiller 部署 Istio,请查看方案 1。

2.  如果选择 Helm 的 Tiller pod 来管理 Istio 发行版, 请查看方案 2。


默认情况下,Istio 使用 LoadBalancer 服务类型。而有些平台是不支持 LoadBalancer 服务的。对于不支持 LoadBalancer 服务类型的平台, 执行下面的步骤时,可以在 Helm 命令中加入 --set gateways.istio-ingressgateway.type=NodePort 选项,使用 NodePort 来替代 LoadBalancer 服务类型。


方案 1: 使用 helm template 命令安装


在集群没有安装 Tiller 的情况下,可以选择此方案。


1.     为 Istio 组件创建命名空间 istio-system:


$ kubectl create namespace istio-system

2.     使用 kubectl apply 安装所有 Istio 的 自定义资源 (CRDs) :



$ helm template install/kubernetes/helm/istio-init --name istio-init --namespace istio-system | kubectl apply -f -

3. 等待所有的 Istio CRD 创建完成:


$ kubectl -n istio-system wait --for=condition=complete job --all

4. 选择配置文件,部署与选择的配置文件相对应的 Istio 核心组件。我们建议在生产环境使用默认的配置文件:

可以添加一个或多个 --set <key>=<value> 来进一步自定义 helm 命令的安装选项 。


default:


$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl apply -f -

demo:



$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \    --values install/kubernetes/helm/istio/values-istio-demo.yaml | kubectl apply -f -

minimal:



$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \    --values install/kubernetes/helm/istio/values-istio-minimal.yaml | kubectl apply -f -

sds:



$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \    --values install/kubernetes/helm/istio/values-istio-sds-auth.yaml | kubectl apply -f -

Istio CNI enabled:


安装 Istio CNI 组件:



$ helm template install/kubernetes/helm/istio-cni --name=istio-cni --namespace=kube-system | kubectl apply -f -
将 --set istio_cni.enabled=true 设置追加到 helm 命令上,来启用 Istio CNI件。以 Istio 默认配置文件为例:$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \    --set istio_cni.enabled=true | kubectl apply -f -


方案 2: 在 Helm 和 Tiller 环境中使用 helm install 命令安装


这个方案使用 Helm 和 Tiller 来对 Istio 的生命周期进行管理。


1.   请确保集群的 Tiller 设置了 cluster-admin 角色的 Service Account。如果没有定义,可以执行下面命令创建:


$ kubectl apply -f manifests/UPDATING-CHARTS.md

2.   使用 Service Account 在集群上安装 Tiller:



$ helm init --service-account tiller
3. 安装 istio-init chart,来启动 Istio CRD 的安装过程:


$ helm install install/kubernetes/helm/istio-init --name istio-init --namespace istio-system
4.等待所有Istio CRD 创建完成:


$ kubectl -n istio-system wait --for=condition=complete job --all

5.  选择一个配置文件,然后部署与选择的配置文件相对应的 istio 的核心组件。我们建议在生成环境部署中使用默认配置文件:


添加一个或多个 --set <key>=<value> 来进一步定义 Helm 命令的 安装选项。


default:



$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system

demo:




$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system \    --values install/kubernetes/helm/istio/values-istio-demo.yaml

minimal:




$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system \    --values install/kubernetes/helm/istio/values-istio-minimal.yaml

sds:




$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system \    --values install/kubernetes/helm/istio/values-istio-sds-auth.yaml

Istio CNI enabled:


安装 Istio CNI chart:



$ helm install install/kubernetes/helm/istio-cni --name istio-cni --namespace kube-system


将 --set istio_cni.enabled=true 设置追加到 helm 命令上,来启用 Istio CNI 插件。以 Istio 默认配置文件为例:



$ helm install install/kubernetes/helm/istio --name istio --namespace istio-system --set istio_cni.enabled=true


验证安装


1.  查询配置文件的组件表,验证是否已部署了与选择的配置文件相对应的 Kubernetes 服务:


$ kubectl get svc -n istio-system

2.   确保相应的 Kubernetes Pod 已部署并且 STATUS 是 Running:


$ kubectl get pods -n istio-system

卸载


对于使用 helm template 命令安装的 Istio,使用如下命令卸载:


default:




$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system | kubectl delete -f -$ kubectl delete namespace istio-system

demo:





$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \    --values install/kubernetes/helm/istio/values-istio-demo.yaml | kubectl delete -f -$ kubectl delete namespace istio-system

minimal:





$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \    --values install/kubernetes/helm/istio/values-istio-minimal.yaml | kubectl delete -f -$ kubectl delete namespace istio-system


sds:




$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \    --values install/kubernetes/helm/istio/values-istio-sds-auth.yaml | kubectl delete -f -$ kubectl delete namespace istio-system


Istio CNI enabled:

$ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \   

 --set istio_cni.enabled=true | kubectl delete -f 


$ helm template install/kubernetes/helm/istio-cni --name=istio-cni --namespace=kube-system | kubectl delete -f -


对于使用的 Helm 和 Tiller 安装的 Istio, 使用如下命令卸载:





$ helm delete --purge istio

$ helm delete --purge istio-init

$ helm delete --purge istio-cni

$ kubectl delete namespace istio-system


删除 CRD 和 Istio 配置


在Istio 的设计中,自定义资源以 CRD 形式存在于 Kubernetes 环境之中。CRD 中包含了运维过程中产生的运行时配置。正因如此,我们建议运维人员应该显式的对其进行删除,从而避免意外操作。


istio-init Chart 包含了 istio-init/files 目录中的所有原始 CRD。下载该 Chart 之后,可以简单使用 kubectl 删除 CRD。要永久删除 Istio 的 CRD 以及所有 Istio 配置, 请运行如下命令:



$ kubectl delete -f install/kubernetes/helm/istio-init/files

 


三、安装独立 Operator


该指南将指引使用独立的 Istio operator 来安装 Istio。唯一的依赖就是一个 Kubernetes 集群和 kubectl 命令行工具。


如果要安装生产环境的 Istio,我们还是建议您参考使用 istioctl 安装。


前提条件

执行必要的平台特定设置。

检查 Pods 和 Services 需求。

部署 Istio operator。



$ kubectl apply -f https://preliminary.istio.io/operator.yaml


这条命令会在 istio-operator 命名空间中创建以下资源,并运行 Istio operator :

operator 自定义资源

operator 控制器 deployment

operator 指标信息 service

operator 必要的 RBAC 规则


安装

运行以下命令用 operator 安装 Istio demo 配置文件:



$ kubectl create ns istio-system

$ kubectl apply -f - <<EOF

apiVersion: install.istio.io/v1alpha1

kind: IstioControlPlane

metadata:  

namespace: istio-operator  

name: example-istiocontrolplane 

 spec:    

profile: demo  

EOF


控制器会检测 IstioControlPlane 资源,然后按照指定的(demo)配置安装 Istio 组件。


使用以下命令来确认 Istio 控制面板服务是否部署:





$ kubectl get svc -n istio-system

NAME                     TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                                                                                                                      AGE

grafana                  ClusterIP      172.21.211.123   <none>          3000/TCP                                                                                                                                     2m

istio-citadel            ClusterIP      172.21.177.222   <none>          8060/TCP,15014/TCP                                                                                                                           2m

istio-egressgateway      ClusterIP      172.21.113.24    <none>          80/TCP,443/TCP,15443/TCP                                                                                                                     2m

istio-galley             ClusterIP      172.21.132.247   <none>          443/TCP,15014/TCP,9901/TCP                                                                                                                   2m

istio-ingressgateway     LoadBalancer   172.21.144.254   52.116.22.242                               15020:31831/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:30318/TCP,15030:32645/TCP,15031:31933/TCP,15032:31188/TCP,15443:30838/TCP   2m

istio-pilot              ClusterIP      172.21.105.205   <none>          15010/TCP,15011/TCP,8080/TCP,15014/TCP                                                                                                       2m

istio-policy             ClusterIP      172.21.14.236    <none>          9091/TCP,15004/TCP,15014/TCP                                                                                                                 2m

istio-sidecar-injector   ClusterIP      172.21.155.47    <none>          443/TCP,15014/TCP                                                                                                                            2m

istio-telemetry          ClusterIP      172.21.196.79    <none>          9091/TCP,15004/TCP,15014/TCP,42422/TCP                                                                                                       2m

jaeger-agent             ClusterIP      None             <none>          5775/UDP,6831/UDP,6832/UDP                                                                                                                   2m

jaeger-collector         ClusterIP      172.21.135.51    <none>          14267/TCP,14268/TCP                                                                                                                          2m

jaeger-query             ClusterIP      172.21.26.187    <none>          16686/TCP                                                                                                                                    2m

kiali                    ClusterIP      172.21.155.201   <none>          20001/TCP                                                                                                                                    2m

prometheus               ClusterIP      172.21.63.159    <none>          9090/TCP                                                                                                                                     2m

tracing                  ClusterIP      172.21.2.245     <none>          80/TCP                                                                                                                                       2m

zipkin                   ClusterIP      172.21.182.245   <none>          9411/TCP















$ kubectl get pods -n istio-system

NAME                                                                 READY       STATUS      RESTARTS   AGE

grafana-f8467cc6-rbjlg                                         1/1           Running            0          1m

istio-citadel-78df5b548f-g5cpw                             1/1         Running           0          1m

istio-egressgateway-78569df5c4-zwtb5                1/1         Running           0          1m

istio-galley-74d5f764fc-q7nrk                                1/1         Running           0          1m

istio-ingressgateway-7ddcfd665c-dmtqz                1/1       Running            0          1m

istio-pilot-f479bbf5c-qwr28                                    1/1        Running           0          1m

istio-policy-6fccc5c868-xhblv                                  1/1        Running          2          1m

istio-sidecar-injector-78499d85b8-x44m6              1/1        Running           0          1m

istio-telemetry-78b96c6cb6-ldm9q                        1/1         Running           2          1m

istio-tracing-69b5f778b7-s2zvw                             1/1          Running          0          1m

kiali-99f7467dc-6rvwp                                          1/1           Running           0          1m

prometheus-67cdb66cbb-9w2hm                           1/1        Running           0          1m



更新

现在,控制器已经运行,可以通过编辑或替换 IstioControlPlane 资源改变 Istio 的配置。控制器将会检测该变化,并更新 Istio 的安装。运行以下命令将安装切换为 default 配置:


$ kubectl apply -f -<<EOFapiVersion: install.istio.io/v1alpha1kind:IstioControlPlanemetadata:namespace: istio-operator  name: example-istiocontrolplanespec:  profile:defaultEOF

可以启用或禁用指定的特性或组件。例如,禁用遥测特性:


$ kubectl apply -f -<<EOF

apiVersion: install.istio.io/v1alpha1

kind:IstioControlPlane

metadata:

namespace: istio-operator  

name: example-istiocontrolplane

spec: 

 profile:default  

telemetry:    enabled:false

EOF


卸载


删除 Istio operator 和 Istio 部署:




$ kubectl -n istio-operator get IstioControlPlane example-istiocontrolplane -o=json | jq '.metadata.finalizers = null' | kubectl delete -f -

$ kubectl delete ns istio-operator --grace-period=0 --force

$ kubectl delete ns istio-system --grace-period=0 --force


 


“从小白到专家Istio技术实践”专题系统讲述Istio基本概念、基础架构及在企业级云平台中的实践。对微服务治理感兴趣的企业决策者、技术调研者、架构师、开发人员、运维人员,欢迎持续关注!


© 2024 All Rights Reserved. 灵雀云 版权所有 备 案号:京ICP备15011102号-2      隐私条款
电话咨询 在线客服 微信咨询 公众号