4. 节点扩容基础:节点注册流程、kubelet启动参数、节点身份认证机制

节点扩容是集群生命周期管理中最频繁的操作之一。从安全角度看,新节点加入集群的过程本质上是身份注册与凭证分发的过程。如果这一过程存在漏洞,攻击者可能通过伪造节点身份获取集群控制权。本节将深入剖析节点注册的完整流程、kubelet 的关键启动参数以及节点身份认证的核心机制。

4.1 节点注册流程:从引导到就绪

一个全新的节点(裸机或虚拟机)加入 Kubernetes 集群,通常经历以下四个阶段:

阶段 操作主体 安全要点
1. 引导(Bootstrap) kubelet → API Server 使用引导令牌(Bootstrap )进行一次性身份验证
2. CSR 提交 kubelet → API Server 提交证书签名请求(CertificateSigningRequest),包含节点公钥
3. CSR 审批 集群管理员 / 控制器 自动或手动审批 CSR,确保节点身份真实
4. 证书分发与注册 API Server → kubelet 签署并下发节点证书,kubelet 使用该证书进行后续通信
安全提示: 引导令牌(Bootstrap )是一次性使用的敏感凭证。生产环境中应设置较短的 TTL(例如 1 小时),并在节点注册完成后立即撤销或轮换该令牌。
节点注册流程示意图 节点注册流程(Bootstrap → CSR → 审批 → 注册) kubelet API Server CSR 审批 证书分发 ① 引导令牌 ② CSR 提交 ③ 审批 ④ 签署证书 ⑤ 证书返回 kubelet 说明:引导令牌仅在阶段①使用一次;CSR 审批可由集群管理员手动执行,也可由 kube-controller-manager 自动审批。 生产环境建议启用自动审批策略,但需配合节点身份白名单机制。

4.2 kubelet 启动参数:安全配置清单

kubelet 是节点上的核心代理,其启动参数直接决定了节点的安全基线。以下是与节点注册和身份认证相关的关键参数:

参数 默认值 安全建议
--bootstrap-kubeconfig 空 必须指定,指向包含引导令牌的 kubeconfig 文件
--kubeconfig 空 节点注册成功后自动生成,用于后续通信
--cert-dir /var/lib/kubelet/pki 确保目录权限为 700,仅 root 可读写
--rotate-certificates true 启用证书自动轮换,降低私钥泄露风险
--rotate-server-certificates false 启用 kubelet 服务端证书自动轮换(需 CSR 审批支持)
--authentication--webhook false 启用 TokenReview API 验证请求令牌,增强 API 安全
--authorization-mode AlwaysAllow 生产环境应改为 Webhook,由 API Server 执行授权
--client-ca-file 空 指定 CA 证书文件,用于验证 API Server 身份
常见错误: 许多管理员在测试环境中使用 --authentication--webhook=false 和 --authorization-mode=AlwaysAllow,这会导致 kubelet 不验证任何请求来源。生产环境中必须启用 Webhook 模式,否则任何能访问 kubelet 端口的进程都可以执行特权操作。

4.3 节点身份认证机制:证书与令牌

Kubernetes 节点与 API Server 之间的身份认证主要依赖两种机制:X.509 证书和引导令牌(Bootstrap )。两者在节点生命周期中扮演不同角色。

4.3.1 X.509 证书认证

节点注册完成后,kubelet 使用由集群 CA 签署的客户端证书与 API Server 通信。证书中包含节点的身份信息(Common Name 通常为 system:node:<node-name>,Organization 为 system:nodes)。API Server 通过验证证书签名和 CN/O 字段来确认节点身份。

4.3.2 引导令牌认证

引导令牌是节点首次注册时使用的临时凭证。它本质上是一个 Secret 资源,存储在 kube-system 命名空间中。引导令牌的格式为 [a-z0-9]{6}.[a-z0-9]{16},例如 07401b.f395accd7ae3b1c9。

特性 X.509 证书 引导令牌
生命周期 长期(通常 1 年,可自动轮换) 短期(默认 24 小时,建议更短)
使用场景 节点注册后的所有通信 仅节点首次注册
存储位置 节点本地文件系统(/var/lib/kubelet/pki) 集群 Secret(kube-system 命名空间)
泄露影响 攻击者可伪装成该节点 攻击者可注册新节点
轮换方式 自动(--rotate-certificates) 手动删除 Secret 或等待 TTL 过期
节点身份认证机制对比 节点身份认证机制:X.509 证书 vs 引导令牌 X.509 证书认证 • 长期凭证(1 年,可自动轮换) • 存储于节点本地文件系统 • CN: system:node:<name> • O: system:nodes • 用于节点注册后的所有通信 引导令牌认证 • 短期凭证(默认 24h) • 存储于集群 Secret • 格式: xxxxxx.xxxxxxxxxxxxxxxx • 仅用于节点首次注册 • 使用后应立即撤销或轮换 互补使用

4.4 节点身份认证的 RBAC 绑定

节点注册完成后,kubelet 需要获得适当的 RBAC 权限才能正常工作。Kubernetes 通过 ClusterRoleBinding 将 system:nodes 组绑定到 system:node ClusterRole,从而赋予节点访问自身状态、Pod 等资源的权限。

# 查看 system:nodes 组的 ClusterRoleBinding
kubectl get clusterrolebinding system:node -o yaml

# 典型输出(简化)
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: system:node
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:node
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:nodes
最佳实践: 不要直接修改 system:node ClusterRole。如果需要为节点添加额外权限(例如访问特定 ConfigMap),应创建独立的 ClusterRole 并通过节点标签选择器进行绑定,避免权限过度扩散。

4.5 节点扩容安全配置清单

在实施节点扩容前,请对照以下清单进行安全配置检查:

  • 引导令牌管理: 使用 kubeadm create --ttl 1h 创建短期令牌,避免使用默认的 24 小时 TTL。
  • kubelet 参数加固: 确保 --authentication--webhook=true 和 --authorization-mode=Webhook 已启用。
  • 证书目录权限: /var/lib/kubelet/pki 目录权限应为 700,所有证书文件权限应为 600。
  • CSR 自动审批策略: 配置 kube-controller-manager 的 --cluster-signing-cert-file 和 --cluster-signing-key-file,并启用 CSR 自动审批。
  • 节点身份白名单: 在云环境或受控网络中,使用 NodeRestriction 准入控制器限制节点只能修改自身的标签和注解。
  • 审计日志: 启用 API Server 的审计日志,记录所有节点注册和 CSR 审批事件。
核心结论: 节点扩容的安全核心在于引导令牌的短期使用和证书的自动轮换。前者防止令牌泄露导致未授权节点加入,后者确保证书泄露的影响范围可控。两者结合,构成了节点身份认证的纵深防御体系。