【从小白到专家】Istio技术实践专题(三):在K8s集群上部署Istio的三种方式

近两年微服务架构成为企业应用架构的流行趋势,除了互联网企业,传统企业也纷纷选择拥抱微服务。加之容器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: truek8s:  
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

 

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

 

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

 

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

 

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

 

  1. 选择配置文件,部署与选择的配置文件相对应的 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

 

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

 

$ helm init --service-account tiller

 

  1. 安装 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

 

  1. 选择一个配置文件,然后部署与选择的配置文件相对应的 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

 

  1. 确保相应的 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                                                                                                                     2
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   2mistio-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 配置:

1.$ kubectl apply -f -<<EOF
2.apiVersion: install.istio.io/v1alpha1
3.kind:IstioControlPlane
4.metadata:
5.namespace: istio-operator
6.  name: example-istiocontrolplane
7.spec:
8.  profile:default
9.EOF

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

1.$ kubectl apply -f -<<EOF
2.apiVersion: install.istio.io/v1alpha1
3.kind:IstioControlPlane
4.metadata:
5.namespace: istio-operator
6.  name: example-istiocontrolplane
7.spec:
8.  profile:default
9.  telemetry:
10.    enabled:false
11.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
K8S中文社区微信公众号

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址