使用 Istio Operator 安装

除了手动在生产环境中安装、升级、和卸载 Istio,你还可以用 Istio operator 管理安装。 这样做还能缓解管理不同 Istio 版本的负担。 你只需简单的更新 operator 自定义资源(CR)即可, operator 控制器将为你应用相应的配置更改。

当你用 istioctl install 命令安装 Istio 时, 底层使用的是和 operator 安装相同的 IstioOperator API。 在这两种场景下,都会以架构验证配置,并执行同样的正确性检查。

使用 operator 确实存在安全隐患: 这是因为当使用 istioctl install 命令时,操作运行于管理员用户的安全上下文中; 而使用 operator 时,操作运行于集群内 pod 自己的安全上下文中。 为避免此漏洞,需要确保 operator 自身部署的足够安全。

先决条件

  1. 执行必要的平台安装

  2. 检查 服务和 Pod 的要求

  3. 安装 istioctl 可执行程序

  4. 部署 Istio operator:

    1. $ istioctl operator init

    此命令运行 operator 在 istio-operator 命名空间中创建以下资源:

    • operator 自定义资源定义(CRD)
    • operator 控制器的 deployment 对象
    • 一个用来访问 operator 指标的服务
    • Istio operator 运行必须的 RBAC 规则

    你可以配置 operator 控制器安装的命名空间、operator 观测的命名空间、Istio 的镜像源和版本、以及更多。 例如,可以使用参数 --watchedNamespaces 指定一个或多个命名空间来观测:

    1. $ istioctl operator init --watchedNamespaces=istio-namespace1,istio-namespace2

    更多详细信息,请参阅 istioctl operator init 命令参考

    您也可以使用 Helm 部署 operator:

    1. $ helm install istio-operator manifests/charts/istio-operator \
    2. --set hub=docker.io/istio \
    3. --set tag=1.9.1 \
    4. --set operatorNamespace=istio-operator \
    5. --set watchedNamespaces=istio-namespace1,istio-namespace2

    注意:为了运行上面的命令,你需要下载 Istio 的发行版本

安装

要使用 operator 安装 Istio demo 配置项(configuration profile),请运行以下命令:

  1. $ kubectl create ns istio-system
  2. $ kubectl apply -f - <<EOF
  3. apiVersion: install.istio.io/v1alpha1
  4. kind: IstioOperator
  5. metadata:
  6. namespace: istio-system
  7. name: example-istiocontrolplane
  8. spec:
  9. profile: demo
  10. EOF

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

Istio operator 控制器在创建 IstioOperator 资源的90秒内启动 Istio 的安装。 Istio 安装过程将在 120 秒内完成。

可以使用以下命令确认 Istio 控制平面服务是否成功:

  1. $ kubectl get svc -n istio-system
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. istio-egressgateway ClusterIP 10.103.243.113 <none> 80/TCP,443/TCP,15443/TCP 17s
  4. istio-ingressgateway LoadBalancer 10.101.204.227 <pending> 15020:31077/TCP,80:30689/TCP,443:32419/TCP,31400:31411/TCP,15443:30176/TCP 17s
  5. istiod ClusterIP 10.96.237.249 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP,53/UDP,853/TCP 30s 13s
  1. $ kubectl get pods -n istio-system
  2. NAME READY STATUS RESTARTS AGE
  3. istio-egressgateway-5444c68db8-9h6dz 1/1 Running 0 87s
  4. istio-ingressgateway-5c68cb968-x7qv9 1/1 Running 0 87s
  5. istiod-598984548d-wjq9j 1/1 Running 0 99s

更新

现在,控制器已经运行起来,你可以通过编辑或替换 IstioOperator 来改变 Istio 配置。 控制器将检测到改变,继而用相应配置更新 Istio 的安装内容。

例如,使用以下命令将安装切换到 default 配置:

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

还可以启用或禁用组件、改变资源设置。 例如,启用 istio-egressgateway 组件并增加 pilot 的内存要求:

  1. $ kubectl apply -f - <<EOF
  2. apiVersion: install.istio.io/v1alpha1
  3. kind: IstioOperator
  4. metadata:
  5. namespace: istio-system
  6. name: example-istiocontrolplane
  7. spec:
  8. profile: default
  9. components:
  10. pilot:
  11. k8s:
  12. resources:
  13. requests:
  14. memory: 3072Mi
  15. egressGateways:
  16. - name: istio-egressgateway
  17. enabled: true
  18. EOF

