升级步骤

本页介绍如何将现有的 Istio 部署(包括控制平面和 sidecar 代理)升级到新版本。升级过程可能涉及新的二进制文件以及配置和 API schemas 等其他更改。升级过程可能导致一些服务停机。为了最大限度地减少停机时间,请使用多副本以保证 Istio 控制平面组件和应用程序具有高可用性。

在下面的步骤中,我们假设 Istio 组件在 istio-system namespace 中安装和升级。

将部署升级到 Istio 1.1 前您一定要先看看升级通知 的简明事项列表。

升级步骤

控制平面升级

使用 Tiller 升级 CRD 时,Helm 存在严重问题。我们相信我们已经通过引入 istio-init chart 解决了这些问题。但是,由于以前的 Istio 部署中使用的 Helm 和 Tiller 版本种类繁多,从 2.7.2 到 2.12.2,我们建议大家谨慎操作切忌在继续升级之前一定要备份好自定义资源数据:

  1. $ kubectl get crds | grep 'istio.io\|certmanager.k8s.io' | cut -f1-1 -d "." | \
  2. xargs -n1 -i sh -c "kubectl get --all-namespaces -oyaml {}; echo ---" > $HOME/ISTIO_1_0_RESTORE_CRD_DATA.yaml

Istio 控制平面组件包括:Citadel、Ingress 网关、Egress 网关、Pilot、Policy、Telemetry 和 Sidecar 注入器。我们可以使用 Kubernetes 的滚动更新机制来升级控制平面组件。

您可以使用 Kubernetes 的滚动更新机制来升级控制平面组件。这适用于使用 kubectl apply 部署 Istio 组件的情况,包括使用 helm template 生成的配置。

  • 使用 kubectl apply 升级 Istio 所有的 CRD。稍微等待几秒钟,让 Kubernetes API 服务器接收升级后的 CRD:
  1. $ for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done
  • 例如,将 Istio 的核心组件添加到 Kubernetes 的清单文件中。
  1. $ helm template install/kubernetes/helm/istio --name istio \
  2. --namespace istio-system > $HOME/istio.yaml

如果要启用 全局双向 TLS,请将 global.mtls.enabledglobal.controlPlaneSecurityEnabled 设置为 true 以获取最后一个命令:

  1. $ helm template install/kubernetes/helm/istio --name istio --namespace istio-system \
  2. --set global.mtls.enabled=true --set global.controlPlaneSecurityEnabled=true > $HOME/istio-auth.yaml

如果使用 1.9 之前的 Kubernetes 版本,则应添加 —set sidecarInjectorWebhook.enabled=false

  • 通过清单升级 Istio 控制平面组件,例如:
  1. $ kubectl apply -f $HOME/istio.yaml

  1. $ kubectl apply -f $HOME/istio-auth.yaml

滚动更新过程会将所有部署和配置升级到新版本。完成此过程后,您的 Istio 控制平面应该会更新为新版本。您现有的应用程序应该继续工作。如果新控制平面存在任何严重问题,您可以通过应用旧版本的 yaml 文件来回滚更改。

如果你使用 Helm 和 Tiller 安装了 Istio,首选升级选项是让 Helm 负责升级。

  1. $ helm upgrade --install istio-init install/kubernetes/helm/istio-init --namespace istio-system
  • 检查所有的 CRD 创建 job 是否已成功完成,以验证 Kubernetes API 服务器是否已收到所有 CRD:
  1. $ kubectl get job --namespace istio-system | grep istio-init-crd
  • 升级 istio chart:
  1. $ helm upgrade istio install/kubernetes/helm/istio --namespace istio-system

Sidecar 升级

控制平面升级后,已经运行 Istio 的应用程序仍将使用旧版本的 sidecar。要想升级 sidecar,您需要重新注入它。

如果您使用自动 sidecar 注入(automatic sidecar injection),您可以通过对所有 pod 进行滚动升级来升级 sidecar,这样新版本的 sidecar 将被自动重新注入。一些技巧可以重新加载所有 pod。例如,有一个 bash 脚本 可以通过 patch 优雅结束时长(grace termination period)来触发滚动更新。

如果您使用手动注入,可以通过执行以下命令来升级 sidecar:

  1. $ kubectl apply -f <(istioctl kube-inject -f $ORIGINAL_DEPLOYMENT_YAML)

如果 sidecar 以前被注入了一些定制的注入配置文件,您需要将配置文件中的版本标签更改为新文件版本并像下面这样重新注入 sidecar:

  1. $ kubectl apply -f <(istioctl kube-inject \
  2. --injectConfigFile inject-config.yaml \
  3. --filename $ORIGINAL_DEPLOYMENT_YAML)

相关内容

Istio Sidecar 注入过程解密

Istio 将数据面组件注入到现存部署之中的过程。

Gateway 连接

使用 Istio Gateway 跨越多个 Kubernetes 集群安装 Istio 网格以访问远程 pod。

Google Kubernetes Engine

基于 GKE 的 Istio 多集群安装。

Google Kubernetes Engine

对 Google Kubernetes Engine(GKE)集群进行配置以便安装运行 Istio。

IBM Cloud Private

多 IBM Cloud Private 集群安装 Istio 示例。

IBM Cloud

如何使用 IBM 公有云或 IBM 私有云快速安装 Istio。