跨集群部署含Sealed Secret的Chart的方案及控制器密钥统一方法咨询
一、跨集群部署的通用方法
为每个集群单独加密Secret:这是最直接的解决方案。针对每个集群的Sealed Secrets Controller公钥,用
kubeseal分别加密原始Secret,生成对应集群的Sealed Secret文件。在Chart里可以通过values参数或者条件渲染来区分不同集群的资源,比如给每个集群配置独立的Sealed Secret内容,部署时指定对应集群的values文件即可。
示例操作命令:# 导出集群A的Controller公钥 kubeseal --fetch-cert --controller-name=sealed-secrets --controller-namespace=kube-system > clusterA-pub.pem # 用集群A公钥加密原始Secret,生成适配集群A的Sealed Secret kubeseal --cert=clusterA-pub.pem --format=yaml < original-secret.yaml > sealed-secret-clusterA.yaml # 用同样流程处理集群B kubeseal --fetch-cert --controller-name=sealed-secrets --controller-namespace=kube-system > clusterB-pub.pem kubeseal --cert=clusterB-pub.pem --format=yaml < original-secret.yaml > sealed-secret-clusterB.yaml在Chart的templates目录中,你可以通过
if-else判断或者集群标识匹配,选择加载对应集群的Sealed Secret模板,也可以直接把不同集群的Sealed Secret内容作为values参数传入部署。借助外部密钥管理系统(KMS)绕开Sealed Secret限制:如果有统一的KMS服务(比如HashiCorp Vault),可以不在Chart里嵌入Sealed Secret,而是让应用启动时从KMS拉取敏感数据,动态生成Secret。这种方式完全避开了多集群密钥不一致的问题,更适合大规模多集群场景。
二、让多集群Sealed Secrets Controller共用密钥
可以通过导出源集群的Controller密钥,再导入到其他集群来实现:
导出源集群的密钥:
源集群中,Sealed Secrets Controller的密钥默认存在kube-system命名空间的sealed-secrets-keySecret里(如果自定义过Controller配置,对应修改名称)。执行命令导出:kubectl get secret sealed-secrets-key -n kube-system -o yaml > sealed-secrets-key.yaml导入密钥到目标集群:
在目标集群部署Sealed Secrets Controller之前,先导入这个密钥Secret:kubectl apply -f sealed-secrets-key.yaml -n kube-system之后部署Controller时,它会自动使用已存在的密钥,不会再生成新的。
注意事项:
- 这个密钥是敏感数据,传输和存储时一定要加密,绝对不能泄露。
- 如果目标集群已经部署过Controller并生成了自己的密钥,需要先删除原有的
sealed-secrets-keySecret,再导入新密钥,最后重启Controller Pod让它加载新密钥。
内容的提问来源于stack exchange,提问作者beatrice

