将 cert-manager 证书移至另一个 Kubernetes 集群

the*_*Dmi 4 ssl kubernetes cert-manager

我正在将 Web 服务从一个 Kubernetes 集群迁移到另一个集群。目标是在不中断服务的情况下做到这一点。

这对于 cert-manager 和 HTTP 质询来说很困难,因为新集群上的 cert-manager 只能在 DNS 条目指向该集群时检索证书。但是,如果我将 DNS 条目切换到新集群,客户端可能会在生成有效证书之前与新集群进行通信。这就像一个先有鸡还是先有蛋的问题。

如何将 cert-manager 证书移至新集群,以便在进行 DNS 切换后它已经拥有证书?

the*_*Dmi 8

证书存储在 Kubernetes 机密中。如果秘密与入口对象匹配,证书管理器将选择现有的秘密而不是创建新的秘密。

因此,假设入口对象在两个集群上看起来相同,并且使用相同的命名空间,复制秘密就像这样简单:

kubectl --context OLD_CLUSTER -n NAMESPACE get secret SECRET_NAME --output yaml \
  | kubectl --context NEW_CLUSTER -n NAMESPACE apply -f -
Run Code Online (Sandbox Code Playgroud)
  • 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 
Run Code Online (Sandbox Code Playgroud)

再次,相应地替换CLUSTER_IPSERVICE_DNS_NAME