kubelet 使用哪个证书?

kubelet 使用哪个证书?

这是一个基于 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-dataclient-key-data。何时使用此客户端证书?

此外,如果我们在 kubelet 中启用自动轮换,则在/var/lib/kubelet/pki/kubelet-client-current.pem此外,如果我们在 kubelet 中启用自动轮换,则根据所使用的 kubeadm 版本,kubelet.conf 中可能会引用或不引用漏洞在 1.17 之前的 kubeadm 中)。我对 kubelet 客户端证书的使用方式和时间感到困惑。有什么帮助吗?

答案1

client-certificate-dataclient-key-data存在是因为漏洞. 这很好地体现在官方文档

警告:在使用 创建的节点上kubeadm init,在 kubeadm 1.17 版本之前,存在一个错误,您必须手动修改 的内容kubelet.confkubeadm 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.confKubeConfig 文件,其中包含 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 日。保持最新状态将为您节省将来的很多麻烦。

相关内容