多版本的 Gateway 管理 [实验性]

该特性正在积极研发中,目前尚处于 experimental 阶段。

使用一个 IstioOperator CR,即使在使用 金丝雀升级,CR 中定义的任何 Gateway (包括安装在默认配置文件中的 istio-ingressgateway)也会被热升级。但应该避免这样,因为 Gateway 是影响应用程序正常运行时的关键组件。在新的控制和数据平面可以正常工作以后,再升级 Gateway 。

本指南将会向您介绍通过在单独的 IstioOperator CR 中定义和管理来升级 Gateway 的推荐方法,与用于安装和管理控制平面的设备分开。

为了避免 .(点)在一些 Kubernetes 的路径中不是有效字符,修订名称不应该包含 .(点)。

istioctl

本节介绍了使用 istioctl 单独安装和升级控制平面和 Gateway 。该示例演示了如何使用金丝雀升级方法将 Istio 1.8.0 升级到 1.8.1,并将控制平面的 Gateway 和其他 Gateway 分开管理。

使用 istioctl 安装

  1. 确保主 IstioOperator CR 具有名字并且没有安装 Gateway :

    1. # 文件名: control-plane.yaml
    2. apiVersion: install.istio.io/v1alpha1
    3. kind: IstioOperator
    4. metadata:
    5. name: control-plane # REQUIRED
    6. spec:
    7. profile: minimal
  2. 为 Gateway 创建单独的 IstioOperator CR,确保具有名字且使用 empty profile:

    1. # 文件名: Gateway .yaml
    2. apiVersion: install.istio.io/v1alpha1
    3. kind: IstioOperator
    4. metadata:
    5. name: Gateway # REQUIRED
    6. spec:
    7. profile: empty # REQUIRED
    8. components:
    9. ingressGateway :
    10. - name: istio-ingressgateway
    11. enabled: true
  3. 安装 CR

    1. $ istio-1.8.0/bin/istioctl install -n istio-system -f control-plane.yaml --revision 1-8-0
    2. $ istio-1.8.0/bin/istioctl install -n istio-system -f Gateway .yaml --revision 1-8-0

Istioctl 的安装和操作动作通过 revision 和拥有者的 CR 名称进行确定具有所有权的资源。只有传递给 istioctl 安装、操作资源的名称和 revision 标签可以被 IstioOperator CR 匹配时,该资源才会受到 CR 更改的影响,集群内的其他资源都将被忽略。注意确保每个 IstioOperator 安装的组件不会与另一个 IstioOperator CR 相互重叠,否则两个 CR 会导致控制器或 istioctl 命令相互干扰。

使用 istioctl 升级

假设目标版本为 1.8.1。

  1. 下载 Istio 1.8.1 版本,并使用该版本的 istioctl 来安装 Istio 1.8.1 的控制平面:

    1. $ istio-1.8.1/bin/istioctl install -f control-plane.yaml --revision 1-8-1

    (有关步骤2-4的更多详细信息,请参阅金丝雀升级文档。)

  2. 验证控制平面是否正确运行。

  3. 使用 istio.io/rev=1-8-1 标记工作负载的命名空间,并且重启相应的工作负载。

  4. 验证工作负载是否已经注入新的代理版本,并且集群已经正常运行。

  5. 此时,Ingress Gateway 仍然是 1.8.0 的版本。您应该可以看到一下容器正在运行:

    1. $ kubectl get pods -n istio-system --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. istio-ingressgateway-65f8bdd46c-d49wf 1/1 Running 0 21m service.istio.io/canonical-revision=1-8-0 ...
    4. istiod-1-8-0-67f9b9b56-r22t5 1/1 Running 0 22m istio.io/rev=1-8-0 ...
    5. istiod-1-8-1-75dfd7d494-xhmbb 1/1 Running 0 21s istio.io/rev=1-8-1 ...

    最后一步,将集群中的所有 Gateway 升级到新版本:

    1. $ istio-1.8.1/bin/istioctl install -f Gateway .yaml --revision 1-8-1
  6. 删除 1.8.1 版本的控制平面:

    1. $ istio-1.8.1/bin/istioctl x uninstall --revision 1-8-0

Operator

