跳到主要内容
08:44:02
🔅🔆

节点与控制面之间的通信

本文列举控制面节点(确切地说是 API 服务器)和 Kubernetes 集群之间的通信路径。目的是让用户能够自定义安装,以实现对网络配置的加固,使集群能够在不可信的网络上(或者在一个云服务商完全公开的 IP 上)运行。

节点与控制面通信的整体拓扑是典型的星型结构,控制面(API 服务器)是唯一的枢纽:

节点与控制面通信全景

官方文档参考​

文档链接
节点与控制面之间的通信(官方中文)https://kubernetes.io/zh-cn/docs/concepts/architecture/control-plane-node-communication/

Hub and spoke 模型​

集群的所有通信模式都遵循 hub-and-spoke(星型/轮毂-辐条)模式:API 服务器是中心枢纽(hub),所有其他组件(kubelet、控制器、调度器等)作为辐条(spoke)只与 API 服务器通信,组件之间互不直连。

通信方向发起方说明
kubelet → API 服务器kubelet 主动发起节点侧无需暴露端口给控制面
控制器/调度器 → API 服务器控制面组件主动发起同上
API 服务器 → kubeletAPI 服务器主动发起需要能反向连到节点,是最需要加固的路径
为什么要关心通信方向

hub-and-spoke 意味着:只要节点能访问 API 服务器的 443 端口,"节点 → 控制面"方向就天然安全。真正需要专门加固的是"控制面 → 节点"方向(API 服务器主动连 kubelet 10250 端口),这也是本文的重点。

API 服务器到 kubelet​

API 服务器到 kubelet 的连接用于两类操作:

路径类型典型操作说明
读路径取 Pod 日志、kubectl exec -c 的输出流、attach、port-forward从节点上的 kubelet 拉取数据
写路径kubectl exec、kubectl run、kubectl drain、kubectl port-forward 等派生的操作API 服务器向 kubelet 下发指令

这些连接终结于 kubelet 的 HTTPS 端点。默认情况下,Kubernetes API 服务器不校验 kubelet 的服务证书,这使连接容易受到中间人攻击,在不可信/公开网络上不安全。

启用 kubelet 证书校验的方式:

  • kubelet 侧:给 kubelet 配置 --tls-cert-file 和 --tls-private-key-file,提供用于服务证书的证书签发(自定义 CA)。
  • API 服务器侧:配置 --kubelet-certificate-authority,提供用于校验 kubelet 服务证书的 CA 根证书。

若 API 服务器尚未启用 --kubelet-certificate-authority,可通过 webhook 方式加固:

  • kubelet 认证:API 服务器使用 kubelet 的客户端证书与其通信(--kubelet-client-certificate / --kubelet-client-key)。
  • kubelet 授权:API 服务器通过 --authorization-mode=Webhook 将 RBAC 判定委托出去,对发起请求的主体(如 system:kubelet-api-admin 组)做授权检查,避免任何能访问 API 服务器的人都获得 kubelet API 权限。
未启用 webhook 授权时的风险

如果 kubelet 的授权模式仍是默认的 AlwaysAllow,那么任何拿到 kubelet API 访问权的人都可以在节点上执行任意容器命令(exec 进入任意容器、读取任意 Pod 日志)。生产环境务必启用 webhook 认证/授权 + TLS 证书校验。

API 服务器到节点、Pod 和 Service​

API 服务器除了连 kubelet,还会主动连接节点、Pod 和 Service:

目标默认行为说明
节点API 服务器直接连接节点的 IP需要网络允许此方向连通
Pod直接连接 Pod IP经过 CNI 网络可达
Service先经过 kube-proxy 维护的转发规则访问 Service 的 ClusterIP

默认的连接方式是普通的 HTTP 明文连接(通过 IP + 端口直连),没有加密与身份认证。在不可信网络上,这种连接存在的问题:

  • 数据包路由问题:数据包可能被路由到错误的目的地(如跨网络路径上被劫持)。
  • 重定向绕过:目标返回的重定向可能把请求引向非预期的主机,绕过预期的安全边界。
  • 不安全模式:直连 IP 的方式缺乏端到端加密,容易受到中间人攻击。

