近两年微服务架构成为企业应用架构的流行趋势,除了互联网企业,传统企业也纷纷选择拥抱微服务。加之容器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基本概念、基础架构及在企业级云平台中的实践。对微服务治理感兴趣的企业决策者、技术调研者、架构师、开发人员、运维人员,欢迎持续关注!