• Ebpay

    Ebpay
    全栈云原生平台
    帮助企业在任何云上构建、运行管理应用程序,覆盖应用全生命周期管理,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 http://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 http://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基本概念、基础架构及在企业级云平台中的实践。对微服务治理感兴趣的企业决策者、技术调研者、架构师、开发人员、运维人员,欢迎持续关注!


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