使用 Helm 升级

请参阅本指南使用 Helm 升级和配置 Istio 网格。 本指南假设您已经使用 Helm 安装了 Istio 的前一个次要版本或补丁版本。

本指南中使用的 baseistiod 的 Helm Chart 与通过 Istioctl 安装 Istio 时使用的相同。 但是,通过 Istioctl 安装使用的网关 Chart 与本指南中描述的 Chart 不同

先决条件

  1. 执行任何必要的特定于平台的设置

  2. 检查 Pod 和服务的要求

  3. 安装 Helm 客户端 3.6 或更高的版本。

  4. 配置 Helm 存储库:

  1. $ helm repo add istio https://istio-release.storage.googleapis.com/charts
  2. $ helm repo update

升级步骤

升级 Istio 之前,推荐运行 istioctl x precheck 命令以确保升级能与您的环境兼容。

  1. $ istioctl x precheck
  2. No issues found when checking the cluster. Istio is safe to install or upgrade!
  3. To get started, check out <https://istio.io/latest/docs/setup/getting-started/>

金丝雀升级(推荐)

您可以使用以下步骤,安装金丝雀版本的 Istio 控制平面来校验新版本是否与您现有的配置和数据平面兼容:

请注意,当您安装一个金丝雀版本的 istiod 服务时,可以在主要安装和金丝雀安装之间共享来自 Base Chart 的底层集群范围资源。

如果通过 Helm 从 Istio 1.23 或更早版本升级 CRD,可能会遇到如下错误

Error: rendered manifests contain a resource that already exists. Unable to continue with update: CustomResourceDefinition "wasmplugins.extensions.istio.io" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata

您可以使用以下 kubectl 命令通过一次性迁移解决此问题:

  1. $ for crd in $(kubectl get crds -l chart=istio -o name && kubectl get crds -l app.kubernetes.io/part-of=istio -o name)
  2. $ do
  3. $ kubectl label "$crd" "app.kubernetes.io/managed-by=Helm"
  4. $ kubectl annotate "$crd" "meta.helm.sh/release-name=istio-base" # 如果与文档默认值不同,请用实际的 Helm 版本名称替换
  5. $ kubectl annotate "$crd" "meta.helm.sh/release-namespace=istio-system" # 用实际的 istio 命名空间替换
  6. $ done
  1. 升级 Istio Base Chart,以确保所有集群范围的资源都是最新的:

    1. $ helm upgrade istio-base istio/base -n istio-system
  2. 通过设置修订版的值来安装金丝雀版本的 Istio 发现 Chart:

    1. $ helm install istiod-canary istio/istiod \
    2. --set revision=canary \
    3. -n istio-system
  3. 验证您已经将两个 istiod 版本安装到了您的集群中:

    1. $ kubectl get pods -l app=istiod -L istio.io/rev -n istio-system
    2. NAME READY STATUS RESTARTS AGE REV
    3. istiod-5649c48ddc-dlkh8 1/1 Running 0 71m default
    4. istiod-canary-9cc9fd96f-jpc7n 1/1 Running 0 34m canary
  4. 如果您正在使用 Istio Gateway, 可通过设置 revision 的值来安装金丝雀修订版的 Gateway Chart:

    1. $ helm install istio-ingress-canary istio/gateway \
    2. --set revision=canary \
    3. -n istio-ingress
  5. 验证您已将两个 istio-ingress gateway 版本安装到了集群中:

    1. $ kubectl get pods -L istio.io/rev -n istio-ingress
    2. NAME READY STATUS RESTARTS AGE REV
    3. istio-ingress-754f55f7f6-6zg8n 1/1 Running 0 5m22s default
    4. istio-ingress-canary-5d649bd644-4m8lp 1/1 Running 0 3m24s canary

    参见升级 Gateway了解有关 Gateway 金丝雀升级的深度解析文档。

  6. 遵循此处的步骤来测试和迁移现有工作负载,以使用金丝雀控制平面。

  7. 一旦您已验证并迁移工作负载以使用金丝雀控制平面,您就可以卸载旧的控制平面:

    1. $ helm delete istiod -n istio-system
  8. 再次升级 Istio Base Chart,这次将新的 canary 修订版本设为集群范围的默认版本。

    1. $ helm upgrade istio-base istio/base --set defaultRevision=canary -n istio-system

稳定修订标签(实验特性)

在将命名空间移动到新版本时,手动的重新标记命名空间可能既乏味又容易出错。 修订标签解决了这个问题。 修订标签是指向修订的稳定标识符,可用于避免重新标记命名空间。 网格管理员可以简单地更改标签以指向新的修订版,而不是重新标记命名空间。所有标有该标签的命名空间将同时更新。

用法

