在继续之前,请确保你熟悉 Istio 隔离边界 功能。
升级前
从非修订版升级到版本控制平面设置涉及启用 Istio 隔离边界功能。 启用后,可以在隔离边界内配置版本,控制平面必须升级到该版本。 按照 隔离边界安装 中提到的步骤部署具有启用隔离边界功能的控制平面。
启用 Istio 隔离边界功能后,你需要在添加隔离边界到 ControlPlane
CR 之前,将 TSB 数据平面 Operator 的规模缩小。这是为了避免 TSB 数据平面 Operator 和 TSB 控制平面 Operator 在协调相同的 TSB Ingress/Egress/Tier1Gateway 资源时发生竞争条件。
kubectl scale --replicas=0 deployment tsb-operator-data-plane -n istio-gateway
出于同样的原因,我们还必须将 istio-operator 在 istio-gateway 命名空间中的规模缩小。
kubectl scale --replicas=0 deployment istio-operator -n istio-gateway
随着这一步,还删除了由 tsb-operator-data-plane 创建和管理的 webhooks。
kubectl delete validatingwebhookconfiguration tsb-operator-data-plane-egress tsb-operator-data-plane-ingress tsb-operator-data-plane-tier1; \
kubectl delete mutatingwebhookconfiguration tsb-operator-data-plane-egress tsb-operator-data-plane-ingress tsb-operator-data-plane-tier1;
控制平面
在你的 ControlPlane
CR 中配置一个隔离边界。如果使用 Helm,你可以在 Helm 值文件中添加隔离边界配置。
spec:
hub: <registry-location>
telemetryStore:
elastic:
host: <tsb-address>
port: <tsb-port>
version: <elastic-version>
selfSigned: <is-elastic-use-self-signed-certificate>
managementPlane:
host: <tsb-address>
port: <tsb-port>
clusterName: <cluster-name-in-tsb>
selfSigned: <is-mp-use-self-signed-certificate>
components:
xcp:
isolationBoundaries:
- name: global
revisions:
- name: revisioned
centralAuthMode: 'JWT'
在 ControlPlane
CR 中配置隔离边界将在 istio-system
命名空间中设置版本化的控制平面,如下所示
kubectl get deployment -n istio-system | grep istio-operator
# 输出
istio-operator 1/1 1 1 15h
istio-operator-revisioned 1/1 1 1 2m
kubectl get deployment -n istio-system | grep istiod
# 输出
istiod 1/1 1 1 15h
istiod-revisioned 1/1 1 1 2m
请注意,仍然部署了一个非修订版的控制平面,负责管理现有的 sidecar 和网关。
网关升级
要升级网关,请在 Ingress/Egress/Tier1Gateway
资源中 添加 spec.revision
。这将使现有的网关 pod 被调整为连接到版本化的 Istio 控制平面。TSB 默认配置了 Gateway 安装资源,使用 RollingUpdate
策略,确保零停机时间。
你还可以通过对网关 CR 进行打补丁来添加 spec.revision
。
kubectl patch ingressgateway.install <name> -n <namespace> --type=json --patch '[{"op": "replace","path": "/spec/revision","value": "revisioned"}]'; \
应用升级
要升级 sidecar,请移除工作负载命名空间标签中的 istio-injection=enabled
,并将 istio.io/rev
标签应用于 Istio 版本的工作负载命名空间。
kubectl label namespace workload-ns istio-injection- istio.io/rev=revisioned
然后重新启动应用工作负载。首选滚动更新以避免流量中断。
kubectl rollout restart deployment -n workload-ns
VM 工作负载升级
要升级 VM 工作负载,请
使用 版本化链接 从你的入驻平面下载最新的 Istio sidecar,然后在 VM 上重新安装 Istio sidecar。
使用 revision
值 更新 onboarding-agent
配置,然后重新启动 onboarding-agent
。Istio sidecar 将连接到版本化的 Istio 控制平面。
升级后清理
一旦所有 sidecar 都已移动到版本化代理,所有应用网关都已具备版本化网关,并确保升级正常运行,我们可以继续清理现在已经过时的旧非修订版资源。
请记住,我们已经将 TSB 数据平面 Operator 和非修订版 istio-operator 从 istio-gateway 命名空间的规模缩小。现在,可以安全地删除 istio-gateway
命名空间,因为不再需要它。
kubectl delete ns istio-gateway
使用 kubectl
删除位于命名空间 istio-system
中的名为 tsb-istiocontrolplane
的 IstioOperator
资源。
kubectl delete iop tsb-istiocontrolplane -n istio-system
确保 istio-system
命名空间中的 istiod
部署由 istio-operator 部署删除。然后删除 Istio operator 部署和 Kubernetes RBAC(clusterrole
和 clusterrolebinding
)。
kubectl delete clusterrole,clusterrolebinding istio-operator
kubectl delete deployment,sa istio-operator -n istio-system
从版本化回滚到非修订版
在升级后清理之前
-
将 istio-gateway 命名空间中的 tsb 数据平面 Operator 的规模增加。
kubectl scale --replicas=1 deployment tsb-operator-data-plane -n istio-gateway
随着此操作,删除由 tsb-operator-control-plane 创建和管理的 webhooks。
kubectl delete validatingwebhookconfiguration tsb-operator-control-plane-egress tsb-operator-control-plane-ingress tsb-operator-control-plane-tier1; \ kubectl delete mutatingwebhookconfiguration tsb-operator-control-plane-egress tsb-operator-control-plane-ingress tsb-operator-control-plane-tier1;
-
要回滚网关,从 TSB 网关安装资源的
Ingress/Egress/Tier1Gateway
中移除spec.revision
。对于网关部署,最好配置滚动更新以避免流量中断。这可以在
ingress/Egress/Tier1Gateway
资源中配置。 这将导致网关 pod 启动并连接到仍在运行的较旧的非修订版 Istio 控制平面。 -
通过将工作负载命名空间标签中的
istio.io/rev
值更改为default
来回滚 sidecars。kubectl label namespace workload-ns istio.io/rev=default
然后重新启动应用工作负载。
kubectl rollout restart deployment -n workload-ns
-
一旦所有数据平面组件都回滚到非修订版的控制平面,我们可以继续从
ControlPlane
CR 中删除隔离边界。这将删除在istio-system
命名空间中部署的版本化控制平面组件。
在升级后清理之后
-
首先,我们需要恢复非修订版的控制平面。要获取较旧的非修订版控制平面,请使用禁用了
ISTIO_ISOLATION_BOUNDARIES
的 TSB 集群 Operator 重新安装。tctl install manifest cluster-operators --registry $HUB > clusteroperators.yaml kubectl apply -f clusteroperators.yaml
再次部署 Operator 将在 istio-gateway 命名空间中带回 TSB 数据平面 Operator。然后,非修订版的 TSB 控制平面 Operator 将协调更新的
ControlPlane
资源以重新部署非修订版的 Istio 控制平面。 由于已删除隔离边界支持,这还将清理所有版本化的控制平面组件。 -
编辑现有的
ControlPlane
CR,以删除spec.components.xcp.isolationBoundaries
。 -
要回滚网关,请从 TSB 网关安装资源的
Ingress/Egress/Tier1Gateway
中移除spec.revision
。 对于网关部署,最好配置滚动更新以避免流量中断。这可以在ingress/Egress/Tier1Gateway
资源中配置。 这将导致网关 pod 启动并连接到仍在运行的较旧的非修订版 Istio 控制平面。 -
通过将工作负载命名空间标签中的
istio.io/rev
值更改为default
来回滚 sidecars。kubectl label namespace workload-ns istio.io/rev=default
然后重新启动应用工作负载。
kubectl rollout restart deployment -n workload-ns