使用 Istio Operator 安装

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

当您用使用 Istioctl 安装安装 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.12.2 \
    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 时使用了 --watchedNamespaces,请将 IstioOperator 资源应用于任一观测的命名空间中,而不是应用于 istio-system 中。

默认情况下,Istio 控制平面(istiod)将安装在 istio-system 命名空间中。要将其安装到其他命名空间,请使用 values.global.istioNamespace 字段,如下:

  1. apiVersion: install.istio.io/v1alpha1
  2. kind: IstioOperator
  3. ...
  4. spec:
  5. profile: demo
  6. values:
  7. global:
  8. istioNamespace: istio-namespace1

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.12.2 \
  4. --set operatorNamespace=istio-operator \
  5. --set watchedNamespaces=istio-system \
  6. --set revision=1-7-0

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

复制 example-istiocontrolplane CR 并将其另存为 example-istiocontrolplane-1-8-1.yaml 文件。 在 CR 中修改该文件的名称为 example-istiocontrolplane-1-8-1,并添加 revision: 1-8-1。 更新后的 IstioOperator CR 如下所示:

  1. $ cat example-istiocontrolplane-1-8-1.yaml
  2. apiVersion: install.istio.io/v1alpha1
  3. kind: IstioOperator
  4. metadata:
  5. namespace: istio-system
  6. name: example-istiocontrolplane-1-8-1
  7. spec:
  8. revision: 1-8-1
  9. profile: demo

运行该命令后,您将看到两组并排运行的控制平面 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. $ kubectl delete istiooperators.install.istio.io -n istio-system example-istiocontrolplane

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

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

如果省略 revision 标志,则 Istio Operator 的所有修订版本都将被删除。

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

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