【问题标题】:Move cert-manager certificate to another Kubernetes cluster将 cert-manager 证书移动到另一个 Kubernetes 集群
【发布时间】:2020-12-15 08:21:45
【问题描述】:
我正在将 Web 服务从一个 Kubernetes 集群转移到另一个集群。目标是在不中断服务的情况下做到这一点。
这对于 cert-manager 和 HTTP 挑战来说很困难,因为新集群上的 cert-manager 只能在 DNS 条目指向该集群时检索证书。但是,如果我将 DNS 条目切换到新集群,客户端可能会在生成有效证书之前与新集群通信。这就像先有鸡还是先有蛋的问题。
如何将 cert-manager 证书移动到新集群,以便在我进行 DNS 切换后它已经拥有证书?
【问题讨论】:
标签:
ssl
kubernetes
cert-manager
【解决方案1】:
证书存储在 Kubernetes 机密中。如果秘密与入口对象匹配,证书管理器将选择现有秘密而不是创建新秘密。
所以假设 ingress 对象在两个集群上看起来相同,并且使用相同的命名空间,复制秘密就这么简单:
kubectl --context OLD_CLUSTER -n NAMESPACE get secret SECRET_NAME --output yaml \
| kubectl --context NEW_CLUSTER -n NAMESPACE apply -f -
- 将
OLD_CLUSTER 和NEW_CLUSTER 替换为各自集群的kubectl 上下文名称(请参阅kubectl config get-contexts)。
- 将
SECRET_NAME 替换为存储证书的机密名称。可以在入口中找到此名称。
- 将
NAMESPACE 替换为您正在使用的实际命名空间。
该命令只是以 YAML 格式导出密钥,然后使用 kubectl apply -f 在新集群中创建相同的资源。
在新集群上设置好入口后,您可以使用 openssl s_client 验证证书是否有效:
openssl s_client -connect CLUSTER_IP:443 -servername SERVICE_DNS_NAME
同样,相应地替换 CLUSTER_IP 和 SERVICE_DNS_NAME。