运维实战

Kubernetes v1.37 学习路线:架构、控制循环与完整进阶地图

从声明式 API、控制平面、节点组件和控制循环出发,建立从入门到生产运维的完整 Kubernetes 学习地图。

TY
Tycho
技术博主
• 2026-09-11 • 17 分钟阅读 • 7 次浏览
Kubernetes v1.37 学习路线:架构、控制循环与完整进阶地图

实验基线:Kubernetes v1.37.0、kubectl v1.37.0。先在测试环境执行,记录变更前状态与回滚点;生产集群不得直接照抄节点地址、网段、存储类或资源额度。

先理解 Kubernetes 在解决什么问题

Kubernetes 接收“期望状态”,持续把实际状态拉回期望状态。创建 Deployment 时,你提交的不是一串启动命令,而是一份可持久化的 API 对象;控制器观察对象,创建 ReplicaSet 与 Pod,调度器选择节点,kubelet 再让容器运行时落地。排障时应沿着这条控制链逐层定位,不能只盯着容器日志。

核心组件与数据流

组件职责首先检查
kube-apiserver所有资源操作的统一入口认证、授权、准入与 API 可用性
etcd保存集群状态成员健康、磁盘延迟、备份
scheduler为未绑定 Pod 选择节点事件、资源请求、亲和性与污点
controller-manager运行内置控制循环期望副本与实际副本差异
kubelet落实 PodSpec 并汇报节点状态容器运行时、镜像、探针、挂载
kube-proxy/数据面实现 Service 转发EndpointSlice、规则与 CNI

用三个命令建立观察习惯

kubectl api-resources
kubectl get nodes -o wide
kubectl get pods -A -o wide

api-resources告诉你资源是否 namespaced、简称和 API 组;后两条建立“集群—节点—工作负载”的基线。再用 kubectl get --raw='/readyz?verbose' 检查 API Server 依赖项。若无管理员权限,应由平台团队执行该检查。

13 章学习顺序

  1. 完成本章架构地图与实验约定。
  2. 搭建隔离实验环境,再掌握 kubeadm 生产检查。
  3. 熟练 kubectl 与 kubeconfig。
  4. 依次学习 Pod、工作负载、配置、网络、存储。
  5. 进入调度与伸缩、安全、可观测性。
  6. 最后理解 API/控制器,并完成升级、备份与灾备演练。

每一章都以“创建—观察—制造可控故障—恢复—清理”为闭环。只有能解释事件和状态变化,才算掌握,不以背命令为目标。

动手实验:跟踪一次 Deployment 的控制链

步骤 1:创建隔离命名空间和工作负载

kubectl create namespace architecture-lab
kubectl create deployment hello -n architecture-lab --image=nginx:1.27-alpine --replicas=2
kubectl expose deployment hello -n architecture-lab --port=80

预期会出现一个 Deployment、一个 ReplicaSet、两个 Pod、一个 Service 和对应 EndpointSlice。用 ownerReferences 观察资源归属:

kubectl get deploy,rs,pod,svc,endpointslice -n architecture-lab
kubectl get rs -n architecture-lab -o jsonpath='{range .items[*]}{.metadata.name}{" -> "}{.metadata.ownerReferences[0].kind}{"/"}{.metadata.ownerReferences[0].name}{"\n"}{end}'
kubectl get pod -n architecture-lab -o jsonpath='{range .items[*]}{.metadata.name}{" -> "}{.metadata.ownerReferences[0].kind}{"/"}{.metadata.ownerReferences[0].name}{"\n"}{end}'

你应看到 Deployment 管理 ReplicaSet,ReplicaSet 管理 Pod。Service 不直接创建 Pod,它只根据 selector 选择 Ready 后端。

步骤 2:制造期望状态偏差

POD=$(kubectl get pod -n architecture-lab -l app=hello -o jsonpath='{.items[0].metadata.name}')
kubectl delete pod "$POD" -n architecture-lab
kubectl get pod -n architecture-lab -w

ReplicaSet 控制器会补建新 Pod,这就是调谐循环。注意新 Pod 名称与 UID 都会变化,因此应用不能依赖 Pod 身份;需要稳定身份时使用 StatefulSet。

步骤 3:观察调度与节点执行

kubectl get pod -n architecture-lab -o custom-columns=NAME:.metadata.name,NODE:.spec.nodeName,PHASE:.status.phase,READY:.status.containerStatuses[0].ready
kubectl describe pod -n architecture-lab -l app=hello
kubectl get events -n architecture-lab --sort-by=.metadata.creationTimestamp

调度器只负责写入 spec.nodeName;真正拉镜像、建容器、执行探针并汇报状态的是目标节点 kubelet。遇到 Pending 看调度事件,遇到 ContainerCreating 看 kubelet、CNI、CSI 和镜像拉取。

组件故障与影响范围

故障已有业务新变更处置重点
API Server 不可用现有容器通常继续运行查询、发布和调度受阻负载均衡、证书、etcd 连通性
scheduler 不可用已绑定 Pod 不受影响新 Pod 保持 Pending调度器日志和租约
controller-manager 不可用现有副本继续副本补偿和节点驱逐停止领导选举与工作队列
etcd 高延迟数据面可能继续整个控制面变慢磁盘 fsync、成员和空间
kubelet 不可用容器可能暂时继续节点状态、探针和新 Pod 失控运行时、磁盘、证书、cgroup

本章验收题

  1. 画出从 kubectl 到容器运行的调用链,并指出哪些步骤会写 etcd。
  2. 删除 Pod 后解释是谁补建、调度器做了什么、kubelet做了什么。
  3. 执行 kubectl delete namespace architecture-lab,确认实验资源全部清理。

可复现记录模板

每次实验记录:集群版本、容器运行时、CNI/CSI 版本、命名空间、使用的 YAML Git 提交、开始与结束时间。命令输出至少保留对象状态、事件、关键日志和回滚结果。文中的占位符必须替换成自己的值,生产执行前应由第二人复核。

故障处理原则

  1. 先缩小影响面,不删除现场。
  2. 按对象状态—事件—日志—依赖顺序收集证据。
  3. 提出可证伪假设,一次只改变一个变量。
  4. 验证恢复后清理临时权限、调试 Pod、端口转发和测试数据。

完成检查

  • 命令退出码为 0,目标对象状态与预期一致。
  • 保存执行前后 YAML、事件与关键日志,确认没有把测试命名空间以外的对象改动。
  • 故障演练完成后执行清理或回滚,再进行下一章。

官方资料

TY

Tycho

热爱分享技术知识,帮助开发者成长。

评论 (0)

评论功能当前已关闭
暂无评论,快来抢沙发吧!