考虑到一个安装了 1-23-11-24-0 两个修订版本的集群。集群管理员创建了一个 prod-stable 修订标签, 以指向较旧的 1-23-1 稳定版本,并创建一个 prod-canary 修订标签,用以指向较新的 1-24-0 修订版本。 可以通过以下命令达到该状态:

  1. $ helm template istiod istio/istiod -s templates/revision-tags.yaml --set revisionTags="{prod-stable}" --set revision=1-23-1 -n istio-system | kubectl apply -f -
  2. $ helm template istiod istio/istiod -s templates/revision-tags.yaml --set revisionTags="{prod-canary}" --set revision=1-24-0 -n istio-system | kubectl apply -f -

这些命令将在您的集群中创建新的 MutatingWebhookConfiguration 资源,由于是通过 kubectl 手动应用这些模板, 所以这些资源不属于任何 Helm Chart。参见以下指示说明来卸载修订标记。

修订、标签和命名空间之间的结果映射如下所示:

两个命名空间指向了 prod-stable 而一个指向了 prod-canary
两个命名空间指向了 prod-stable 而一个指向了 prod-canary

除了标记的命名空间之外,集群管理员还可以通过以下 istioctl tag list 命令查看此映射:

  1. $ istioctl tag list
  2. TAG REVISION NAMESPACES
  3. default 1-23-1 ...
  4. prod-canary 1-24-0 ...
  5. prod-stable 1-23-1 ...

当集群管理员对标记为 prod-canary 的控制面、命名空间的稳定性感到满意后, istio.io/rev=prod-stable 可以通过修改 prod-stable 修订标记来更新, 以指向更新的 1-24-0 修订版本。

  1. $ helm template istiod istio/istiod -s templates/revision-tags.yaml --set revisionTags="{prod-stable}" --set revision=1-24-0 -n istio-system | kubectl apply -f -

现在,修订版、标记和命名空间之间更新后的映射关系如下所示:

命名空间标签没有变化,但现在所有命名空间都指向 {{< istio_full_version_revision >}}
命名空间标签没有变化,但现在所有命名空间都指向 {{< istio_full_version_revision >}}

当在带有 prod-stable 标签的命名空间中重新启动注入工作负载,将导致这些工作负载使用 1-24-0 控制平面。 请注意,将工作负载迁移到新版本时不需要重新标记命名空间。

默认标记

标签 default 指向的修订版本被认为是默认的修订版本,并具有额外的语义含义。 默认版本的功能如下:

  • istio-injection=enabled 命名空间选择器、sidecar.istio.io/inject=true 对象选择器和 istio.io/rev=default 选择器注入 Sidecar。
  • 验证 Istio 资源。
  • 从非默认的修订版本中窃取 leader 锁并执行单例网格任务(例如更新资源状态)。

要将修订版本 1-24-0 设为默认版本,请运行以下命令:

  1. $ helm template istiod istio/istiod -s templates/revision-tags.yaml --set revisionTags="{default}" --set revision=1-24-0 -n istio-system | kubectl apply -f -

当使用 default 标签和现有的未修订版本的 Istio 安装方式一起使用时, 建议删除旧的 MutatingWebhookConfiguration(通常称为 istio-sidecar-injector), 以避免新旧控制平面同时尝试注入。

原地升级

您可以使用 Helm 升级工作流在您的集群中对 Istio 执行原地升级。

将您的重载值文件或自定义选项添加到以下命令,以在 Helm 升级期间保留您的自定义配置。

如果通过 Helm 从 Istio 1.23 或更早版本升级 CRD,可能会遇到如下错误

Error: rendered manifests contain a resource that already exists. Unable to continue with update: CustomResourceDefinition "wasmplugins.extensions.istio.io" in namespace "" exists and cannot be imported into the current release: invalid ownership metadata

您可以使用以下 kubectl 命令通过一次性迁移解决此问题:

  1. $ for crd in $(kubectl get crds -l chart=istio -o name && kubectl get crds -l app.kubernetes.io/part-of=istio -o name)
  2. $ do
  3. $ kubectl label "$crd" "app.kubernetes.io/managed-by=Helm"
  4. $ kubectl annotate "$crd" "meta.helm.sh/release-name=istio-base" # 如果与文档默认值不同,请用实际的 Helm 版本名称替换
  5. $ kubectl annotate "$crd" "meta.helm.sh/release-namespace=istio-system" # 用实际的 istio 命名空间替换
  6. $ done
  1. 升级 Istio Base Chart:

    1. $ helm upgrade istio-base istio/base -n istio-system
  2. 升级 Istio discovery chart:

    1. $ helm upgrade istiod istio/istiod -n istio-system
  3. (可选)升级集群中安装的 gateway chart:

    1. $ helm upgrade istio-ingress istio/gateway -n istio-ingress

卸载

请参阅 Helm 安装指南中的卸载章节。