升级步骤

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

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

升级步骤

  1. 下载新的 Istio 版本并将目录更改为新版本目录。

控制平面升级

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

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

  1. 使用 kubectl apply 升级 Istio 所有的 CRD。稍微等待几秒钟,让 Kubernetes API 服务器接收升级后的 CRD:

    $ for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done
    
  2. 例如,将 Istio 的核心组件添加到 Kubernetes 的清单文件中。

    $ helm template install/kubernetes/helm/istio --name istio \
    --namespace istio-system > $HOME/istio.yaml
    

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

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

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

  3. 通过清单升级 Istio 控制平面组件,例如:

    $ kubectl apply -f $HOME/istio.yaml
    

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

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

Sidecar 升级

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

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

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

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

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

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