使用 RevisionBased 策略的 Istio

使用 RevisionBased 策略安装 Istio

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

NOTE

你可以使用以下内容了解更新过程。如果集群中已经包含 Istio deployment,则可以跳过此安装。

操作步骤

  1. 通过运行以下命令创建 istio-cniistio-system namespace:

    kubectl create ns istio-cni
    kubectl create ns istio-system
  2. 使用所需版本安装 Istio CNI plugin。以下示例配置会在 istio-cni namespace 中创建一个名为 default 的 IstioCNI resource:

    cat <<EOF | kubectl apply -f -
    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 # /etc/cni/net.d in ACP 4.0
          excludeNamespaces:
            - istio-cni
            - kube-system
    EOF
  3. 使用 RevisionBased 更新策略部署 Istio 控制平面。以下示例配置会在 istio-system namespace 中创建一个名为 defaultIstio resource:

    示例配置

    cat <<EOF | kubectl apply -f -
    apiVersion: sailoperator.io/v1
    kind: Istio
    metadata:
      name: default
    spec:
      namespace: istio-system
      version: v1.26.3
      updateStrategy:
        type: RevisionBased
    EOF
  4. 通过运行以下命令获取 IstioRevision 名称:

    kubectl get istiorevision -n istio-system

    示例输出

    NAME              NAMESPACE      PROFILE   READY   STATUS    IN USE   VERSION   AGE
    default-v1-26-3   istio-system             True    Healthy   False    v1.26.3   4m18s

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

  5. 设置应用 workload 在集群中运行。例如,你可以将 bookinfo 示例应用部署到 bookinfo namespace 中。

    a. 使用以下命令创建 bookinfo namespace:

    kubectl create ns bookinfo

    b. 为 bookinfo namespace 添加 label,以启用自动 sidecar 注入。请使用以下命令:

    # <revision_name> example: default-v1-26-3
    kubectl label namespace bookinfo istio.io/rev=<revision_name>

    c. 执行以下命令,将 bookinfo 应用 pods 部署到 bookinfo namespace 中:

    kubectl -n bookinfo apply -f https://raw.githubusercontent.com/alauda-mesh/istio/refs/heads/istio-1.28/samples/bookinfo/platform/kube/bookinfo.yaml
  6. 使用以下命令检查 Istio resource:

    kubectl get istio -n istio-system

    示例输出

    NAME      NAMESPACE      PROFILE   REVISIONS   READY   IN USE   ACTIVE REVISION   STATUS    VERSION   AGE
    default   istio-system             1           1       1        default-v1-26-3   Healthy   v1.26.3   12m

    在部署应用后,IN USE 字段会显示 1

  7. 通过运行以下命令确认 proxy 版本与控制平面版本一致:

    # <revision_name> example: default-v1-26-3
    istioctl proxy-status --revision <revision_name>

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

    示例输出

    NAME                                        CLUSTER        CDS                LDS                EDS                RDS                ECDS        ISTIOD                                      VERSION
    details-v1-5c89dbb599-t2lg5.bookinfo        Kubernetes     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0
    productpage-v1-f8fdd5649-5hrtj.bookinfo     Kubernetes     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0
    ratings-v1-ccf8bc48c-gzk9k.bookinfo         Kubernetes     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0
    reviews-v1-85dc746bfc-tbjzc.bookinfo        Kubernetes     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0
    reviews-v2-5bd759b4c5-p68cx.bookinfo        Kubernetes     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0
    reviews-v3-55d5b84fb9-8lwqs.bookinfo        Kubernetes     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     SYNCED (1m25s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0

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

使用 RevisionBased 策略更新 Istio 时,你可以一次升级多个 minor version。Alauda Service Mesh v2 Operator 会为 .spec.version 字段的每次变更创建一个新的 IstioRevision resource,并部署对应的控制平面实例。要将 workload 迁移到新的控制平面,请将 namespace 上的 istio.io/rev label 设置为与 IstioRevision resource 名称一致,然后重启这些 workload。

前提条件

  • 你已作为 cluster-admin 登录 Alauda Container Platform web console。
  • 你已部署 Istio,并将 Alauda Service Mesh v2 Operator 升级到提供新目标 Istio 版本的版本。有关更多信息,请参见 Understanding Operator updates and channels
  • 你已安装 Alauda Container Platform Networking for Multus plugin,且 kube-ovn 版本必须为 v4.1.5 或更高。
  • 你已在本地机器上安装 istioctl
  • 你已将 Istio 控制平面配置为使用 RevisionBased 更新策略。在此示例中,名为 defaultIstio resource 部署在 istio-system namespace 中。
  • 你已安装所需版本的 Istio CNI plugin。在此示例中,名为 defaultIstioCNI resource 部署在 istio-cni namespace 中。
  • 你已为 bookinfo namespace 添加 label,以启用 sidecar 注入。
  • 你已在集群中运行 application workloads。在此示例中,bookinfo application 部署在 bookinfo namespace 中。

操作步骤

  1. 修改 Istio resource 中的版本。例如,要更新到 Istio 1.28.6,请通过运行以下命令将 spec.version 字段设置为 v1.28.6

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

    Istio CR 中的版本更新

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

    Service Mesh v2 Operator 会在旧版本控制平面旁边部署一个新版本的控制平面。sidecar 将继续连接到旧控制平面。

  2. 确认 IstioIstioRevision resources 均已使用新 revision 就绪。

    a. 通过运行以下命令确认 Istio resource 已就绪:

    kubectl get istio

    示例输出

    NAME      NAMESPACE      PROFILE   REVISIONS   READY   IN USE   ACTIVE REVISION   STATUS    VERSION   AGE
    default   istio-system             2           2       1        default-v1-28-6   Healthy   v1.28.6   14m

    b. 通过运行以下命令确认 IstioRevision resource 已就绪:

    kubectl get istiorevision

    示例输出

    NAME              NAMESPACE      PROFILE   READY   STATUS    IN USE   VERSION   AGE
    default-v1-26-3   istio-system             True    Healthy   True     v1.26.3   15m
    default-v1-28-6   istio-system             True    Healthy   False    v1.28.6   61s
  3. 通过运行以下命令确认正在运行两个控制平面 pods,每个 revision 一个:

    kubectl get pods -n istio-system

    示例输出

    NAME                                      READY   STATUS    RESTARTS   AGE
    istiod-default-v1-26-3-79c8fddcf7-4lgqh   1/1     Running   0          16m
    istiod-default-v1-28-6-79b66bfb5f-fhvk9   1/1     Running   0          81s
  4. 通过运行以下命令确认 workload sidecar 仍然连接到之前的控制平面:

    # <revision_name> example: default-v1-26-3
    istioctl proxy-status --revision <revision_name>

    示例输出

    NAME                                        CLUSTER        CDS                LDS                EDS                RDS                ECDS        ISTIOD                                      VERSION
    details-v1-5c89dbb599-t2lg5.bookinfo        Kubernetes     SYNCED (3m23s)     SYNCED (3m23s)     SYNCED (3m22s)     SYNCED (3m23s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0
    productpage-v1-f8fdd5649-5hrtj.bookinfo     Kubernetes     SYNCED (3m23s)     SYNCED (3m23s)     SYNCED (3m22s)     SYNCED (3m23s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0
    ratings-v1-ccf8bc48c-gzk9k.bookinfo         Kubernetes     SYNCED (3m23s)     SYNCED (3m23s)     SYNCED (3m22s)     SYNCED (3m23s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0
    reviews-v1-85dc746bfc-tbjzc.bookinfo        Kubernetes     SYNCED (3m23s)     SYNCED (3m23s)     SYNCED (3m22s)     SYNCED (3m23s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0
    reviews-v2-5bd759b4c5-p68cx.bookinfo        Kubernetes     SYNCED (3m23s)     SYNCED (3m23s)     SYNCED (3m22s)     SYNCED (3m23s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0
    reviews-v3-55d5b84fb9-8lwqs.bookinfo        Kubernetes     SYNCED (3m23s)     SYNCED (3m23s)     SYNCED (3m22s)     SYNCED (3m23s)     IGNORED     istiod-default-v1-26-3-79c8fddcf7-4lgqh     1.26.3-asm-r0

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

  5. 将 Istio CNI plugin 更新到与新控制平面 revision 相同的版本。IstioCNI resource 的更新与 Istio resource 独立进行,更新后的 CNI plugin 会在迁移期间继续为两个控制平面 revision 转发流量。有关详细步骤,请参见 The Istio CNI update process

  6. 通过更新应用 namespace 或 pods 上的 istio.io/rev label 为 revision 名称,将 workload 切换到新控制平面。例如,通过运行以下命令更新整个 namespace 的 label:

    # <new_revision_name> example: default-v1-28-6
    kubectl label namespace bookinfo istio.io/rev=<new_revision_name> --overwrite
  7. 通过运行以下命令重启应用 workload,以便注入新版本的 sidecar:

    kubectl rollout restart deployment -n bookinfo

验证

  1. 通过输入以下命令验证正在运行的是新版本的 sidecar:

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

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

  2. 验证旧控制平面、IstioIstioRevision resources 已被删除。

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

    kubectl get pods -n istio-system

    b. 通过运行以下命令验证 Istio resource 已被删除:

    kubectl get istio

    c. 通过运行以下命令验证 IstioRevision resource 已被删除:

    kubectl get istiorevision

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

你可以增加宽限期,以便在删除前一个 revision 之前留出足够时间测试新的控制平面。在金丝雀升级期间设置更高的值,以确保在完全切换之前 workload 保持稳定。

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

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

操作步骤

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

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