使用 InPlace 策略进行更新

InPlace 更新策略每次仅运行一个控制平面版本。更新期间,所有工作负载都会立即连接到新的控制平面版本。为保持 sidecar 与控制平面之间的兼容性,每次只能升级一个次要版本。

InPlace 策略会原地更新并重启现有 Istio 控制平面。在此过程中,控制平面仅有一个实例,因此无需将工作负载迁移到新的控制平面实例。要完成更新,请重启原生应用工作负载和网关,以刷新 Envoy 代理。

虽然 InPlace 策略简单高效,但如果工作负载 Pod 在控制平面重启期间更新、重启或扩缩,原生应用流量仍有轻微中断的可能。运行多个 Istio 控制平面(istiod)副本可以降低此风险。

选择 InPlace 策略

要选择 InPlace 策略,请将 Istio 资源中的 spec.updateStrategy.type 值设为 InPlace。

选择 InPlace 更新策略的示例规格

kind: Istio
spec:
  updateStrategy:
    type: InPlace

创建资源时可以设置此值,也可以稍后编辑。如果在创建资源后进行编辑,请在更新 Istio 控制平面之前完成更改。

为尽可能减少更新期间的流量中断,可以在高可用性(HA)模式下运行 Istio 控制平面,这需要对 Istio 资源进行一些额外配置。有关详细信息,请参阅 Istio 高可用性。

使用 InPlace 更新策略进行安装

可以使用 InPlace 更新策略安装 Istio 控制平面、Istio CNI 和 Bookinfo 演示原生应用。

NOTE

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

使用 InPlace 策略时,Alauda Service Mesh v2 Operator 创建的 IstioRevision 资源始终与其父级 Istio 资源同名。

操作步骤

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

    kubectl create ns istio-cni
    kubectl create ns istio-system
  2. 将工作负载关联到使用 InPlace 策略部署的控制平面:

    • 运行以下命令,为命名空间添加标签以自动包含所有工作负载:

      kubectl label namespace <namespace_name> istio.io/rev=<revision_name>
    • 修改 Deployment 资源中的 Pod 模板,为各个工作负载应用修订版本标签。例如:

      apiVersion: apps/v1
      kind: Deployment
      spec:
        template:
          metadata:
            labels:
              istio.io/rev: <revision_name>
  3. 如果修订版本名称为 default,请运行以下命令将工作负载关联到该修订版本。以下示例为命名空间添加 istio-injection: enabled 标签。

    kubectl label namespace <namespace_name> istio-injection=enabled
  4. 安装所需版本的 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
  5. 使用 InPlace 更新策略部署 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: InPlace
      values:
        global:
          proxy:
            seccompProfile:
              type: RuntimeDefault
    EOF

    spec.values.global.proxy.seccompProfile 设置可使注入的 sidecar 满足本操作步骤后续将对 bookinfo 命名空间强制执行的 Restricted Pod 安全准入配置文件。有关详细信息,请参阅 Pod 安全准入。

  6. 运行以下命令,等待 Istio 控制平面就绪:

    kubectl wait --for condition=Ready istio/default --timeout=3m
  7. 设置原生应用工作负载,以便在集群中运行。例如,可以将 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
  8. 运行以下命令检查 Istio 资源:

    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           Healthy   v1.28.6   6m3s

    IN USE 列中的值 1 表示 IstioRevision 资源同时被命名空间上的标签和注入的 sidecar 代理引用。

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

使用 InPlace 策略更新 Istio 时,每次只能将版本提升一个次要版本。若要跨越多个次要版本进行更新,则必须每次提升一个版本,并在每次更新后重启工作负载。重启工作负载可确保 sidecar 与控制平面版本之间的兼容性。重启所有工作负载后,更新过程即完成。

先决条件

  • 您已以 cluster-admin 身份登录 Alauda Container Platform Web 控制台。
  • 您已安装 Alauda Container Platform Multi-Network(之前称为 Alauda Container Platform Networking for Multus)插件,并且 kube-ovn 必须为 v4.1.5 或更高版本。
  • 您已部署 Istio,并将 Alauda Service Mesh v2 Operator 升级到提供新目标 Istio 版本的版本。有关更多信息,请参阅了解 Operator 更新和频道。
  • 集群运行的 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 控制平面配置为使用 InPlace 更新策略。在此示例中,名为 default 的 Istio 资源部署在 istio-system 命名空间中。
  • 您已安装所需版本的 Istio CNI 插件。在此示例中,名为 default 的 IstioCNI 资源部署在 istio-cni 命名空间中。
  • 您已为 bookinfo 命名空间添加标签,以启用 sidecar 注入。
  • 集群中正在运行应用工作负载。在此示例中,bookinfo 应用部署在 bookinfo 命名空间中。

操作步骤

  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: InPlace

    Service Mesh v2 Operator 会部署新版本的控制平面,以替换旧版本的控制平面。sidecar 会自动重新连接到新控制平面。

  2. 运行以下命令,等待 Istio 控制平面就绪:

    kubectl wait --for condition=Ready istio/default --timeout=3m
  3. 运行以下命令,确认新版本的控制平面已就绪:

    kubectl get istio

    示例输出

    NAME      NAMESPACE      PROFILE   REVISIONS   READY   IN USE   ACTIVE REVISION   STATUS    VERSION   AGE
    default   istio-system             1           1       1        default           Healthy   v1.30.4   18m5s
  4. 将 Istio CNI 插件更新到与控制平面相同的版本。IstioCNI 资源独立于 Istio 资源进行更新,因此更改控制平面版本不会自动更新 CNI 插件。有关详细步骤,请参阅 Istio CNI 更新过程。

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

    kubectl rollout restart deployment -n bookinfo

验证

运行以下命令,验证新版本的 sidecar 是否正在运行:

istioctl proxy-status

示例输出

NAME                                        CLUSTER        CDS              LDS              EDS              RDS              ECDS        ISTIOD                      VERSION
details-v1-5c89dbb599-4t927.bookinfo        Kubernetes     SYNCED (92s)     SYNCED (92s)     SYNCED (85s)     SYNCED (92s)     IGNORED     istiod-57559f96c4-v2h9g     1.30.4-asm-r0
productpage-v1-f8fdd5649-xmxkt.bookinfo     Kubernetes     SYNCED (92s)     SYNCED (92s)     SYNCED (85s)     SYNCED (92s)     IGNORED     istiod-57559f96c4-v2h9g     1.30.4-asm-r0
ratings-v1-ccf8bc48c-766tl.bookinfo         Kubernetes     SYNCED (93s)     SYNCED (93s)     SYNCED (85s)     SYNCED (93s)     IGNORED     istiod-57559f96c4-v2h9g     1.30.4-asm-r0
reviews-v1-85dc746bfc-gsf6l.bookinfo        Kubernetes     SYNCED (92s)     SYNCED (92s)     SYNCED (85s)     SYNCED (92s)     IGNORED     istiod-57559f96c4-v2h9g     1.30.4-asm-r0
reviews-v2-5bd759b4c5-nkb62.bookinfo        Kubernetes     SYNCED (93s)     SYNCED (93s)     SYNCED (85s)     SYNCED (93s)     IGNORED     istiod-57559f96c4-v2h9g     1.30.4-asm-r0
reviews-v3-55d5b84fb9-wq9ds.bookinfo        Kubernetes     SYNCED (94s)     SYNCED (94s)     SYNCED (85s)     SYNCED (94s)     IGNORED     istiod-57559f96c4-v2h9g     1.30.4-asm-r0

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

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

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

操作步骤

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

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