使用 RevisionBased 策略和 IstioRevisionTag 的 Istio

使用 RevisionBased 策略和 IstioRevisionTag 安装 Istio

您可以使用 RevisionBased 更新策略安装 Istio 控制平面、IstioRevisionTag 资源、Istio CNI 和 Bookinfo 示例应用。

NOTE

您可以参考以下部分了解更新流程。如果集群中已包含 Istio 部署,则可以跳过此安装步骤。

操作步骤

  1. 运行以下命令创建 istio-cni 和 istio-system 命名空间:

    kubectl create ns istio-cni
    kubectl create ns istio-system
  2. 安装所需版本的 Istio CNI 插件。以下示例配置会在 istio-cni 命名空间中创建一个名为 default 的 IstioCNI 资源:

    cat <<EOF | kubectl apply -f -
    apiVersion: sailoperator.io/v1
    kind: IstioCNI
    metadata:
      name: default
    spec:
      version: v1.28.6
      namespace: istio-cni
      values:
        cni:
          cniConfDir: /etc/cni/multus/net.d
          excludeNamespaces:
            - istio-cni
            - kube-system
    EOF
  3. 使用 RevisionBased 更新策略部署 Istio 控制平面。以下示例配置会在 istio-system 命名空间中创建一个名为 default 的 Istio 资源:

    示例配置

    cat <<EOF | kubectl apply -f -
    apiVersion: sailoperator.io/v1
    kind: Istio
    metadata:
      name: default
    spec:
      version: v1.28.6
      namespace: istio-system
      updateStrategy:
        type: RevisionBased
      values:
        global:
          proxy:
            seccompProfile:
              type: RuntimeDefault
    EOF

    spec.values.global.proxy.seccompProfile 设置可使注入的 sidecar 符合本操作步骤后续在 bookinfo 命名空间中强制执行的 Restricted Pod Security Admission 配置文件。有关详细信息,请参阅 Pod Security Admission。

  4. 为 IstioRevisionTag 创建资源。以下示例 YAML 展示了如何创建一个名为 default 的资源:

    示例配置

    cat <<EOF | kubectl apply -f -
    apiVersion: sailoperator.io/v1
    kind: IstioRevisionTag
    metadata:
      name: default
    spec:
      targetRef:
        kind: Istio
        name: default
    EOF

    确保 targetRef 字段指向正确的 Istio 资源。在提供的示例中,IstioRevisionTag 配置为引用名为 default 的 Istio 资源。

  5. 运行以下命令获取 IstioRevision 名称:

    kubectl get istiorevision -n istio-system

    示例输出

    NAME              NAMESPACE      PROFILE   READY   STATUS    IN USE   VERSION   AGE
    default-v1-28-6   istio-system             True    Healthy   False    v1.28.6   4m18s

    IstioRevision 名称的格式为 <istio_resource_name>-<version>。

  6. 设置应用工作负载,使其在集群中运行。例如,您可以将 bookinfo 示例应用部署到 bookinfo 命名空间中。

    a. 使用以下命令生成 bookinfo 命名空间:

    kubectl create ns bookinfo
    kubectl label namespace bookinfo pod-security.kubernetes.io/enforce=restricted --overwrite

    b. 为 bookinfo 命名空间添加标签,以启用 sidecar 自动注入。使用以下命令:

    kubectl label namespace bookinfo istio-injection=enabled

    c. 运行以下命令,将 bookinfo 应用 Pod 部署到 bookinfo 命名空间中:

    kubectl -n bookinfo apply -f https://raw.githubusercontent.com/alauda-mesh/istio/refs/heads/istio-1.30/samples/bookinfo/platform/kube/bookinfo.yaml
  7. 使用以下命令检查 IstioRevisionTag 资源:

    kubectl get istiorevisiontag

    示例输出

    NAME      STATUS    IN USE   REVISION          AGE
    default   Healthy   True     default-v1-28-6   3m36s

    IN USE 字段显示 True,因为活跃工作负载和 bookinfo 命名空间现在都引用了该标签。

  8. 运行以下命令,确认代理版本与控制平面版本一致:

    # <revision_name> example: default-v1-28-6
    istioctl proxy-status --revision <revision_name>

    VERSION 列应与控制平面版本一致。

    示例输出

    NAME                                         CLUSTER        CDS                LDS                EDS                RDS                ECDS        ISTIOD                                      VERSION
    details-v1-6d47555dc6-zb7q9.bookinfo         Kubernetes     SYNCED (2m14s)     SYNCED (2m14s)     SYNCED (2m14s)     SYNCED (2m14s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0
    productpage-v1-6bc7fbf668-mrhx5.bookinfo     Kubernetes     SYNCED (2m15s)     SYNCED (2m15s)     SYNCED (2m14s)     SYNCED (2m15s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0
    ratings-v1-58c5668d5b-dkbst.bookinfo         Kubernetes     SYNCED (2m14s)     SYNCED (2m14s)     SYNCED (2m14s)     SYNCED (2m14s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0
    reviews-v1-658c4dc7fd-7cwct.bookinfo         Kubernetes     SYNCED (2m14s)     SYNCED (2m14s)     SYNCED (2m14s)     SYNCED (2m14s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0
    reviews-v2-7f5ccbcdc6-8gzf2.bookinfo         Kubernetes     SYNCED (2m17s)     SYNCED (2m17s)     SYNCED (2m14s)     SYNCED (2m17s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0
    reviews-v3-646657847d-79nns.bookinfo         Kubernetes     SYNCED (2m18s)     SYNCED (2m18s)     SYNCED (2m14s)     SYNCED (2m18s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0

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

对于 Istio 的 RevisionBased 更新策略,可以使用 IstioRevisionTag 资源为特定的 IstioRevision 添加标签。这样,无需修改命名空间或 Pod 上的 istio.io/rev 标签,即可将工作负载关联到该修订版本。

前提条件

  • 您已作为 cluster-admin 登录 Alauda Container Platform Web 控制台。
  • 您已部署 Istio,并将 Alauda Service Mesh v2 Operator 升级到提供新目标 Istio 版本的版本。有关详细信息,请参阅了解 Operator 更新和渠道。
  • 您已安装 Alauda Container Platform Multi-Network(之前称为 Alauda Container Platform Networking for Multus)插件,并且 kube-ovn 版本必须为 v4.1.5 或更高版本。
  • 集群运行的 Kubernetes 版本受目标 Istio 版本支持。Istio 1.30 支持 Kubernetes 1.32 至 1.36,Istio 1.28 支持 Kubernetes 1.30 至 1.34,因此,运行 Kubernetes 1.30 或 1.31 的集群必须先升级,然后才能将 Istio 更新到 1.30。
  • 您已在本地计算机上安装 istioctl。
  • 您已将 Istio 控制平面配置为使用 RevisionBased 更新策略。在此示例中,名为 default 的 Istio 资源部署在 istio-system 命名空间中。
  • 您已创建 IstioRevisionTag 资源,其中 targetRef 字段正确指向所需的 Istio 资源。
  • 您已安装所需版本的 Istio CNI 插件。在此示例中,名为 default 的 IstioCNI 资源部署在 istio-cni 命名空间中。
  • 您已为 bookinfo 命名空间添加标签,以启用 sidecar 注入。
  • 集群中正在运行应用工作负载。在此示例中,bookinfo 应用部署在 bookinfo 命名空间中。
  • 您已确认 IstioRevisionTag 资源的 InUse 字段为 true。

操作步骤

  1. 更改 Istio 资源中的版本。例如,若要更新到 Istio 1.30.4,请运行以下命令,将 spec.version 字段设置为 v1.30.4:

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

    Istio CR 中的版本更新

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

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

  2. 确认 Istio 和 IstioRevision 资源均已就绪,并且使用新修订版本。

    a. 运行以下命令,确认 Istio 资源已就绪:

    kubectl get istio

    示例输出

    NAME      NAMESPACE      PROFILE   REVISIONS   READY   IN USE   ACTIVE REVISION   STATUS    VERSION   AGE
    default   istio-system             2           2       2        default-v1-30-4   Healthy   v1.30.4   12m

    b. 运行以下命令,确认 IstioRevision 资源已就绪:

    kubectl get istiorevision

    示例输出

    NAME              NAMESPACE      PROFILE   READY   STATUS    IN USE   VERSION   AGE
    default-v1-28-6   istio-system             True    Healthy   True     v1.28.6   13m
    default-v1-30-4   istio-system             True    Healthy   True     v1.30.4   52s

    c. 运行以下命令,确认 IstioRevisionTag 资源已就绪:

    kubectl get istiorevisiontag

    示例输出

    NAME      STATUS    IN USE   REVISION          AGE
    default   Healthy   True     default-v1-30-4   9m53s
  3. 运行以下命令,确认有两个控制平面 Pod 正在运行,每个修订版本各一个:

    kubectl get pods -n istio-system

    示例输出

    NAME                                      READY   STATUS    RESTARTS   AGE
    istiod-default-v1-28-6-79c8fddcf7-qnfmb   1/1     Running   0          14m
    istiod-default-v1-30-4-79b66bfb5f-2nq6q   1/1     Running   0          108s
  4. 运行以下命令,确认工作负载 sidecar 仍连接到之前的控制平面:

    # <revision_name> example: default-v1-28-6
    istioctl proxy-status --revision <revision_name>

    示例输出

    NAME                                         CLUSTER        CDS               LDS               EDS               RDS               ECDS        ISTIOD                                      VERSION
    details-v1-6d47555dc6-zb7q9.bookinfo         Kubernetes     SYNCED (2m4s)     SYNCED (2m4s)     SYNCED (2m3s)     SYNCED (2m4s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0
    productpage-v1-6bc7fbf668-mrhx5.bookinfo     Kubernetes     SYNCED (2m4s)     SYNCED (2m4s)     SYNCED (2m3s)     SYNCED (2m4s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0
    ratings-v1-58c5668d5b-dkbst.bookinfo         Kubernetes     SYNCED (2m4s)     SYNCED (2m4s)     SYNCED (2m3s)     SYNCED (2m4s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0
    reviews-v1-658c4dc7fd-7cwct.bookinfo         Kubernetes     SYNCED (2m4s)     SYNCED (2m4s)     SYNCED (2m3s)     SYNCED (2m4s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0
    reviews-v2-7f5ccbcdc6-8gzf2.bookinfo         Kubernetes     SYNCED (2m4s)     SYNCED (2m4s)     SYNCED (2m3s)     SYNCED (2m4s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0
    reviews-v3-646657847d-79nns.bookinfo         Kubernetes     SYNCED (2m4s)     SYNCED (2m4s)     SYNCED (2m3s)     SYNCED (2m4s)     IGNORED     istiod-default-v1-28-6-79c8fddcf7-qnfmb     1.28.6-asm-r0

    VERSION 列应与旧控制平面版本一致。

  5. 将 Istio CNI 插件更新到与新控制平面修订版本相同的版本。IstioCNI 资源独立于 Istio 资源更新;迁移期间,更新后的 CNI 插件会继续为两个控制平面修订版本重定向流量。有关详细操作步骤,请参阅 Istio CNI 更新流程。

  6. 运行以下命令,重启应用工作负载,以注入新版 sidecar:

    kubectl rollout restart deployment -n bookinfo

验证

  1. 运行以下命令,验证新版 sidecar 正在运行:

    # <new_revision_name> example: default-v1-30-4
    istioctl proxy-status --revision <new_revision_name>

    VERSION 列应与新控制平面版本一致。

  2. 验证旧控制平面以及 Istio 和 IstioRevision 资源已删除。

    a. 运行以下命令,验证旧控制平面已删除:

    kubectl get pods -n istio-system

    b. 运行以下命令,验证 Istio 资源已删除:

    kubectl get istio

    c. 运行以下命令,验证 IstioRevision 资源已删除:

    kubectl get istiorevision

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

您可以延长宽限期,以便在移除之前的修订版本前留出充足时间测试新控制平面。在金丝雀升级期间设置较长的宽限期,确保工作负载稳定后再完成迁移。

从开发环境中移除 RevisionBased 更新资源

完成验证和试验后,应移除 RevisionBased 更新配置和 IstioRevisionTag 资源,以清理开发环境并释放资源。

操作步骤

执行以下命令以移除所有 Istio 组件和示例应用:

kubectl delete istiorevisiontag/default
kubectl delete istio/default istiocni/default
kubectl delete ns/bookinfo
kubectl delete ns/istio-system ns/istio-cni