关于 RevisionBased 策略

RevisionBased 策略在升级过程中会同时运行两个控制平面版本。该方法支持将工作负载逐步从旧控制平面迁移到新控制平面,从而实现金丝雀升级。它还支持跨多个次版本的升级。

RevisionBased 策略会为每次 spec.version 字段的变更创建一个新的 Istio 控制平面实例。现有的控制平面会保持活动状态,直到所有工作负载都迁移到新的实例。您可以通过更新 istio.io/rev 标签或使用 IstioRevisionTag 资源,然后重启工作负载,将其迁移到新的控制平面。

尽管 RevisionBased 策略涉及额外的步骤,并且在升级期间需要多个控制平面实例同时运行,但它允许工作负载逐步迁移。这种方法可以在迁移剩余工作负载之前,先用部分工作负载验证更新后的控制平面,适用于具有关键任务工作负载的大型网格。

目录

选择 RevisionBased 策略

要使用 RevisionBased 策略部署 Istio,请创建 Istio 资源,并将 spec.updateStrategy 设置为以下值:

选择 RevisionBased 策略的示例规范

kind: Istio
spec:
  version: v1.26.3
  updateStrategy:
    type: RevisionBased

选择该策略后,Operator 会创建一个名为 <istio_resource_name>-<version> 的新的 IstioRevision 资源。

使用 RevisionBased 策略安装 Istio

您可以使用 RevisionBased 更新策略安装 Istio 控制平面、Istio CNI 以及 Bookinfo 演示应用。

NOTE

您可以通过以下章节了解更新过程。如果集群中已部署 Istio,则可以跳过此安装步骤。

操作步骤

  1. 通过以下命令创建 istio-system 命名空间:

    kubectl create ns istio-system
  2. 使用 RevisionBased 更新策略部署 Istio 控制平面。以下示例配置在 istio-system 命名空间中创建名为 defaultIstio 资源:

    示例配置

    apiVersion: sailoperator.io/v1
    kind: Istio
    metadata:
      name: default
    spec:
      namespace: istio-system
      version: v1.26.3
      updateStrategy:
        type: RevisionBased
  3. 安装所需版本的 Istio CNI 插件。以下示例配置在 istio-cni 命名空间中创建名为 defaultIstioCNI 资源:

    apiVersion: sailoperator.io/v1
    kind: IstioCNI
    metadata:
      name: default
    spec:
      version: v1.26.3
      namespace: istio-cni
      values:
        cni:
          cniConfDir: /etc/cni/multus/net.d # ACP 4.0 中为 /etc/cni/net.d
          excludeNamespaces:
            - istio-cni
            - kube-system
  4. 通过以下命令获取 IstioRevision 名称:

    kubectl get istiorevision -n istio-system

    示例输出

    NAME              TYPE    READY   STATUS    IN USE   VERSION   AGE
    default-v1-26-3   Local   True    Healthy   False    v1.26.3   3m4s

使用 RevisionBased 策略更新 Istio 控制平面

使用 RevisionBased 策略更新 Istio 时,可以一次升级多个次版本。Alauda Service Mesh v2 Operator 会为每次 .spec.version 字段的变更创建新的 IstioRevision 资源,并部署对应的控制平面实例。要将工作负载迁移到新的控制平面,请将命名空间上的 istio.io/rev 标签设置为对应的 IstioRevision 资源名称,然后重启工作负载。

前提条件

  • 您已以 cluster-admin 身份登录 Alauda Container Platform Web 控制台。
  • 已安装 Alauda Service Mesh v2 Operator 并部署 Istio。
  • 已安装 Alauda Container Platform Networking for Multus 插件。
  • 已在本地机器上安装 istioctl
  • 已将 Istio 控制平面配置为使用 RevisionBased 更新策略。本示例中,Istio 资源名为 default,部署在 istio-system 命名空间。
  • 已安装所需版本的 Istio CNI 插件。本示例中,IstioCNI 资源名为 default,部署在 istio-cni 命名空间。
  • 已为 bookinfo 命名空间打上标签以启用 sidecar 注入。
  • 集群中已有运行的应用工作负载。本示例中,bookinfo 应用部署在 bookinfo 命名空间。

