使用 InPlace 策略更新

InPlace 更新策略一次仅运行一个 control plane 修订版本。在更新过程中,所有工作负载会立即连接到新的 control plane 版本。为了保持 sidecar 与 control plane 之间的兼容性,您每次只能升级一个 minor 版本。

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

虽然 InPlace 策略具有简洁和高效的优点,但如果在 control plane 重启期间某个工作负载 Pod 发生更新、重启或扩缩容,应用流量可能会有轻微中断的风险。您可以通过以多个副本运行 Istio control plane(istiod)来降低这一风险。

选择 InPlace 策略

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

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

kind: Istio
spec:
  updateStrategy:
    type: InPlace

您可以在创建资源时设置此值,也可以稍后再编辑。如果您在创建后编辑该资源,请在更新 Istio control plane 之前完成更改。

要尽量减少更新期间的流量中断,您可以以 High Availability(HA)模式运行 Istio control plane,这需要在 Istio 资源中进行一些额外配置。有关详细信息,请参见 Istio High Availability

使用 InPlace 更新策略安装

您可以使用 InPlace 更新策略安装 Istio control plane、Istio CNI 以及 Bookinfo 示例原生应用。

NOTE

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

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

操作步骤

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

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

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

      kubectl label namespace <namespace_name> istio.io/rev=<revision_name>
    • 通过修改 Deployment 资源中的 pod 模板,将 revision 标签应用到单个工作负载。例如:

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

    kubectl label namespace <namespace_name> istio-injection=enabled
  4. 使用所需版本安装 Istio CNI 插件。以下示例配置会在 istio-cni 命名空间中创建一个名为 defaultIstioCNI 资源:

    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
  5. 使用 InPlace 更新策略部署 Istio control plane。以下示例配置会在 istio-system 命名空间中创建一个名为 defaultIstio 资源:

    示例配置

    cat <<EOF | kubectl apply -f -
    apiVersion: sailoperator.io/v1
    kind: Istio
    metadata:
      name: default
    spec:
      namespace: istio-system
      version: v1.26.3
      updateStrategy:
        type: InPlace
    EOF
  6. 通过运行以下命令等待 Istio control plane 就绪:

    kubectl wait --for condition=Ready istio/default --timeout=3m
  7. 配置要在集群中运行的原生应用工作负载。例如,您可以将 bookinfo 示例原生应用部署到 bookinfo 命名空间中。

    a. 使用以下命令创建 bookinfo 命名空间:

    kubectl create ns bookinfo

    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.28/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.26.3   6m3s

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

使用 InPlace 策略更新 Istio control plane

使用 InPlace 策略更新 Istio 时,每次只能升级一个 minor 版本。若要跨多个 minor 版本更新,必须在每次更新后递增版本并重启工作负载。重启工作负载可确保 sidecar 与 control plane 版本兼容。更新流程会在重启所有工作负载后完成。

前提条件

  • 您已以 cluster-admin 身份登录 Alauda Container Platform Web 控制台。
  • 您已安装 Alauda Container Platform Networking for Multus 插件,并且 kube-ovn 必须为 v4.1.5 或更高版本。
  • 您已部署 Istio,并已将 Alauda Service Mesh v2 Operator 升级到提供新目标 Istio 版本的版本。有关详细信息,请参见 理解 Operator 更新和通道
  • 您已在本地机器上安装 istioctl
  • 您已将 Istio control plane 配置为使用 InPlace 更新策略。在本示例中,名为 defaultIstio 资源部署在 istio-system 命名空间中。
  • 您已使用所需版本安装 Istio CNI 插件。在本示例中,名为 defaultIstioCNI 资源部署在 istio-cni 命名空间中。
  • 您已为 bookinfo 命名空间添加标签,以启用 sidecar 注入。
  • 您的集群中正在运行应用工作负载。在本示例中,bookinfo 应用部署在 bookinfo 命名空间中。

操作步骤

  1. 更改 Istio 资源中的版本。例如,要更新到 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: InPlace

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

  2. 通过运行以下命令等待 Istio control plane 就绪:

    kubectl wait --for condition=Ready istio/default --timeout=3m
  3. 通过运行以下命令确认新的 control plane 版本已就绪:

    kubectl get istio

    示例输出

    NAME      NAMESPACE      PROFILE   REVISIONS   READY   IN USE   ACTIVE REVISION   STATUS    VERSION   AGE
    default   istio-system             1           1       1        default           Healthy   v1.28.6   18m5s
  4. 将 Istio CNI 插件更新为与 control plane 相同的版本。IstioCNI 资源是独立于 Istio 资源更新的,因此更改 control plane 版本不会自动更新 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.28.6-asm-r0
productpage-v1-f8fdd5649-xmxkt.bookinfo     Kubernetes     SYNCED (92s)     SYNCED (92s)     SYNCED (85s)     SYNCED (92s)     IGNORED     istiod-57559f96c4-v2h9g     1.28.6-asm-r0
ratings-v1-ccf8bc48c-766tl.bookinfo         Kubernetes     SYNCED (93s)     SYNCED (93s)     SYNCED (85s)     SYNCED (93s)     IGNORED     istiod-57559f96c4-v2h9g     1.28.6-asm-r0
reviews-v1-85dc746bfc-gsf6l.bookinfo        Kubernetes     SYNCED (92s)     SYNCED (92s)     SYNCED (85s)     SYNCED (92s)     IGNORED     istiod-57559f96c4-v2h9g     1.28.6-asm-r0
reviews-v2-5bd759b4c5-nkb62.bookinfo        Kubernetes     SYNCED (93s)     SYNCED (93s)     SYNCED (85s)     SYNCED (93s)     IGNORED     istiod-57559f96c4-v2h9g     1.28.6-asm-r0
reviews-v3-55d5b84fb9-wq9ds.bookinfo        Kubernetes     SYNCED (94s)     SYNCED (94s)     SYNCED (85s)     SYNCED (94s)     IGNORED     istiod-57559f96c4-v2h9g     1.28.6-asm-r0

VERSION 列应与新的 control plane 版本一致。

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

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

操作步骤

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

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