在搭建本地 Kubernetus 集群后,由于环境在内网,做不了域名验证,无法使用 Let’s Encrypt 颁发和自动更新证书,然而很多应用要求必须启用 HTTPS,只能用自签名 CA 证书,并由此 CA 继续颁发其他证书。
所以我们准备了以下工具,开始搭建。
- Pulumi
: 当前非常流行的 IaC 工具,值得一试。
- cert-manager
: 云原生证书管理,用于自动管理和颁发各种发行来源的 TLS 证书。它将确保证书有效并定期更新,并尝试在到期前的适当时间更新证书。
核心步骤和相关代码如下,更多源码请参考我们的 GitHub 项目 xlabs-ops
。
使用 Pulumi 安装 cert-manager,生成自签名 CA 证书,根据自签名 CA 证书生成 cert-manager ClusterIssuer,都在如下代码了。
以上执行 pulumi up
后,我们就得到了一个自签名的 CA 证书、一个可用于为 ingress 自动签发 TLS 的 ClusterIssuer。
在 K8S ingress 上,增加以下 annotations 即可自动生成 TLS 证书,注意名字 selfsigned-issuer 与上面创建的名字保持一致。
另外提供一个小插曲,实际上 cert-manager 的 ClusterIssuer 不需要指定 namespace,但是在创建的时候发现不写 namespace,caSecret 创建在 default
namespace 后,ClusterIssuer 找不到 caSecret,所以为他们两个都特别指定了 namespace。
让 Edge/Chrome 信任自签名证书
以上生成的自签名证书在浏览器访问时,会有红色提示不安全,被禁止访问,所以需要将我们的 CA 证书导入本机并选择信任。
Mac 用户,通过以下命令行,或打开 Keychain Access 应用程序手动导入并在 info trust 中选择 always trust。
对于 Ubuntu 用户,可通过以下命令导入。某些 Ubuntu Desktop 增加信任证书后,Edge 仍然提示证书无效,在 Edge 地址栏输入 edge://settings/privacy/manageCertificates
重新导入了一次就解决了。
Windows 用户,双击 ca.crt 安装证书到“受信任的根证书颁发机构”。