Kubernetes 学习路径:从心智模型到生产运维
使用方式
这条路径只挑三十多个页面,不是 K8s 分支的全部条目。先把这条走完,建立骨架,再按分类扩展;否则很容易在 274 个条目里迷路。
四个阶段按依赖顺序排列,每个阶段建议留 2–4 小时:
- 先读:按顺序读该阶段列出的页面,不要跳读。
- 再做:完成一个动手任务。看完不等于会,能不看页面做出来才算。
- 后测:合上页面,回答该阶段的过关问题。答不上来就回到对应页面。
学习路径不是读完就结束。真正留下来的是“遇到现象能判断往哪查”,所以每个阶段都要故意制造一次错误。
阶段一:建立心智模型
目标:能说清镜像、容器、Pod、Deployment、Service 之间的关系,知道 kubectl 在和谁说话。
阅读顺序:
- docker — 镜像和容器的区别,先建立“进程被隔离”的直觉。
- containerd — 集群里真正运行容器的组件,理解 CRI。
- pod — Kubernetes 的最小调度单元,为什么一个 Pod 可以有多个容器。
- deployment — 副本、滚动更新和 ReplicaSet 的关系。
- service — Pod IP 会变,Service 为什么能提供稳定入口。
- namespace — 逻辑隔离,以及“为什么
-n 总是忘”。
- kubectl — 唯一操作入口,先学会
get、describe、logs、events。
- kubeadm — 一个集群由 apiserver、etcd、scheduler、controller-manager、kubelet 组成。
- kind — 本地起集群,用于后面的动手任务。
动手任务:用 kind 起一个本地集群,部署 nginx,暴露 Service,并用 port-forward 访问。
kind create cluster --name learn
kubectl create deployment web --image=nginx:1.27
kubectl expose deployment web --port=80
kubectl get pods -o wide
kubectl port-forward svc/web 8080:80
过关标准:
- 能解释为什么删掉 Pod 后 Deployment 会创建新的 Pod,而 Service 的访问地址不变。
- 能用 label 找到一组 Pod,而不是靠名字猜。
- 知道
kubectl get events 和 kubectl describe 分别解决什么问题。
阶段二:能独立部署一个服务
目标:从镜像到可访问服务,能处理配置、密钥、存储、入口和打包。
阅读顺序:
- configmap — 配置和镜像分离。
- secret — 密钥不是普通配置;Base64 不是加密。
- pvc — 有状态服务为什么需要持久卷。
- storageclass — PVC 如何自动绑定到实际存储。
- nginx-ingress — 集群外的流量怎么进来。
- helm — 把一组 YAML 打包成可复用的 Chart。
- kustomize — 不写模板,用 overlay 管理环境差异。
- hpa — 什么时候扩容,扩的是副本还是资源。
动手任务:部署一个带 ConfigMap、Secret 和 PVC 的小应用,用 Ingress 暴露,再用 Helm 打包一次。
kubectl create namespace demo
kubectl -n demo create configmap app-config --from-literal=APP_MODE=prod
kubectl -n demo create secret generic app-secret --from-literal=DB_PASSWORD='change-me'
kubectl -n demo get configmap,secret,pvc,ingress
过关标准:
- Pod 重建后数据还在,能说出数据实际落在哪里。
- 配置和密钥没有写死在镜像里。
- Ingress 返回 200,且能指出请求经过的每一跳。
- 能解释
helm upgrade 和 kubectl apply 各自适合什么场景。
阶段三:能定位常见故障
目标:看到现象能按顺序查,不靠猜,也不上来就重启。
阅读顺序:
- k8s-troubleshooting-cheatsheet — 先建立排查顺序。
- pod-pending — 调度失败,容器还没启动。
- crashloopbackoff — 容器启动了但反复退出。
- imagepullbackoff — 镜像拉不到,先分清认证、网络和 tag。
- oom-killed — 被内核杀掉,不是应用自己退出。
- k8s-dns-failed — 服务名解析失败,先查 CoreDNS 再查 NetworkPolicy。
- k8s-pvc-pending — 存储绑定失败。
- probe-failed — 探针配置错误会让正常应用被重启。
- k8s-node-disk-pressure — 节点压力导致 Pod 被驱逐。
- kubectl-debug — 容器里没有 shell 时怎么查。
动手任务:在测试命名空间故意制造三种故障,每次先写下判断,再用 describe、events、logs 验证。
- 把镜像 tag 改成不存在的版本,观察
ImagePullBackOff。
- 把 readinessProbe 路径改成
/nope,观察 Pod 一直未就绪。
- 给容器设置 10Mi 内存限制并压测,观察
OOMKilled。
过关标准:
- 能区分
Pending、CrashLoopBackOff、ImagePullBackOff、OOMKilled 分别发生在哪个阶段。
- 知道
Pending 时 kubectl logs 为什么没有输出。
- 排查顺序固定为:
get → describe → events → logs,而不是先重启。
阶段四:能负责一个生产集群
目标:权限、隔离、可用性、可观测、发布、备份和升级都能说清楚。
阅读顺序:
- rbac — 谁能对什么资源做什么。
- networkpolicy — 默认全通,策略要显式写。
- resource-quota — 命名空间级别的资源上限。
- poddisruptionbudget — 节点维护时至少保留多少副本。
- cert-manager — 证书自动签发和续期。
- prometheus — 指标、告警和 SLO 的数据基础。
- argocd — Git 是唯一事实来源,发布可审计、可回滚。
- velero — 集群资源和 PV 的备份恢复。
- k8s-production-checklist — 上线前逐条自查。
- k8s-upgrade-checklist — 升级前逐条自查。
动手任务:在一个测试命名空间里配置 ResourceQuota、LimitRange、NetworkPolicy 和 PDB;用 Argo CD 同步一个应用;用 Velero 备份并恢复到新命名空间。
过关标准:
- 能回答“某个 ServiceAccount 能做什么”,而不是只看 YAML。
- 能解释节点 drain 时 PDB 如何影响可用性。
- 能说出发布失败后的回滚路径,以及数据能不能一起回滚。
- 能独立走完一遍生产上线检查清单。
常见误区
- 一上来学 Helm、Operator 或服务网格,却说不清 Pod 和 Service 的关系。
- 把
kubectl 当命令大全背,遇到故障仍然只会重启。
- 只看
kubectl get pods 的状态,不看 Events 和 describe。
- 在生产集群练手;学习阶段一律用 kind、minikube 或独立测试命名空间。
- 跳过 Linux 网络、DNS、存储基础,直接学 CNI 和 CSI。
- 追新工具,却没有完整走过一次“部署 → 故障 → 修复 → 回滚”。
读完自测
合上页面,先回答,再展开对照。
- 为什么顺序是 Pod → Deployment → Service,而不是先学 Helm?
- Pod 一直 Pending,
kubectl logs 为什么没有输出?应该先看什么?
- 负责一个生产集群,至少要说清哪四类事情?
答案
- Helm 只是把 Kubernetes 对象打包成模板的工具。不理解 Pod 如何被调度、Deployment 如何维持副本、Service 如何选中 Pod,学 Helm 只会变成背模板,出错时无法判断是哪一层的问题。
- Pending 表示 Pod 还没有被调度到节点,或者容器还没有创建,所以没有应用日志。先
kubectl describe pod 看 Events:资源不足、污点/亲和性不满足、PVC 未绑定、镜像太大等都会停在这一步。
- 权限与隔离(RBAC、NetworkPolicy、配额)、可用性与容量(副本、PDB、扩缩容)、可观测与告警(指标、日志、SLO)、发布与恢复(GitOps、回滚、备份、升级)。
相关条目