操作步骤

  1. 修改 Istio 资源中的版本。例如,要更新到 Istio 1.26.3,通过以下命令将 spec.version 字段设置为 v1.26.3

    kubectl patch istio default --type='merge' -p '{"spec":{"version":"v1.26.3"}}'

    Istio CR 中的版本更新

    kind: Istio
    spec:
      version: v1.26.3
      updateStrategy:
        type: RevisionBased

    Service Mesh v2 Operator 会在旧版本控制平面旁边部署新版本控制平面。sidecar 仍然连接到旧控制平面。

  2. 确认新的修订版本的 IstioIstioRevision 资源均已就绪。

    1. 通过以下命令确认 Istio 资源已就绪:

      kubectl get istio

      示例输出

      NAME      REVISIONS   READY   IN USE   ACTIVE REVISION   STATUS    VERSION   AGE
      default   2           2       1        default-v1-2-6   Healthy   v1.26.3   9m23s
    2. 通过以下命令确认 IstioRevision 资源已就绪:

      kubectl get istiorevision

      示例输出

      NAME              TYPE    READY   STATUS    IN USE   VERSION   AGE
      default-v1-24-6   Local   True    Healthy   True     v1.24.6   10m
      default-v1-26-3   Local   True    Healthy   False    v1.26.3   66s
  3. 通过以下命令确认有两个控制平面 Pod 正在运行,分别对应两个修订版本:

    kubectl get pods -n istio-system

    示例输出

    NAME                                      READY   STATUS    RESTARTS   AGE
    istiod-default-v1-24-6-c98fd9675-r7bfw    1/1     Running   0          10m
    istiod-default-v1-26-3-7495cdc7bf-v8t4g   1/1     Running   0          113s
  4. 通过以下命令确认工作负载 sidecar 仍连接到旧控制平面:

    istioctl proxy-status

    示例输出

    NAME                                                    CLUSTER        CDS                LDS                EDS                RDS                ECDS        ISTIOD                                     VERSION
    details-v1-7d775cb4f6-5t9zm.bookinfo                    Kubernetes     SYNCED (2m25s)     SYNCED (2m25s)     SYNCED (2m17s)     SYNCED (2m25s)     IGNORED     istiod-default-v1-24-5-c98fd9675-r7bfw     1.24.5
    productpage-v1-7c4b6b857-mxrw6.bookinfo                 Kubernetes     SYNCED (2m35s)     SYNCED (2m35s)     SYNCED (2m17s)     SYNCED (2m35s)     IGNORED     istiod-default-v1-24-5-c98fd9675-r7bfw     1.24.5
    ratings-v1-5b896f8544-r552l.bookinfo                    Kubernetes     SYNCED (2m21s)     SYNCED (2m21s)     SYNCED (2m17s)     SYNCED (2m21s)     IGNORED     istiod-default-v1-24-5-c98fd9675-r7bfw     1.24.5
    reviews-v1-746f96c9d4-9pw8k.bookinfo                    Kubernetes     SYNCED (2m17s)     SYNCED (2m17s)     SYNCED (2m17s)     SYNCED (2m17s)     IGNORED     istiod-default-v1-24-5-c98fd9675-r7bfw     1.24.5
    reviews-v2-97bdf5876-4mzx5.bookinfo                     Kubernetes     SYNCED (2m35s)     SYNCED (2m35s)     SYNCED (2m17s)     SYNCED (2m35s)     IGNORED     istiod-default-v1-24-5-c98fd9675-r7bfw     1.24.5
    reviews-v3-77d9db6844-djgjk.bookinfo                    Kubernetes     SYNCED (2m19s)     SYNCED (2m19s)     SYNCED (2m17s)     SYNCED (2m19s)     IGNORED     istiod-default-v1-24-5-c98fd9675-r7bfw     1.24.5

    VERSION 列应与旧控制平面版本匹配。

  5. 通过更新应用命名空间或 Pod 上的 istio.io/rev 标签为新修订名称,将工作负载迁移到新控制平面。例如,更新整个命名空间的标签:

    kubectl label namespace bookinfo istio.io/rev=<new_revision_name> --overwrite
  6. 重启应用工作负载,使新版本的 sidecar 被注入:

    kubectl rollout restart deployment -n bookinfo

验证

  1. 通过以下命令验证新版本的 sidecar 是否运行:

    istioctl proxy-status

    VERSION 列应与新控制平面版本匹配。

  2. 验证旧控制平面、IstioIstioRevision 资源是否已被删除。

    1. 通过以下命令验证旧控制平面是否已删除。

    2. 通过以下命令验证 Istio 资源是否已删除:

      kubectl get istio
    3. 通过以下命令验证 IstioRevision 资源是否已删除:

      kubectl get istiorevision

Alauda Service Mesh v2 Operator 会在 spec.updateStrategy.inactiveRevisionDeletionGracePeriodSeconds 字段定义的宽限期过后,删除旧的 IstioRevision 资源及其关联的控制平面。默认宽限期为 30 秒。

您可以增加宽限期,以便在移除旧版本之前有足够时间测试新控制平面。在金丝雀升级期间,设置更长的宽限期以确保工作负载稳定后再完全切换。