1. 从零开始的节点身份之旅
想象一下这样的场景:当你把一台新服务器接入Kubernetes集群时,kubelet就像个刚入职的新员工,手里拿着空白工牌站在公司门口。它需要完成完整的入职流程,才能获得门禁权限、办公设备和使用公司资源的资格。这个看似简单的"刷卡进门"动作背后,其实隐藏着一套精密的身份认证体系。
在Kubernetes的世界里,每个节点都需要通过严格的身份验证才能加入集群。这个过程中最关键的参与者就是kubelet——运行在每个节点上的代理程序。它需要完成三个关键转变:
- 从匿名连接变为可验证身份的通信
- 从无权限状态变为具备特定操作权限
- 从孤立个体变为集群认可的成员节点
我曾在生产环境中遇到过这样的案例:某次集群扩容时,新节点始终处于NotReady状态。排查后发现是kubelet的证书配置错误导致身份验证失败。这个看似简单的问题让我们损失了两个小时的部署时间。正是这次经历让我意识到,理解节点身份建立的完整流程,对集群运维至关重要。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 认证流程的三重关卡
2.1 TLS握手:第一道安全门禁
当kubelet首次启动时,它会尝试与API Server建立TLS连接。这个过程就像新员工第一次刷卡进公司:
- 证书交换:kubelet向API Server出示自己的客户端证书
- 身份核验:API Server通过CA证书验证该证书的合法性
- 双向认证:在配置了--kubelet-client-certificate参数时,API Server也会出示自己的服务端证书
这里有个关键细节:kubelet的初始证书通常由集群管理员预先生成,或者通过引导令牌(bootstrap token)临时获取。我建议使用以下openssl命令验证证书的有效性:
bash复制openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text -noout
输出中应该包含正确的CN(Common Name)和O(Organization)字段,例如:
code复制Subject: O=system:nodes, CN=system:node:worker-01
注意:生产环境中务必确保证书的有效期足够长(建议至少1年),否则会导致节点突然失联。我曾见过因为证书过期导致整个集群节点集体掉线的生产事故。
2.2 CSR审批:获取正式工牌
通过TLS验证只是第一步,接下来kubelet需要提交证书签名请求(CSR)来获取长期有效的身份凭证。这个过程类似于新员工提交入职材料申请正式工牌:
- kubelet自动创建CSR资源对象
- 控制器管理器中的csrapprover控制器检查请求合法性
- 管理员或自动审批器批准该CSR
- API Server签发正式证书
在v1.19+版本中,Kubernetes引入了自动批准机制。以下是一个典型的CSR审批条件判断流程:
go复制if csr.Spec.Username == "system:node:<nodeName>" &&
csr.Spec.Groups.Contains("system:nodes") {
approveCSR(csr)
}
2.3 Node资源注册:建立员工档案
获得证书后,kubelet会创建或更新对应的Node资源。这就像HR为新员工建立人事档案:
yaml复制apiVersion: v1
kind: Node
metadata:
name: worker-01
spec:
podCIDR: 10.244.1.0/24
status:
addresses:
- address: 192.168.1.101
type: InternalIP
conditions:
- status: "True"
type: Ready
这个阶段最容易出现的问题是节点标签(labels)和污点(taints)配置错误。我建议使用以下命令检查节点状态:
bash复制kubectl get node <node-name> -o json | jq '.status.conditions'
3. 身份背后的权限控制
3.1 RBAC:定义岗位职责
获得身份只是开始,kubelet还需要明确的权限才能正常工作。Kubernetes通过RBAC机制为节点分配权限,就像为不同岗位设置不同的权限级别:
yaml复制apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: system:node
rules:
- apiGroups: [""]
resources: ["nodes"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "delete", "get", "list", "watch", "update"]
在1.14版本后,Kubernetes引入了Node授权模式,专门处理节点相关请求。它会检查:
- 请求用户名是否以
system:node:开头 - 请求组是否包含
system:nodes - 请求资源是否是该节点有权访问的
3.2 ServiceAccount:节点上的工作证
除了节点身份,kubelet还会为Pod挂载ServiceAccount令牌。这就像给每个工作项目分配特定的访问权限:
bash复制# 查看默认的ServiceAccount
kubectl get sa -n kube-system
NAME SECRETS AGE
default 1 30d
重要安全提示:在1.21版本前,这些令牌是永久有效的。现在建议开启BoundServiceAccountTokenVolume特性,使用有时间限制的令牌。
4. 生产环境中的实战经验
4.1 证书轮换:定期更换门禁卡
就像公司会定期更换门禁卡一样,kubelet证书也需要轮换。从1.8版本开始,Kubernetes支持自动证书轮换:
bash复制# 查看当前证书信息
kubeadm alpha certs check-expiration
建议配置以下kubelet参数:
yaml复制rotateCertificates: true
certificateExpiration: 8760h # 1年
4.2 身份验证问题排查
当节点身份验证失败时,可以按照以下步骤排查:
- 检查kubelet日志:
bash复制journalctl -u kubelet -n 100 --no-pager
- 验证证书链:
bash复制openssl verify -CAfile /etc/kubernetes/pki/ca.crt \
/var/lib/kubelet/pki/kubelet-client-current.pem
- 检查CSR状态:
bash复制kubectl get csr
kubectl describe csr <csr-name>
4.3 安全加固建议
根据我在金融行业Kubernetes集群的运维经验,建议采取以下安全措施:
- 禁用匿名访问:
yaml复制apiServer:
extraArgs:
anonymous-auth: "false"
- 启用NodeRestriction准入控制器:
yaml复制apiServer:
extraArgs:
enable-admission-plugins: "NodeRestriction"
- 定期审计节点权限:
bash复制kubectl auth can-i --list --as=system:node:worker-01
5. 从认证到授权的完整链条
理解节点身份建立过程后,我们来看一个完整的请求生命周期:
- kubelet使用客户端证书发起API请求
- API Server验证证书签名和有效期
- 请求被转发到认证层,提取用户信息(如system:node:worker-01)
- 授权层检查RBAC规则
- 准入控制器进行最终验证
- 请求被处理并返回结果
这个流程中任何一个环节出现问题,都会导致节点无法正常工作。比如我曾经遇到过一个案例:由于RBAC配置错误,节点无法更新自己的状态,导致集群认为该节点不可用。
在大型集群中(超过100个节点),证书管理会成为挑战。我推荐使用以下优化方案:
- 分批次轮换证书,避免同时大量CSR请求
- 设置适当的--node-authorizer-cache-size参数
- 监控certificates.k8s.io API的请求延迟
节点身份管理是Kubernetes安全的基础。就像大楼的门禁系统一样,它可能平时不引人注目,但一旦出现问题就会导致严重后果。通过深入理解kubelet如何从"路人"变成"合法Node",我们不仅能更好地运维集群,还能设计出更安全的架构方案。
