场景
在我们使用 kubernetes 的 admission webhook
机制实现一些集群资源认证、修改的方案时,会涉及到集群内部的 https 通信。这就涉及到我们的服务需要配置证书,并且要让 kubernetes 的组件信任该证书。我们都知道 kubernetes 集群中所有的证书都是由一个自定义的 CA 签发的,并且 kubernetes 集群都信任该 CA,因此基于该原理,使用 kubernetes 提供的 CertificateSigningRequest
来为我们的证书签名即可。
具体流程
kubernetes 官方的文档上提供了比较详细的说明,文档地址在这里:管理集群中的 TLS 认证
大致流程如下:
- 使用 cfssl 为我们的 service 地址创建证书
- 使用
CertificateSigningRequest
请求 kubernetes 的 CA 来为该证书签名 - 管理员通过
kubectl certificate approve
来批准请求 - 通过
kubectl get csr
获取签名后的证书,并使用到我们的服务中。
当然这个过程还不够自动化,我们可以使用一些很好的脚本来帮助我们完成这个工作:
这个脚本使用 openssl 来创建公私钥,创建 CertificateSigningRequest
请求对公钥签名,然后自动批准并将私钥和签名后的公钥存到 secret 中。使用方式如下:
./webhook-create-signed-cert.sh \
--service lazykube-webhook-svc \
--secret lazykube-webhook-certs \
--namespace kube-system
这个脚本其实跟证书签发没有太大关系,但是如果你使用 mutatingwebhook
的话正好可以使用它,同理 validatingwebhook
也是如此
cat mutatingwebhook.yaml | \
./webhook-patch-ca-bundle.sh > \
mutatingwebhook-ca-bundle.yaml
一些问题
我在使用上述脚本的时候,发现使用 rancher 创建的 kubernetes 集群有问题。这是因为 rancher 创建的 kubernetes 集群没有默认开启 kubernetes controller manager
的签名选项。具体的选项可以参考这里:给集群管理员的一个建议
修改的方案就是打开该选项,rancher 中可以在界面上编辑集群的 yaml 文件,加上以下参数:
services:
kube-controller:
extra_args:
cluster-signing-cert-file: "/etc/kubernetes/ssl/kube-ca.pem"
cluster-signing-key-file: "/etc/kubernetes/ssl/kube-ca-key.pem"
《kubernetes 集群中的证书签发》上有1条评论