16.1.2 控制平面(Control Plane)核心组件

控制平面负责集群全局状态管理与调度决策,核心组件包括 kube-apiserver、etcd、kube-scheduler、kube-controller-manager(以及可选的 cloud-controller-manager)。控制平面以声明式 API 驱动,所有对象状态通过 API 持久化到 etcd,并由控制器持续调谐。

文章图片

kube-apiserver
- 集群统一入口,负责认证、鉴权、准入控制与 API 聚合。
- 提供 REST 接口与 watch 机制,作为组件与客户端交互的唯一通道。
- 对象校验、默认值填充与版本转换在此完成。

示例:查看 API Server 运行参数与健康检查

# 常见静态 Pod 清单路径(kubeadm 环境)
sudo grep -E 'kube-apiserver|--advertise-address|--secure-port' /etc/kubernetes/manifests/kube-apiserver.yaml

# 健康检查
curl -k https://127.0.0.1:6443/healthz
curl -k https://127.0.0.1:6443/readyz?verbose

排错要点:
- 401/403:检查证书、RBAC、kubeconfig 的 user/cluster 匹配。
- 连接拒绝:确认 6443 端口监听、证书文件存在、kubelet 是否拉起静态 Pod。
- /readyz 失败:通常是 etcd 不可用或 webhook 超时。

etcd
- 分布式键值存储,持久化集群期望与实际状态。
- 强一致性与事务保障控制平面状态可靠性。
- 关键运维要点:备份、压缩、性能与安全。

示例:etcd 状态检查与备份

# 使用 kubeadm 默认证书路径(如有差异请按实际路径调整)
export ETCDCTL_API=3
ETCDCTL="etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key"

# 查看集群状态
$ETCDCTL endpoint status --write-out=table
$ETCDCTL endpoint health

# 备份快照
sudo mkdir -p /backup/etcd
$ETCDCTL snapshot save /backup/etcd/etcd-$(date +%F).db

排错要点:
- etcdserver: request timed out:检查磁盘延迟、etcd member 是否脑裂、网络抖动。
- x509 证书错误:核对证书/密钥与 endpoints 使用的地址匹配。

kube-scheduler
- 为未绑定 Pod 选择合适节点。
- 核心流程:过滤(Filter)、打分(Score)、绑定(Bind)。
- 依赖节点资源、亲和性/反亲和、污点/容忍等策略。

示例:观察调度决策与故障排查

# 创建一个需要较高资源的 Pod(可能触发 Pending)
cat > /tmp/big-pod.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
  name: big-pod
spec:
  containers:
  - name: c1
    image: nginx:1.25
    resources:
      requests:
        cpu: "4"
        memory: "8Gi"
EOF

kubectl apply -f /tmp/big-pod.yaml
kubectl get pod big-pod -o wide
kubectl describe pod big-pod | sed -n '/Events/,$p'

排错要点:
- FailedScheduling:查看事件中提示(资源不足、污点不容忍、亲和性冲突)。
- 调整方法:降低 requests、增加节点、添加 tolerations/affinity。

kube-controller-manager
- 运行多种控制器:Node、ReplicaSet、Deployment、Job、Endpoint、Namespace 等。
- 通过控制循环持续对比“期望状态”和“实际状态”并触发修正。
- 控制器间解耦,通过 API Server 与 etcd 协作。

示例:观察 Deployment 控制器的自愈

kubectl create deployment web --image=nginx:1.25 --replicas=2
kubectl get pods -l app=web

# 删除一个 Pod,观察控制器自动拉起
kubectl delete pod -l app=web --field-selector=status.phase=Running --wait=false
watch -n 1 "kubectl get pods -l app=web"

排错要点:
- 副本数不一致:检查控制器是否运行、是否被 PDB 或资源配额限制。

cloud-controller-manager(可选)
- 与云平台对接,管理负载均衡、路由、节点生命周期、存储等。
- 将云平台依赖从核心组件剥离,提升可移植性。

示例:查看是否启用 cloud-controller-manager

kubectl get pods -n kube-system | grep cloud-controller

关键工作机制
- 控制循环:Observe → Diff → Act。
- 状态存储:所有对象状态以资源对象形式存储在 etcd。
- 高可用:多副本 API Server 与控制器,etcd 集群化部署。

原理草图:控制循环

sequenceDiagram
  participant C as Controller
  participant API as kube-apiserver
  participant ET as etcd
  C->>API: watch/list 期望状态
  API->>ET: 读对象
  ET-->>API: 返回状态
  API-->>C: 期望与实际
  C->>API: patch/更新对象
  API->>ET: 写入状态

安装与部署示例(kubeadm 环境)

# 初始化控制平面(示例:指定 pod 网络)
sudo kubeadm init --pod-network-cidr=10.244.0.0/16

# 查看控制平面静态 Pod
kubectl get pods -n kube-system -o wide | egrep 'kube-apiserver|kube-scheduler|kube-controller-manager|etcd'

常见排错命令汇总

# 查看控制平面组件日志
kubectl logs -n kube-system kube-apiserver-$(hostname) | tail -n 50
kubectl logs -n kube-system kube-scheduler-$(hostname) | tail -n 50
kubectl logs -n kube-system kube-controller-manager-$(hostname) | tail -n 50
kubectl logs -n kube-system etcd-$(hostname) | tail -n 50

# 查看组件状态与事件
kubectl get componentstatuses
kubectl get events -A --sort-by=.metadata.creationTimestamp | tail -n 20

练习
1. 触发一个调度失败的 Pod,并根据事件输出给出解决方案(调低 requests 或添加节点)。
2. 使用 etcdctl 备份一次快照并验证文件大小。
3. 手动删除一个 Deployment 的 Pod,确认控制器能自动恢复副本数。