默认情况下,kubeadm 所部署的 kubelet 服务证书是自签名(Self-Signed)。 这意味着从 metrics-server 这类外部服务发起向 kubelet 的链接时无法使用 TLS 来完成保护。
要在新的 kubeadm 集群中配置 kubelet 以使用被正确签名的服务证书, 你必须向 kubeadm init
传递如下最小配置数据:
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
serverTLSBootstrap: true
如果你已经创建了集群,你必须通过执行下面的操作来完成适配:
- 找到
kube-system
名字空间中名为 kubelet-config-1.25
的 ConfigMap 并编辑之。 在该 ConfigMap 中,kubelet
键下面有一个 KubeletConfiguration 文档作为其取值。编辑该 KubeletConfiguration 文档以设置 serverTLSBootstrap: true
。
- 在每个节点上,在
/var/lib/kubelet/config.yaml
文件中添加 serverTLSBootstrap: true
字段,并使用 systemctl restart kubelet
来重启 kubelet。
字段 serverTLSBootstrap
将允许启动引导 kubelet 的服务证书,方式 是从 certificates.k8s.io
API 处读取。这种方式的一种局限在于这些 证书的 CSR(证书签名请求)不能被 kube-controller-manager 中默认的 签名组件 kubernetes.io/kubelet-serving 批准。需要用户或者第三方控制器来执行此操作。
可以使用下面的命令来查看 CSR:
kubectl get csr
NAME AGE SIGNERNAME REQUESTOR CONDITION
csr-9wvgt 112s kubernetes.io/kubelet-serving system:node:worker-1 Pending
csr-lz97v 1m58s kubernetes.io/kubelet-serving system:node:control-plane-1 Pending
你可以执行下面的操作来批准这些请求:
kubectl certificate approve <CSR-名称>
默认情况下,这些服务证书会在一年后过期。 kubeadm 将 KubeletConfiguration
的 rotateCertificates
字段设置为 true
;这意味着证书快要过期时,会生成一组针对服务证书的新的 CSR,而 这些 CSR 也要被批准才能完成证书轮换。 要进一步了解这里的细节,可参阅 证书轮换 文档。
如果你在寻找一种能够自动批准这些 CSR 的解决方案,建议你与你的云提供商 联系,询问他们是否有 CSR 签名组件,用来以带外(out-of-band)的方式检查 节点的标识符。
说明: 本部分链接到提供 Kubernetes 所需功能的第三方项目。Kubernetes 项目作者不负责这些项目。此页面遵循CNCF 网站指南,按字母顺序列出项目。要将项目添加到此列表中,请在提交更改之前阅读内容指南。
也可以使用第三方定制的控制器:
除非既能够验证 CSR 中的 CommonName,也能检查请求的 IP 和域名, 这类控制器还算不得安全的机制。 只有完成彻底的检查,才有可能避免有恶意的、能够访问 kubelet 客户端证书的第三方 为任何 IP 或域名请求服务证书。
类型 |
CA |
CN |
认证 |
描述 |
官方 |
Etcd |
etcd/ca.crt,key |
server.crt,key |
server, client |
对外提供服务 |
kube-etcd |
peer.crt,key |
server, client |
节点相互通信的证书 |
kube-etcd-peer |
healthcheck-client.crt,key |
client |
pod中Liveness探针客户端证书 |
kube-etcd-healthcheck-client |
k8s |
ca.crt,key |
sa.pub,key |
|
服务帐户密钥 |
|
apiserver.crt,key |
server |
apiserver 证书 |
kube-apiserver |
apiserver-kubelet-client.crt,key |
client |
kubelet证书 |
kube-apiserver-kubelet-client |
apiserver-etcd-client.crt,key |
client |
apiserver访问etcd的证书 |
kube-apiserver-etcd-client |
front-proxy-ca.crt,key |
front-proxy-client.crt,key |
client |
用于前端代理 |
front-proxy-client |
默认用kubeadm部署的K8S,kubelet默认只有cient端证书的,就是它只是去访问apiserver的证书。
按照官网的文档,需要增加一个kubelet server端证书
具体操作如下
kubectl -n kube-system get configmaps
kubectl -n kube-system edit configmaps kubelet-config-1.23
添加serverTLSBootstrap: true这一行
imageMinimumGCAge: 0s
kind: KubeletConfiguration
serverTLSBootstrap: true
logging:
在每个节点上,在 /var/lib/kubelet/config.yaml 文件中添加 serverTLSBootstrap: true 字段,并使用 systemctl restart kubelet 来重启 kubelet。
vi /var/lib/kubelet/config.yaml
在所有的K8S节点上添加如下行
serverTLSBootstrap: true
所有节点都重启kubelet服务
systemctl restart kubelet.service
使用下面的命令来查看 CSR:
kubectl get csr
执行下面的操作来批准这些请求:
kubectl certificate approve <CSR-名称>
默认情况下,这些服务证书会在一年后过期。 kubeadm 将 KubeletConfiguration 的 rotateCertificates 字段设置为 true;这意味着证书快要过期时,会生成一组针对服务证书的新的 CSR,而 这些 CSR 也要被批准才能完成证书轮换。 要进一步了解这里的细节,可参阅 证书轮换 文档。
如果你在寻找一种能够自动批准这些 CSR 的解决方案,建议你与你的云提供商 联系,询问他们是否有 CSR 签名组件,用来以带外(out-of-band)的方式检查 节点的标识符。
官方网址
使用 kubeadm 进行证书管理 | Kubernetes
K8S各种各样的证书介绍
K8S各种各样的证书介绍_一往无前,未来可期的博客-CSDN博客_k8s证书
kubernetes 证书详解
kubernetes 证书详解_Kry1702的博客-CSDN博客_kubernetes证书
Kubernetes Kubeadm Kubelet 证书自动续签
Kubernetes Kubeadm Kubelet 证书自动续签_富士康质检员张全蛋的博客-CSDN博客_kubelet 证书
使用 kubeadm 进行证书管理
使用 kubeadm 进行证书管理 | Kubernetes
转载至https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-certs/#kubelet-serving-certs