跳至内容

服务帐户发行者 (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]

  1. 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"
    
  2. 将更改应用到集群
  3. 滚动控制平面节点
  4. 更新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"
    
  5. 将更改应用到集群
  6. 滚动控制平面节点
  7. 滚动集群中的所有其他节点
  8. 等待 24 小时,直到动态 SA 令牌刷新
  9. 从控制平面实例组中删除modify-kube-api-manifest钩子
  10. 将更改应用到集群
  11. 滚动控制平面节点

此过程最初发布在 GitHub 问题中 此处,灵感来自 此评论.