本节介绍使用 Istio operator 单独安装和升级控制平面与 Gateway 。下面示例演示如何使用金丝雀升级方法将 Istio 1.8.0 升级到 1.8.1,并且分别管理控制平面和 Gateway 。

使用 Operator 安装

  1. 使用 Istio Operator 向集群中安装一个修正版:

    1. $ istio-1.8.0/bin/istioctl operator init --revision 1-8-0
  2. 确保主 IstioOperator CR 具有名字和 revision,并且没有安装 Gateway :

    1. # 文件名: control-plane-1-8-0.yaml
    2. apiVersion: install.istio.io/v1alpha1
    3. kind: IstioOperator
    4. metadata:
    5. name: control-plane-1-8-0 # REQUIRED
    6. spec:
    7. profile: minimal
    8. revision: 1-8-0 # REQUIRED
  3. 为 Gateway 创建一个单独的 IstioOperator CR,确保具有名字并且使用了 empty profile:

    1. # 文件名: Gateway .yaml
    2. apiVersion: install.istio.io/v1alpha1
    3. kind: IstioOperator
    4. metadata:
    5. name: Gateway # REQUIRED
    6. spec:
    7. profile: empty # REQUIRED
    8. revision: 1-8-0 # REQUIRED
    9. components:
    10. ingressGateway :
    11. - name: istio-ingressgateway
    12. enabled: true
  4. 在集群中执行以下命令来完成部署:

    1. $ kubectl create namespace istio-system
    2. $ kubectl apply -n istio-system -f control-plane-1-8-0.yaml
    3. $ kubectl apply -n istio-system -f Gateway .yaml

验证 Operator 和 Istio 的控制平面已经完成安装并且正在运行。

通过 Operator 升级

假设目标版本为 1.8.1。

  1. 下载 Istio 1.8.1 版本,并且使用 1.8.1 版本的 istioctl 安装 Istio 1.8.1 的 Operator:

    1. $ istio-1.8.1/bin/istioctl operator init --revision 1-8-1
  2. 将上述安装步骤中的控制平面 CR 赋值为 control-plane-108-1.yaml。将文件中的 1-8-0 修改为 1-8-1

  3. 使用新文件部署到集群中:

    1. $ kubectl apply -n istio-system -f control-plane-1-8-1.yaml
  4. 验证两个版本的 istiod 都在集群中运行。Operator 可能需要几分钟时间来安装新的控制平面,并使其变为运行状态。

    1. $ kubectl -n istio-system get pod -l app=istiod
    2. NAME READY STATUS RESTARTS AGE
    3. istiod-1-8-0-74f95c59c-4p6mc 1/1 Running 0 68m
    4. istiod-1-8-1-65b64fc749-5zq8w 1/1 Running 0 13m
  5. 有关工作负载过渡到新的 Istio 版本的更多详细信息,请查阅金丝雀升级文档。

    • 使用 istio.io/rev=1-8-1 标记工作负载的命名空间,并且重启相应的工作负载。
    • 验证工作负载是否已经注入新的代理版本,并且集群已经正常运行。
  6. 将 Gateway 升级到新版本。在安装步骤中,编辑 Gateway.yaml 文件,将所有的 1-8-0 替换为 1-8-1 的版本,并重新部署该文件:

    1. $ kubectl apply -n istio-system -f Gateway .yaml
  7. 执行 Gateway 部署的滚动重启:

    1. $ kubectl rollout restart deployment -n istio-system istio-ingressgateway
  8. 验证 Gateway 是 1.8.1 版本并且已经运行:

    1. $ kubectl -n istio-system get pod -l app=istio-ingressgateway --show-labels
    2. NAME READY STATUS RESTARTS AGE LABELS
    3. istio-ingressgateway-66dc957bd8-r2ptn 1/1 Running 0 14m app=istio-ingressgateway,service.istio.io/canonical-revision=1-8-1...
  9. 卸载控制平面:

    1. $ kubectl delete istiooperator -n istio-system control-plane-1-8-0
  10. 验证只有一个版本的 istiod 正在集群中运行:

    1. $ kubectl -n istio-system get pod -l app=istiod
    2. NAME READY STATUS RESTARTS AGE
    3. istiod-1-8-1-65b64fc749-5zq8w 1/1 Running 0 16m