2. Kubernetes集群架构回顾:Master节点组件、Worker节点组件、控制平面与数据平面交互流程

在深入值班基线核验之前,必须对Kubernetes集群的静态拓扑与动态交互有清晰的认知。本章从Master节点组件、Worker节点组件以及控制平面与数据平面的交互流程三个维度进行回顾,为后续的配置核验提供架构层面的上下文。

2.1 Master节点组件(控制平面)

Master节点承载集群的“大脑”——控制平面。所有集群级别的决策、状态存储与调度逻辑均在此执行。以下为核心组件及其职责:

组件 进程名称 核心职责 关键端口
kube-apiserver kube-apiserver 所有组件交互的唯一入口,提供RESTful API,执行认证、授权、准入控制 6443 (HTTPS)
etcd etcd 分布式键值存储,保存集群所有资源对象的状态(唯一有状态组件) 2379 (客户端), 2380 (peer)
kube-scheduler kube-scheduler 监听未调度的Pod,根据调度策略将其绑定到最合适的Worker节点 10259 (HTTPS)
kube-controller-manager kube-controller-manager 运行多个控制器(Node、Replication、Endpoint等),确保实际状态向期望状态收敛 10257 (HTTPS)
cloud-controller-manager cloud-controller-manager (可选)与云厂商API交互,管理负载均衡、存储卷、节点路由等云资源 10258 (HTTPS)
值班核验要点: 在基线核验中,需确认 kube-apiserver 的 --anonymous-auth 与 --enable-admission-plugins 参数是否合规;etcd 是否启用 TLS 双向认证;scheduler 与 controller-manager 的 --secure-port 是否开启。

2.2 Worker节点组件(数据平面)

Worker节点负责运行实际的应用容器。每个Worker节点必须运行以下三个核心组件:

  • kubelet:节点上的“代理”,负责与API Server通信,管理Pod的生命周期(创建、监控、重启),执行健康检查(liveness/readiness probe)。
  • kube-proxy:网络代理,维护节点上的网络规则(iptables/IPVS),实现Service的Cluster IP到后端Pod的负载均衡。
  • 容器运行时(Container Runtime):负责拉取镜像、启动/停止容器。常见实现包括 containerd、CRI-O、Docker Engine(已弃用)。
组件 进程名称 核心职责 关键端口
kubelet kubelet Pod生命周期管理、节点状态上报、资源监控 10250 (HTTPS), 10255 (只读, 建议关闭)
kube-proxy kube-proxy Service流量转发、会话保持、健康检查 10256 (健康检查)
容器运行时 containerd / dockerd / crio 容器镜像管理、容器执行、存储挂载 Unix Socket (如 /run/containerd/containerd.sock)
常见配置偏差: 值班核验中经常发现 kubelet 的 --read-only-port (10255) 未关闭,导致节点信息泄露;或 kube-proxy 的 --mode 被设置为性能较差的 userspace。基线应强制要求 --read-only-port=0 且 --mode=iptables 或 ipvs。

2.3 控制平面与数据平面交互流程

理解组件间的通信路径是诊断集群故障的基础。以下是一个典型的Pod创建流程,展示了控制平面与数据平面的完整交互:

  1. 用户提交:通过 kubectl 或 API 调用向 kube-apiserver 发送创建Pod的请求。
  2. 认证与准入:kube-apiserver 对请求进行认证、授权,并通过准入控制器(如 MutatingAdmissionWebhook、ValidatingAdmissionWebhook)进行校验与修改。
  3. 持久化:kube-apiserver 将Pod资源对象写入 etcd。
  4. 调度决策:kube-scheduler 通过 Watch 机制监听到未调度的Pod,执行预选与优选算法,将Pod绑定到某个Worker节点,并将绑定结果写回 kube-apiserver。
  5. 节点执行:目标Worker节点上的 kubelet 通过 Watch 机制发现Pod被调度到本节点,调用容器运行时(CRI)拉取镜像并启动容器。
  6. 网络配置:kubelet 调用CNI插件配置Pod网络;kube-proxy 根据Service变化更新节点上的iptables/IPVS规则。
  7. 状态回写:kubelet 持续监控Pod状态,并通过 kube-apiserver 更新Pod的 status 字段,最终持久化到 etcd。