如果需要在不可信网络上安全地运行,可以开启 API 服务器的 --enable-aggregator-routing=false 之外的措施,或使用加密通道(如对连接进行 TLS 加密、使用 mTLS)。

kubelet 到 API 服务器​

kubelet 连接 API 服务器的方式是标准的客户端-服务器模式:

要素说明
连接发起方kubelet(节点侧)主动连接 API 服务器
端点API 服务器的 HTTPS 端口(默认 443)
认证kubelet 使用客户端证书(--kubeconfig 指定的凭据)向 API 服务器认证
连通性要求节点必须能访问 API 服务器的 443 端口;反向不需要

kubelet 通过这条连接完成:注册节点、上报节点状态与心跳(Lease 续约)、watch 与自身相关的对象(Pod 清单变化、Secret 挂载等)、上报事件与指标。

控制器和调度器到 API 服务器​

与 kubelet 类似,控制器(包括节点控制器在内的 kube-controller-manager 内的各类控制器)和调度器也都通过 API 服务器提供的 watch 机制来观察资源状态:

组件通信机制
控制器(kube-controller-manager)通过 API 服务器 watch 资源(如 Node、Pod、Deployment),基于观察到的差异执行调和(reconcile)
调度器(kube-scheduler)watch 未调度 Pod,完成调度决策后写回 nodeName 绑定结果

这些连接同样需要认证与授权,通常使用 ServiceAccount 或客户端证书进行身份认证。

Lease 机制降低 apiserver 负载

在高可用部署中,kube-controller-manager 和 kube-scheduler 都通过 Lease(kube-system 命名空间下如 kube-controller-manager、kube-scheduler Lease 对象)来选主,只有 leader 副本实际执行调和与调度;同时节点心跳也用 Lease 对象替代高频的 .status 更新,显著降低了大规模集群下 API 服务器与 etcd 的压力。

通信路径加固速查​

路径默认状态加固手段
API 服务器 → kubeletHTTPS,但不校验服务证书kubelet 配 --tls-cert-file/--tls-private-key-file,API 服务器配 --kubelet-certificate-authority;启用 webhook 认证/授权
API 服务器 → 节点/Pod/ServiceHTTP 明文直连不可信网络中改为加密通道(TLS/mTLS)或经认证代理
kubelet → API 服务器HTTPS + 客户端证书正常即安全,确保 --kubeconfig 凭据保管妥当
控制器/调度器 → API 服务器HTTPS + 认证同上,按 RBAC 最小授权

我的总结与避坑清单​

  1. 整个集群只有一种通信模式:一切连 API 服务器(hub-and-spoke)。排查通信问题先分清方向——"节点 → apiserver"不通通常是证书/网络策略问题,"apiserver → kubelet"不通则看 10250 端口与防火墙。
  2. 生产环境必须补齐 --kubelet-certificate-authority,否则 apiserver 到 kubelet 的 HTTPS 连接不校验服务端证书,中间人攻击可截获 kubectl logs、kubectl exec 的全部内容。
  3. kubelet 的 AlwaysAllow 授权是高危默认值;开启 webhook 授权后,谁能在节点上 exec/attach 全部由 RBAC 管,记得给运维角色配 nodes/proxy 等最小权限。
  4. apiserver 直连 Pod IP / Service 的路径默认是明文 HTTP 且存在重定向绕过风险,跨不可信网络(如公网多集群、云上公开 IP)时要用 mTLS 或网络层加密兜底。
  5. 大规模集群优先用 Lease 心跳而非高频 .status 更新,kube-controller-manager 的 --node-monitor-period 保持默认 5 秒即可,盲目调小会把 apiserver 打爆。
  6. 节点只需要出方向访问 apiserver 443 端口,安全组不必给节点开入站 10250;入站 10250 仅控制面需要。
  7. 多副本 controller-manager/scheduler 靠 Lease 选主,看到 LeaderElection 日志轮转属于正常现象,不要手动干预。
🛡️本站已安全运行2334天23时18分58秒
Bottom GIF
Top GIF