这是一个基于 kubeadm 的 1.16 集群。我理解 apiserver 和 kubelet 之间的 mTLS 工作方式是:
apiserver -> kubelet
--kubelet-client-certificate & --kubelet-client-key => The certs & key given here(apiserver) is for apiserver(client) to kubelet (server)
--client-ca => The CA given here(kubelet) is what verfies if request from apiserver is indeed the right one.
然后我们有另一种方法:
kubelet -> api 服务器
--tls-cert-file & --tls-key-file => Passed in kubelet conf. Generally present at /var/lib/kubelet/pki/kubelet.{crt,key}
--kubelet-certificate-authority => The above cert gets verified by this CA passed in apiserver
但是,kubelet.conf
/etc/kubernetes 中存在一个文件,其中又有client-certificate-data
和client-key-data
。何时使用此客户端证书?
此外,如果我们在 kubelet 中启用自动轮换,则在/var/lib/kubelet/pki/kubelet-client-current.pem
此外,如果我们在 kubelet 中启用自动轮换,则根据所使用的 kubeadm 版本,kubelet.conf 中可能会引用或不引用漏洞在 1.17 之前的 kubeadm 中)。我对 kubelet 客户端证书的使用方式和时间感到困惑。有什么帮助吗?
答案1
和client-certificate-data
的client-key-data
存在是因为漏洞. 这很好地体现在官方文档:
警告:在使用 创建的节点上
kubeadm init
,在 kubeadm 1.17 版本之前,存在一个错误,您必须手动修改 的内容kubelet.conf
。kubeadm init
完成后,您应该更新kubelet.conf
以指向轮换的 kubelet 客户端证书,方法是将client-certificate-data
和替换client-key-data
为:client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem client-key: /var/lib/kubelet/pki/kubelet-client-current.pem
一些包含更多信息的有用来源:
编辑:
根据kubelet 集成:
当你运行 时
kubeadm join
,kubeadm 使用 Bootstrap Token 凭证执行 TLS 引导,它将获取下载 kubelet-config-1.X ConfigMap 所需的凭证并将其写入/var/lib/kubelet/config.yaml
。动态环境文件的生成方式与 完全相同kubeadm init
。接下来
kubeadm
运行以下两个命令将新配置加载到 kubelet 中:systemctl daemon-reload && systemctl restart kubelet
在 kubelet 加载新配置后,kubeadm 会写入
/etc/kubernetes/bootstrap-kubelet.conf
KubeConfig 文件,其中包含 CA 证书和 Bootstrap Token。kubelet 会使用它们来执行 TLS Bootstrap 并获取唯一凭证,该凭证存储在 中/etc/kubernetes/kubelet.conf
。写入此文件时,kubelet 已完成执行 TLS Bootstrap。
这表示存储在 中的证书/凭据kubelet.conf
在 kubelet 启动过程中使用。删除此文件或更改其内容将在 kubelet 重启期间进行验证。您可以按照以下方式自行测试:
- 如果删除该文件:
failed to run kubelet: unable to load bootstrap kubeconfig
- 如果您错误配置文件或提供错误的证书:
config loaded from file: /etc/kubernetes/kubelet/conf
bootstrap.go:240 unable to read existing bootstrap client config: f.e. invalid configuration
or unable to load TLS certificates from existing bootstrap client config: data does not contain any valid RSA or ECDSA certificate
另外,附注:
我强烈建议使用较新版本的 Kubernetes,因为您的版本比当前稳定版本早 5 个主要版本:1.21 / 2021 年 4 月 8 日。保持最新状态将为您节省将来的很多麻烦。