通过检查 operator 控制器日志, 你可以检测到控制器为了响应 IstioOperator CR 的更新,而在集群中所做的改变:

  1. $ kubectl logs -f -n istio-operator $(kubectl get pods -n istio-operator -lname=istio-operator -o jsonpath='{.items[0].metadata.name}')

参阅 IstioOperator API完整的配置设置。

就地升级

下载并提取希望升级到的 Istio 版本对应的 istioctl。 在目标 Istio 版本的目录中,重新安装 operator:

  1. $ <extracted-dir>/bin/istioctl operator init

你会看到 istio-operator 的 Pod 已重新启动,其版本已更改到目标版本:

  1. $ kubectl get pods --namespace istio-operator \
  2. -o=jsonpath='{range .items[*]}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{"\n"}{end}'

经过一两分钟后,Istio 控制平面组件也会重新启动为新版本:

  1. $ kubectl get pods --namespace istio-system \
  2. -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.containers[*]}{.image}{", "}{end}{"\n"}{end}'

金丝雀升级

金丝雀升级的过程类似于 istioctl 版本的金丝雀升级

例如,要升级上一节中安装的 Istio 修订版本, 首先验证群集中名为 example-istiocontrolplaneIstioOperator CR 是否存在:

  1. $ kubectl get iop --all-namespaces
  2. NAMESPACE NAME REVISION STATUS AGE
  3. istio-system example-istiocontrolplane HEALTHY 11m

下载并提取希望升级到的 Istio 版本对应的 istioctl。 然后,运行以下命令,基于群集内的 IstioOperator CR 的方式,安装 Istio 目标版本的控制平面 (这里,我们假设目标修订版本为 1.8.1):

  1. $ istio-1.8.1/bin/istioctl operator init --revision 1-8-1

你也可以通过 Helm 用不同的修订设置部署另一个 operator:

  1. $ helm install istio-operator manifests/charts/istio-operator \
  2. --set hub=docker.io/istio \
  3. --set tag=1.9.1 \
  4. --set operatorNamespace=istio-operator \
  5. --set watchedNamespaces=istio-system \
  6. --set revision=1-7-0

注意:你需要下载 Istio 的发行版本来运行上面的命令。

运行该命令后,你将看到两组并排运行的控制平面 deployments 和 services:

  1. $ kubectl get pods -n istio-system -l app=istiod
  2. NAME READY STATUS RESTARTS AGE
  3. istiod-5f4f9dd5fc-4xc8p 1/1 Running 0 10m
  4. istiod-1-8-1-55887f699c-t8bh8 1/1 Running 0 8m13s
  1. $ kubectl -n istio-system get svc -l app=istiod
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. istiod ClusterIP 10.87.7.69 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP,853/TCP 10m
  4. istiod-1-8-1 ClusterIP 10.87.4.92 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP,853/TCP 7m55s

要完成升级,请给工作负载的命名空间打这个标签: istio.io/rev=1-8-1 ,并重新启动工作负载, 就如 数据平面升级 文档的描述。

卸载

如果你使用 operator 完成了控制平面的金丝雀升级, 请运行以下命令卸载旧版本的控件平面,并保留新版本:

  1. $ istioctl operator remove --revision <revision>

否则,删除集群内运行的 IstioOperator CR,该 CR 将卸载正在运行的 Istio 的所有修订版本:

  1. $ kubectl delete istiooperators.install.istio.io -n istio-system example-istiocontrolplane

等到 Istio 卸载完成 - 这可能需要一些时间。 然后删除 Istio 运算符:

  1. $ istioctl operator remove

或:

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

注意:在 Istio 完全移除之前删除 operator 可能会导致 Istio 资源残留。 需要清理 operator 未删除的内容:

  1. $ istioctl manifest generate | kubectl delete -f -
  2. $ kubectl delete ns istio-system --grace-period=0 --force

相关内容

介绍 istiod:简化控制平面

Istiod 将 Istio 控制平面组件合并为一个二进制文件。

在 Istio 中进行 WebAssembly 声明式部署

以声明方式为 Envoy 和 Istio 配置 Wasm 扩展。

重新定义代理的扩展性:Envoy 和 Istio 引入 WebAssembly

Istio 的扩展中使用 WASM 的前景。

Istio 2020——为了商用

Istio 在 2020 年的愿景声明及路线图。

DNS 证书管理

在 Istio 中配置和管理 DNS 证书。

Istio Operator 简介

关于 Istio 基于 operator 的安装和控制平面管理特性的介绍。