控制平面与数据平面交互流程(Pod创建) 用户 / kubectl 控制平面(Master节点) kube-apiserver etcd kube-scheduler kube-controller-manager 数据平面(Worker节点) kubelet kube-proxy 容器运行时 (CRI) Pod / 容器 说明:实线箭头表示请求/创建路径;虚线箭头表示Watch回调或状态回写路径。

2.4 关键交互协议与端口矩阵

值班核验时,防火墙策略与网络策略(NetworkPolicy)的基线检查依赖于对组件间通信协议的准确理解。以下矩阵总结了核心交互:

源组件 目标组件 协议 目标端口 用途
kubelet (Worker) kube-apiserver HTTPS 6443 节点注册、Pod状态上报、Watch指令
kube-scheduler kube-apiserver HTTPS 6443 监听未调度Pod、写入绑定结果
kube-controller-manager kube-apiserver HTTPS 6443 监听资源变化、执行控制循环
kube-apiserver etcd gRPC (TLS) 2379 读写集群状态数据
kubelet 容器运行时 gRPC (Unix Socket) CRI Socket 创建/管理容器
kube-proxy kube-apiserver HTTPS 6443 监听Service与Endpoint变化
kubelet 节点上的Pod HTTP/HTTPS Probe端口 执行liveness/readiness/startup探针
基线核验检查项:
  • 确认所有Master组件之间的通信均使用TLS(端口6443/10257/10259)。
  • 确认etcd的客户端端口(2379)仅对Master节点开放,禁止从Worker节点直接访问。
  • 确认kubelet的10250端口仅对Master节点网络可达,禁止匿名访问。
  • 确认kube-proxy的Cluster IP转发模式(iptables/IPVS)与集群规模匹配。
组件间通信端口与协议矩阵 Master节点 kube-apiserver 端口: 6443 (HTTPS) etcd 端口: 2379 (gRPC+TLS) kube-scheduler 端口: 10259 (HTTPS) kube-controller-manager 端口: 10257 (HTTPS) Worker节点 kubelet 端口: 10250 (HTTPS) kube-proxy 端口: 10256 (健康检查) 容器运行时 (CRI) Socket: /run/containerd/containerd.sock Pod 端口: Probe端口 注意:所有控制平面组件之间的通信必须使用HTTPS/gRPC+TLS;kubelet与API Server之间必须双向认证。

2.5 值班视角下的架构核验清单

基于上述架构回顾,值班人员在执行基线核验时,应重点检查以下项目:

  • 组件进程存活检查:在Master节点上执行 systemctl status kube-apiserver kube-scheduler kube-controller-manager etcd;在Worker节点上执行 systemctl status kubelet kube-proxy。
  • 端口监听检查:使用 ss -tlnp 确认关键端口(6443, 2379, 10250, 10257, 10259)处于监听状态,且未暴露到非预期网络接口。
  • 证书有效期检查:检查 /etc/kubernetes/pki/ 下的 apiserver.crt、etcd/server.crt 等证书是否在有效期内。
  • etcd健康检查:执行 etcdctl endpoint health --cluster 确认etcd集群所有成员健康。
  • 节点状态检查:执行 kubectl get nodes 确认所有节点处于 Ready 状态。
快速诊断命令示例:
# 检查所有Master组件健康状态
kubectl get componentstatuses

# 检查节点状态与内核版本
kubectl get nodes -o wide

# 检查kubelet证书过期时间
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates

# 检查etcd集群成员列表
etcdctl member list --write-out=table