深色模式
K8s 架构与核心组件
摘要:本文从「一条 kubectl 命令背后发生了什么」切入,逐个拆解控制面与数据面的核心组件职责,并给出组件健康检查命令,帮助你在排障时能快速定位是哪一层出了问题。
适用环境
- 一个可用 K8s 集群(kubeadm 搭建或 kind/minikube 均可)
kubectl已配置好 kubeconfig- 控制面节点可执行
kubectl与查看静态 Pod
操作步骤
一、整体分层
text
控制面(Control Plane) 数据面(Worker Node)
┌──────────────────┐ ┌──────────────────┐
│ kube-apiserver │◄────────────┤ kubelet │
│ etcd │ │ kube-proxy │
│ kube-scheduler │ │ 容器运行时 │
│ controller-mgr │ │ Pod / Service │
│ cloud-controller │ └──────────────────┘
└──────────────────┘1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
二、控制面组件职责
| 组件 | 职责 | 挂了会怎样 |
|---|---|---|
kube-apiserver | 唯一对外入口,所有读写经它,做认证/鉴权/准入 | 集群完全不可管理 |
etcd | 保存集群全部状态(键值数据库) | 状态丢失,集群瘫痪 |
kube-scheduler | 给新 Pod 选节点 | 新 Pod 一直 Pending |
kube-controller-manager | 运行各类控制器(Deployment/Node/Service 等) | 不自愈、不扩缩 |
cloud-controller-manager | 对接云厂商负载均衡、磁盘 | 云资源不自动创建 |
三、数据面组件职责
| 组件 | 职责 |
|---|---|
kubelet | 管本节点 Pod 生命周期,上报节点状态,调 CRI 起容器 |
kube-proxy | 维护 Service 的转发规则(iptables/IPVS) |
| 容器运行时(containerd / CRI-O) | 真正拉取镜像、启停容器 |
四、一条命令的完整链路
bash
kubectl create deployment web --image=nginx1
- kubectl 把请求发给
kube-apiserver; - apiserver 通过准入控制后写入 etcd;
- Deployment 控制器 watch 到变化,创建 ReplicaSet;
- ReplicaSet 控制器创建 Pod 对象,写入 etcd(此时 Pod 无节点);
kube-scheduler发现未调度 Pod,按资源打分选节点,回写 etcd;- 目标节点
kubeletwatch 到属于自己的 Pod,调容器运行时拉镜像启动。
建议
理解这条链路就抓住了 K8s 的精髓:所有组件都不互相调用,只与 apiserver 通信,通过 etcd 的状态变化协同工作。排障时也遵循这个顺序逐段验证。
五、组件健康检查
bash
kubectl get componentstatuses # 部分版本已弃用
kubectl get --raw /healthz # apiserver 健康
kubectl -n kube-system get pods # 静态 Pod 形式的控制面
kubectl -n kube-system get pod -l component=kube-scheduler
kubectl get nodes -o wide1
2
3
4
5
2
3
4
5
kubeadm 集群的控制面组件以静态 Pod 形式运行,配置文件在:
bash
ls /etc/kubernetes/manifests/1
包含 kube-apiserver.yaml、etcd.yaml、kube-scheduler.yaml、kube-controller-manager.yaml。
六、查看各组件日志
bash
kubectl -n kube-system logs -l component=kube-apiserver --tail=50
kubectl -n kube-system logs kube-scheduler-<节点名>
# kubelet 不走 kubectl,用 journalctl
sudo journalctl -u kubelet -f1
2
3
4
2
3
4
验证
- [ ]
kubectl get --raw /healthz返回ok - [ ]
kubectl -n kube-system get pods全部 Running - [ ]
kubectl get nodes全部 Ready - [ ] 新建 Pod 后能在几秒内 Running(说明调度与 kubelet 正常)
常见坑
- 只看到 kube-system 的 Pod 却找不到 apiserver:说明是托管集群(云厂商管控面),控制面不在你的节点上,
kubectl get cs也会异常。 - 节点 NotReady 但控制面正常:问题在数据面,优先查
kubelet和容器运行时:systemctl status kubelet containerd。 - Pod 一直 Pending:多半是 scheduler 异常或资源不足,用
kubectl describe pod看 Events。 - 直接改
/etc/kubernetes/manifests/下的文件:kubelet 会立刻重建对应静态 Pod,误改会导致控制面中断。