🚀 Kubernetes 容器云 30 天学习路线
📜 计划公约
以下约定为学习计划的基础环境规范,每日操作基于此环境进行。违反约定可能导致环境不稳定或学习效果打折扣。
一、控制平面(Control Plane / Master 节点)
| 项目 |
最小规格 |
最佳规格 |
说明 |
| vCPU |
2 核 |
4 核 |
kube-apiserver、etcd 吃 CPU |
| 内存 |
4 GB |
8 GB |
etcd 需常驻 2GB+ 缓存 |
| 磁盘 |
40 GB |
100 GB SSD |
etcd 对磁盘 I/O 敏感,SSD 必备 |
| 操作系统 |
CentOS Stream 9 |
CentOS Stream 9 |
内核 5.14+,RHEL 兼容生态 |
| 内核版本 |
≥ 5.4 |
5.14+ |
支持 cgroup v2、eBPF |
| 主机名 |
k8s-master |
— |
部署后不可更改 |
| 网络 |
仅主机 / NAT |
— |
内网 IP 固定,不做 DHCP |
为什么控制平面对磁盘敏感? etcd 是 K8s 的”大脑”,所有集群状态都存储在 etcd 中。etcd 使用 Raft 共识算法,每次写操作都需要 fsync 落盘。如果磁盘 I/O 不足(如使用 HDD 或云盘低 IOPS),etcd 的 fsync 延迟会飙升,导致:
- kube-apiserver 响应超时(默认 3s)
- 控制器反复重启
- 集群”脑裂”风险增大
经验值: etcd 所在的磁盘建议 ≥ 500 IOPS,云环境选择 “SSD 云盘”或”性能型云盘”,切勿选”高效云盘”。
二、计算平面(Compute Plane / Worker 节点)
| 项目 |
最小规格(×2 台) |
最佳规格(×2 台) |
说明 |
| vCPU |
2 核 |
4 核 |
运行业务 Pod |
| 内存 |
2 GB |
8 GB |
内存是 Pod 调度瓶颈 |
| 磁盘 |
40 GB |
100 GB SSD |
容器镜像 + 本地存储 |
| 操作系统 |
CentOS Stream 9 |
CentOS Stream 9 |
与 Master 保持一致 |
| 内核版本 |
≥ 5.4 |
5.15+ |
— |
| 主机名 |
k8s-worker1 / k8s-worker2 |
— |
唯一标识 |
三、集群总资源预算
| 方案 |
Master |
Worker × 2 |
总计 |
月费用参考(大陆云厂商) |
| 最小方案 |
2C4G40G |
2C2G40G |
6C8G120G |
约 ¥200-300/月 |
| 推荐方案 |
4C8G100G |
4C8G100G |
12C24G300G |
约 ¥500-800/月 |
| 竞赛模拟方案 |
4C8G100G |
4C8G100G × 3 |
16C32G400G |
约 ¥800-1200/月 |
省钱技巧:
- 使用竞价实例/抢占式实例(价格低 60%-80%),学习时段避开竞价回收高峰
- 不做实验时关机,云盘按量计费保留数据
- 选择新用户首购优惠(通常 1C1G 起步的低配机型不合算,直接上 4C8G)
四、操作系统与环境公约
| 约定项 |
必须执行 |
原因 |
| 禁用 Swap |
swapoff -a + 注释 /etc/fstab |
kubelet 强制要求,Swap 会破坏 Pod 内存 QoS |
| 关闭防火墙 |
systemctl stop firewalld && systemctl disable firewalld(学习环境) |
简化网络配置;生产环境应开放特定端口 |
| 禁用 SELinux |
setenforce 0 + 编辑 /etc/selinux/config 为 SELINUX=permissive |
避免容器权限问题;CentOS 默认启用 SELinux |
| 加载内核模块 |
br_netfilter、overlay |
容器网络和存储驱动依赖 |
| 网络参数 |
net.bridge.bridge-nf-call-iptables = 1 |
桥接流量经 iptables 处理(Service 转发依赖) |
| 容器运行时 |
containerd ≥ 1.6 |
更轻量,CKA/CKS 官方推荐 |
| K8s 版本 |
v1.28 ~ v1.30 |
与大赛考纲对齐,不要追新 |
| CNI 插件 |
Calico |
支持 NetworkPolicy,大赛高频考点 |
| Snap 卸载 |
不适用(CentOS 无 Snap) |
Snap 为 Ubuntu 专有,CentOS 无需处理 |
| 时区/NTP |
timedatectl set-timezone Asia/Shanghai |
日志时间一致,排错不迷路 |
以上为环境规格约定,具体搭建步骤见 Day 01 动手实操。
📋 适用对象
- 起点:掌握 Docker 基础(Dockerfile、docker-compose、镜像构建)
- 目标:职业技能大赛 Kubernetes 容器云方向
- 时间:1-2 个月,每天约 4 小时
- 环境:云服务器搭建 1 master + 2 worker 集群
🏗️ 学习方法论
1 2 3 4 5 6 7 8 9
| 每日节奏: 理论精讲(20%)→ 动手实操(50%)→ 排错练习(15%)→ 赛题模拟(15%)
具体时间分配(240 分钟/天): ├── 理论精讲 ~30 分钟 ├── 演示示范 ~20 分钟 ├── 动手实操 ~120 分钟 ├── 排错练习 ~30 分钟 └── 赛题模拟 ~40 分钟
|
📦 模块总览
| 模块 |
主题 |
天数 |
入口 |
核心实操 |
权重 |
| M1 |
集群架构与搭建 |
3 天 |
Day 01→03 |
手动部署 3 节点集群、etcd 备份、版本升级 |
🔵 基础 |
| M2 |
Pod 与核心工作负载 |
4 天 |
Day 04→07 |
管理 Deployment/StatefulSet/DaemonSet/Job/CronJob |
🔴 核心 |
| M3 |
网络与服务发现 |
4 天 |
Day 08→11 |
Service/Ingress/NetworkPolicy/CNI 配置 |
🔴 核心 |
| M4 |
存储与配置管理 |
4 天 |
Day 12→15 |
PV/PVC/ConfigMap/Secret/StorageClass |
🔴 核心 |
| M5 |
调度与资源管理 |
3 天 |
Day 16→18 |
亲和性/污点容忍/HPA/资源限制/QoS |
🟡 进阶 |
| M6 |
安全与认证 |
3 天 |
Day 19→21 |
RBAC/ServiceAccount/PodSecurity/镜像安全 |
🟡 进阶 |
| M7 |
监控日志与排错 |
3 天 |
Day 22→24 |
Prometheus/EFK/故障注入/排错方法论 |
🟡 进阶 |
| M8 |
综合实战与赛题模拟 |
6 天 |
Day 25→30 |
8 套完整赛题 + 限时挑战 + 全真模拟 |
🟢 冲刺 |
📁 文档目录
📚 实践题目来源与参考
一级来源(官方权威)
二级来源(考试与竞赛)
三级来源(练习平台)
| 来源 |
说明 |
| Play with Kubernetes |
https://labs.play-with-k8s.com — 免费在线 K8s 沙箱(4 小时/次) |
| Katacoda → Killercoda |
https://killercoda.com — 在线交互式 K8s 场景练习 |
| Minikube 本地环境 |
minikube start --cpus=4 --memory=8192 — 无云服务器时的本地替代 |
| Kind (K8s in Docker) |
kind create cluster — Docker 里跑多节点集群,网络策略测试友好 |
四级来源(书籍与社区)
| 来源 |
说明 |
| 《Kubernetes in Action》第二版 |
最经典 K8s 书籍,概念讲得最透 |
| 《Kubernetes 权威指南》 |
中文版,实操性强 |
| Kubernetes Slack (#kubernetes-users) |
全球最大 K8s 社区,排错求助响应快 |
| Stack Overflow (kubernetes 标签) |
搜索错误信息,大概率已有答案 |
| CNCF Landscape |
https://landscape.cncf.io — 了解 K8s 生态全貌 |
实践建议: CKA 模拟题是最接近大赛实操题的资源。按模块刷 CKA 真题,每题限时 5-10 分钟,重点训练命令行速度(kubectl 补全 + 别名 + 速记 YAML 模板)。大赛中 80% 的题都是”给一段描述 → 输出 YAML → 部署 → 验证”,与 CKA 完全一致。
📋 核心命令速查(命令 → 功能 → 注解)
以下命令按模块组织,每条命令附带详细功能注解。建议:
- 日训 3-6 条,每条命令在终端执行并理解输出
- 熟记 12 个最常用子命令(get/describe/create/apply/delete/logs/exec/explain/edit/scale/rollout/taint),它们是排错和赛题的骨架
kubectl 基础(M1)
| 命令 |
功能 |
注解 |
kubectl cluster-info |
查看集群 Master 与 CoreDNS 地址 |
验证集群是否可用,输出 apiserver + DNS 地址即正常 |
kubectl version |
查看客户端与服务端版本 |
客户端 kubectl 与 apiserver 版本偏差不超过 ±1 个小版本(v1.28+ 已移除 –short 标志) |
kubectl get nodes |
列出所有节点 |
STATUS 必须为 Ready;NotReady 意味节点失联或 CNI 未就绪 |
kubectl get nodes -o wide |
节点列表 + 内网 IP/OS/内核/运行时 |
查看节点的网络可达性和运行时版本,排错第一步 |
kubectl describe node <node> |
节点详细信息 |
查看 Conditions(内存/磁盘压力)、Taints、已分配资源;排错必用 |
kubectl get ns |
列出所有命名空间 |
kube-system 存放集群组件;default 是用户默认空间 |
kubectl get pods -A |
列出所有命名空间的 Pod |
-A = --all-namespaces,全局视图快速定位问题 |
kubectl get pods -n kube-system |
查看系统组件 Pod |
etcd/apiserver/controller-manager/scheduler/coredns 的运行状态 |
kubectl get pods -o wide |
Pod 列表 + 节点 + IP |
快速定位 Pod 运行在哪台节点,IP 是什么 |
kubectl describe pod <pod> |
Pod 详细信息 |
查看 Events(启动失败原因就在这里)、挂载卷、容器状态 |
kubectl logs <pod> |
查看 Pod 日志(单容器) |
最常用排错命令;-f 实时跟踪 |
kubectl logs <pod> -c <container> |
查看指定容器日志 |
多容器 Pod 必须用 -c 指定容器名 |
kubectl logs <pod> --tail=50 |
查看最后 50 行日志 |
避免刷屏,快速看最新输出 |
kubectl logs <pod> --since=5m |
查看最近 5 分钟日志 |
时间范围过滤,排查近期的异常 |
kubectl exec <pod> -- <cmd> |
进入容器执行命令 |
-- 分隔 kubectl 参数和容器内命令 |
kubectl exec -it <pod> -- /bin/sh |
交互式进入容器 |
相当于 docker exec -it,排错时进容器检查文件/网络 |
kubectl get all -n <ns> |
查看某命名空间所有资源 |
包含 Pod/Service/Deploy/RS,快速了解某个 NS 的全貌 |
kubectl explain pod.spec.containers |
查看资源字段文档 |
不需要翻官网,直接终端查字段含义和类型,写 YAML 神器 |
kubectl explain pod.spec --recursive |
递归查看所有子字段 |
全面了解一个资源的 YAML 结构 |
kubectl api-resources |
列出所有 API 资源类型 |
查看 K8s 支持哪些资源,包括 short name(如 svc/deploy/po) |
kubectl api-versions |
列出所有 API 版本 |
了解当前集群支持的 API Group 和版本 |
YAML 管理(M1)
| 命令 |
功能 |
注解 |
kubectl create deploy nginx --image=nginx --dry-run=client -o yaml |
生成 YAML 而不创建资源 |
--dry-run=client 本地校验不提交到集群;YAML 速成最佳技巧 |
kubectl apply -f file.yaml |
声明式创建/更新资源 |
优先用 apply 而非 create;apply 会 diff 合并,幂等安全 |
kubectl create -f file.yaml |
命令式创建资源 |
重复执行会报 “already exists”,非幂等 |
kubectl delete -f file.yaml |
按 YAML 删除资源 |
删除该 YAML 中定义的所有资源 |
kubectl edit deploy <name> |
直接编辑集群中的资源 |
实时生效;手快但危险,建议先 get -o yaml 备份 |
kubectl patch deploy <name> -p '{"spec":{"replicas":3}}' |
部分更新资源(JSON Patch) |
修改单个字段比 edit 更安全,适合脚本化操作 |
kubectl scale deploy <name> --replicas=5 |
快速扩缩副本数 |
等价于 kubectl edit 修改 replicas |
kubectl rollout status deploy <name> |
查看滚动更新进度 |
等待更新完成,常用于脚本中阻塞等待 |
kubectl rollout history deploy <name> |
查看部署历史 |
查看 revision 号,配合 --revision 查看具体变更 |
kubectl rollout undo deploy <name> |
回滚到上一个版本 |
回滚只回 deploy 模板,不回代码仓库 |
kubectl rollout undo deploy <name> --to-revision=2 |
回滚到指定版本 |
前提是该 revision 的历史还存在(默认保留 10 个) |
Pod 与工作负载(M2)
| 命令 |
功能 |
注解 |
kubectl get deploy,rs,pod |
同时查 Deploy/RS/Pod |
逗号分隔多资源类型,一次看清层级关系 |
kubectl get deploy -o wide |
Deployment + 镜像/标签/副本数 |
快速确认当前部署用了哪个镜像 |
kubectl set image deploy/<name> <container>=<new-image> |
更新 Deployment 的容器镜像 |
触发滚动更新,比 kubectl edit 效率高 |
kubectl get sts |
列出 StatefulSet |
short name: sts |
kubectl get ds |
列出 DaemonSet |
short name: ds |
kubectl get job,cronjob |
列出 Job 和 CronJob |
short name: cj |
kubectl delete pod <pod> --force --grace-period=0 |
强制立即删除 Pod |
卡在 Terminating 时的救急操作 |
kubectl top pods -A |
查看 Pod 实时资源用量 |
需要安装 metrics-server |
kubectl top nodes |
查看节点实时资源用量 |
判断节点是否资源紧张 |
kubectl cp <pod>:<path> <local-path> |
从 Pod 拷贝文件到本地 |
双向可操作(本地 → Pod 也支持) |
kubectl port-forward pod/<pod> 8080:80 |
本地端口转发到 Pod |
无需 Service/Ingress 即可本地访问 Pod 端口 |
网络与服务发现(M3)
| 命令 |
功能 |
注解 |
kubectl get svc,endpoints |
Service + 后端 Endpoints |
endpoints 显示 Pod IP 列表;为空说明 Selector 没匹配到 Pod |
kubectl expose deploy <name> --port=80 --target-port=8080 |
快速创建 Service 暴露 Deploy |
一键生成 ClusterIP 类型的 Service |
kubectl expose deploy <name> --type=NodePort --port=80 |
创建 NodePort Service |
节点 IP:NodePort 可外部访问 |
kubectl get ingress |
列出 Ingress 规则 |
需要安装 Ingress Controller(如 nginx-ingress) |
kubectl get networkpolicy |
列出网络策略 |
需要 CNI 支持(Calico 支持) |
kubectl run test --image=busybox --rm -it -- wget -O- http://svc-name |
临时 Pod 测试 Service 可达性 |
--rm 退出即删除;测试网络问题首选 |
kubectl exec <pod> -- nslookup <svc-name> |
验证 DNS 解析 |
CoreDNS 故障导致 Service 不可用的首要排查 |
kubectl exec <pod> -- curl -s http://<svc-name>.<ns>.svc.cluster.local |
验证全限定域名访问 |
FQDN 格式:<svc>.<namespace>.svc.cluster.local |
存储与配置(M4)
| 命令 |
功能 |
注解 |
kubectl get pv,pvc |
查看 PV 和 PVC |
STATUS: Bound 正常;Pending 说明没有 PV 能匹配 |
kubectl get sc |
列出 StorageClass |
动态供给的前提;默认 SC 标记为 (default) |
kubectl get cm,secret |
列出 ConfigMap 和 Secret |
Secret 值 base64 编码,get -o yaml 后 echo <值> | base64 -d 解码 |
kubectl create cm <name> --from-file=<path> |
从文件创建 ConfigMap |
配置文件完整挂载为 ConfigMap |
kubectl create cm <name> --from-literal=key=value |
从键值对创建 ConfigMap |
快速创建简单配置项 |
kubectl create secret generic <name> --from-literal=key=value |
创建 Opaque Secret |
值自动 base64 编码存储 |
kubectl create secret tls <name> --cert=cert.pem --key=key.pem |
创建 TLS Secret |
Ingress TLS 终端必须用此类型 Secret |
调度与资源管理(M5)
| 命令 |
功能 |
注解 |
kubectl taint node <node> key=value:NoSchedule |
给节点添加污点 |
默认只有 Toleration 匹配的 Pod 才能调度上去 |
kubectl taint node <node> key=value:NoSchedule- |
移除节点污点 |
末尾加 - 删除对应 Taint |
kubectl cordon <node> |
标记节点不可调度 |
等同于添加 node.kubernetes.io/unschedulable:NoSchedule |
kubectl uncordon <node> |
恢复节点可调度 |
取消 cordon 标记 |
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data |
驱逐节点上所有 Pod |
安全下线节点前必执行;DaemonSet 管理的 Pod 用 --ignore-daemonsets 跳过 |
kubectl label node <node> key=value |
给节点打标签 |
配合 nodeSelector/nodeAffinity 使用 |
kubectl get hpa |
查看水平自动扩缩器 |
当前 CPU/内存使用率与目标值对比 |
kubectl autoscale deploy <name> --min=2 --max=10 --cpu=80% |
创建 HPA |
基于 CPU 使用率自动扩缩 |
安全与认证(M6)
| 命令 |
功能 |
注解 |
kubectl auth can-i create pods |
检查当前用户是否有某权限 |
快速验证 RBAC 配置是否正确 |
kubectl auth can-i create pods --as=system:serviceaccount:ns:sa |
检查某 SA 是否有权限 |
调试 ServiceAccount 权限问题 |
kubectl get role,rolebinding |
列出命名空间级 RBAC |
Role 定义权限;RoleBinding 绑定到用户/SA |
kubectl get clusterrole,clusterrolebinding |
列出集群级 RBAC |
ClusterRole 全局权限(如节点、PV) |
kubectl create role <name> --verb=get,list --resource=pods -n <ns> |
快速创建 Role |
--verb 和 --resource 即可,无需手写 YAML |
kubectl create rolebinding <name> --role=<role> --serviceaccount=<ns>:<sa> |
快速创建 RoleBinding |
将 SA 与 Role 绑定 |
kubectl get sa |
列出 ServiceAccount |
每个 NS 有默认 default SA |
kubectl get podsecurity 或 kubectl get psa |
查看 Pod Security Admission |
1.25+ 替代 PSP 的机制 |
监控与排错(M7)
| 命令 |
功能 |
注解 |
kubectl describe pod <pod> | grep -A 10 Events |
只查看 Pod Events |
Events 是排错第一入口 |
kubectl get events --sort-by=.metadata.creationTimestamp |
按时间排序查看集群 Event |
全局视角看哪些资源在出问题 |
kubectl get events -w |
实时监听 Event |
-w = --watch,观察操作过程中触发的事件 |
kubectl get pods --field-selector=status.phase=Pending |
按状态筛选 Pod |
快速找到所有 Pending/Failed/Unknown Pod |
kubectl get pods --field-selector=spec.nodeName=<node> |
筛选某节点上的 Pod |
节点故障时快速定位受影响 Pod |
kubectl cluster-info dump | grep -A 20 "error|failed|Error" |
dump 集群诊断信息 |
输出包含所有组件的日志摘要 |
journalctl -u kubelet -f |
查看 kubelet 日志(节点) |
kubelet 是节点代理,Pod 启停失败根因在 kubelet 日志 |
crictl ps -a |
列出所有容器(含已退出) |
K8s 1.24+ 不再支持 docker,用 crictl 替代;排错 Pod 启动失败 |
crictl logs <container-id> |
查看容器日志(crictl 方式) |
在 kubectl logs 不可用时(如容器还没启动)的备选 |
kubectl -n kube-system logs kube-apiserver-<node> |
查看 apiserver 日志 |
apiserver 是集群入口,大量 5xx 错误根因在此 |
集群运维(M1/M8)
| 命令 |
功能 |
注解 |
kubeadm token create --print-join-command |
生成 Worker 加入命令 |
24h 有效;过期后重新执行 |
kubeadm token list |
查看现有 Token |
无 Token 时 Worker 无法加入集群 |
kubeadm certs check-expiration |
查看证书过期时间 |
证书过期是生产常见故障,默认 1 年有效 |
kubeadm upgrade plan |
查看可升级版本 |
升级前必做;版本偏差 ≤ 1 个小版本 |
kubectl taint node <node> node-role.kubernetes.io/control-plane- |
去除 Master 污点以调度 Pod |
3 节点以下集群可让 Master 也跑 Pod(学习环境) |
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /backup/etcd-$(date +%F).db |
etcd 快照备份 |
必须指定 TLS 证书路径(kubeadm 部署的 etcd 标配 mTLS);设置 ETCDCTL_API=3 使用 v3 API |
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot status /backup/etcd-xxx.db |
查看快照状态 |
确认备份文件完整性和 etcd 版本信息 |
✅ 每日检查清单
💡 建议每天开始学习前,先花 5 分钟回顾前一天的笔记。每周日做一次周总结,梳理模块间的关联。