服务帐户发行者 (SAI) 迁移 ¶
过去,更改服务帐户发行者是一个具有破坏性的过程。但是,从 Kubernetes v1.22 开始,您可以在 Kubernetes API 服务器中指定多个服务帐户发行者 (此处查看文档).
如 Kubernetes 文档所述,当--service-account-issuer
标志被多次指定时,第一个标志用于生成令牌,所有标志都用于确定哪些发行者被接受。
因此,借助此功能,我们可以迁移到新的服务帐户发行者,而不会对集群操作造成破坏。
注意:在即将推出的功能中,kOps 对此提供了官方支持 - koordinates/kops#16497.
使用实例组钩子迁移(kOps v1.28+之前) ¶
警告:此过程是手动的,涉及对清单文件进行一些棘手的修改。我们建议在继续生产集群之前,先在暂存集群上测试此过程。
在此示例中,我们正在从master.[cluster-name].[domain]
切换到api.internal.[cluster-name].[domain]
。
- 将
modify-kube-api-manifest
(现有 SAI 作为主发行者)钩子添加到控制平面实例组hooks: - name: modify-kube-api-manifest before: - kubelet.service manifest: | User=root Type=oneshot ExecStart=/bin/bash -c "until [ -f /etc/kubernetes/manifests/kube-apiserver.manifest ];do sleep 5;done;sed -i '/- --service-account-issuer=https:\/\/api.internal.[cluster-name].[domain]/i\ \ \ \ - --service-account-issuer=https:\/\/master.[cluster-name].[domain]' /etc/kubernetes/manifests/kube-apiserver.manifest"
- 将更改应用到集群
- 滚动控制平面节点
- 更新
modify-kube-api-manifest
(切换主发行者/辅助发行者 SAI)钩子,该钩子位于控制平面实例组上hooks: - name: modify-kube-api-manifest before: - kubelet.service manifest: | User=root Type=oneshot ExecStart=/bin/bash -c "until [ -f /etc/kubernetes/manifests/kube-apiserver.manifest ];do sleep 5;done;sed -i '/- --service-account-issuer=https:\/\/api.internal.[cluster-name].[domain]/a\ \ \ \ - --service-account-issuer=https:\/\/master.[cluster-name].[domain]' /etc/kubernetes/manifests/kube-apiserver.manifest"
- 将更改应用到集群
- 滚动控制平面节点
- 滚动集群中的所有其他节点
- 等待 24 小时,直到动态 SA 令牌刷新
- 从控制平面实例组中删除
modify-kube-api-manifest
钩子 - 将更改应用到集群
- 滚动控制平面节点