🚀 Kubernetes 容器云 30 天学习路线

📜 计划公约

以下约定为学习计划的基础环境规范,每日操作基于此环境进行。违反约定可能导致环境不稳定或学习效果打折扣。

一、控制平面(Control Plane / Master 节点)

项目最小规格最佳规格说明
vCPU2 核4 核kube-apiserver、etcd 吃 CPU
内存4 GB8 GBetcd 需常驻 2GB+ 缓存
磁盘40 GB100 GB SSDetcd 对磁盘 I/O 敏感,SSD 必备
操作系统CentOS Stream 9CentOS Stream 9内核 5.14+,RHEL 兼容生态
内核版本≥ 5.45.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 台)说明
vCPU2 核4 核运行业务 Pod
内存2 GB8 GB内存是 Pod 调度瓶颈
磁盘40 GB100 GB SSD容器镜像 + 本地存储
操作系统CentOS Stream 9CentOS Stream 9与 Master 保持一致
内核版本≥ 5.45.15+
主机名k8s-worker1 / k8s-worker2唯一标识

三、集群总资源预算

方案MasterWorker × 2总计月费用参考(大陆云厂商)
最小方案2C4G40G2C2G40G6C8G120G约 ¥200-300/月
推荐方案4C8G100G4C8G100G12C24G300G约 ¥500-800/月
竞赛模拟方案4C8G100G4C8G100G × 316C32G400G约 ¥800-1200/月

省钱技巧:

  • 使用竞价实例/抢占式实例(价格低 60%-80%),学习时段避开竞价回收高峰
  • 不做实验时关机,云盘按量计费保留数据
  • 选择新用户首购优惠(通常 1C1G 起步的低配机型不合算,直接上 4C8G)

四、操作系统与环境公约

约定项必须执行原因
禁用 Swapswapoff -a + 注释 /etc/fstabkubelet 强制要求,Swap 会破坏 Pod 内存 QoS
关闭防火墙systemctl stop firewalld && systemctl disable firewalld(学习环境)简化网络配置;生产环境应开放特定端口
禁用 SELinuxsetenforce 0 + 编辑 /etc/selinux/configSELINUX=permissive避免容器权限问题;CentOS 默认启用 SELinux
加载内核模块br_netfilteroverlay容器网络和存储驱动依赖
网络参数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 无需处理
时区/NTPtimedatectl set-timezone Asia/Shanghai日志时间一致,排错不迷路

以上为环境规格约定,具体搭建步骤见 Day 01 动手实操

📋 适用对象

  • 起点:掌握 Docker 基础(Dockerfile、docker-compose、镜像构建)
  • 目标:职业技能大赛 Kubernetes 容器云方向
  • 时间:1-2 个月,每天约 4 小时
  • 环境:云服务器搭建 1 master + 2 worker 集群

🏗️ 学习方法论

每日节奏:
  理论精讲(20%)→ 动手实操(50%)→ 排错练习(15%)→ 赛题模拟(15%)

具体时间分配(240 分钟/天):
  ├── 理论精讲     ~30 分钟
  ├── 演示示范     ~20 分钟
  ├── 动手实操     ~120 分钟
  ├── 排错练习     ~30 分钟
  └── 赛题模拟     ~40 分钟

📦 模块总览

模块主题天数入口核心实操权重
M1集群架构与搭建3 天Day 01→03手动部署 3 节点集群、etcd 备份、版本升级🔵 基础
M2Pod 与核心工作负载4 天Day 04→07管理 Deployment/StatefulSet/DaemonSet/Job/CronJob🔴 核心
M3网络与服务发现4 天Day 08→11Service/Ingress/NetworkPolicy/CNI 配置🔴 核心
M4存储与配置管理4 天Day 12→15PV/PVC/ConfigMap/Secret/StorageClass🔴 核心
M5调度与资源管理3 天Day 16→18亲和性/污点容忍/HPA/资源限制/QoS🟡 进阶
M6安全与认证3 天Day 19→21RBAC/ServiceAccount/PodSecurity/镜像安全🟡 进阶
M7监控日志与排错3 天Day 22→24Prometheus/EFK/故障注入/排错方法论🟡 进阶
M8综合实战与赛题模拟6 天Day 25→308 套完整赛题 + 限时挑战 + 全真模拟🟢 冲刺

📁 文档目录

模块Day文章标题
M1 集群架构与搭建Day 01集群架构原理与环境准备
Day 02多节点集群与节点管理
Day 03集群运维与 kubectl 精通
M2 Pod 与核心工作负载Day 04Pod 生命周期与多容器模式
Day 05Deployment 与 ReplicaSet
Day 06DaemonSet、StatefulSet、Job、CronJob
Day 07Pod 资源综合实战
M3 网络与服务发现Day 08Service 与集群内服务发现
Day 09Ingress 与外部流量接入
Day 10网络策略与 CNI 原理
Day 11网络综合实战
M4 存储与配置管理Day 12ConfigMap 与 Secret
Day 13Volume 与 PV/PVC
Day 14StorageClass 与动态供给
Day 15存储综合实战
M5 调度与资源管理Day 16调度策略与亲和性
Day 17资源限制与 QoS
Day 18调度综合实战
M6 安全与认证Day 19RBAC 权限控制
Day 20ServiceAccount 与镜像安全
Day 21安全综合实战
M7 监控日志与排错Day 22Prometheus 监控体系
Day 23日志收集与 EFK
Day 24故障排查实战
M8 综合实战与赛题模拟Day 25赛题模拟 1-3
Day 26赛题模拟 4-5
Day 27赛题模拟 6-7
Day 28赛题模拟 8 + 限时挑战
Day 29弱点回顾与强化
Day 30全真模拟考试

📚 实践题目来源与参考

一级来源(官方权威)

来源链接说明
Kubernetes 官方文档https://kubernetes.io/docs/home/所有概念的权威定义;每个资源都有 YAML 示例
Kubernetes 官方教程https://kubernetes.io/docs/tutorials/从零到集群部署的分步教程
kubectl 命令参考https://kubernetes.io/docs/reference/kubectl/每个命令的参数与用法
Kubernetes GitHubhttps://github.com/kubernetes/kubernetes源码级理解,Issues 中有大量排错案例
Kubernetes Bloghttps://kubernetes.io/blog/新特性、版本变更说明

二级来源(考试与竞赛)

来源说明
CNCF CKA 考纲https://github.com/cncf/curriculum — K8s 管理员认证,实操题与大赛高度重叠
CNCF CKAD 考纲https://github.com/cncf/curriculum — 应用开发者认证,侧重 Pod/Deploy/Config 实践
CNCF CKS 考纲https://github.com/cncf/curriculum — 安全专家认证,M6 安全模块核心参考
Killer Shell (CKA/CKAD)https://killer.sh — 付费模拟器,题目风格与真实考试一致
全国职业院校技能大赛官网历年赛题规程与样题(自行搜索"职业技能大赛 容器云")

三级来源(练习平台)

来源说明
Play with Kuberneteshttps://labs.play-with-k8s.com — 免费在线 K8s 沙箱(4 小时/次)
Katacoda → Killercodahttps://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 Landscapehttps://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 必须为 ReadyNotReady 意味节点失联或 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查看系统组件 Podetcd/apiserver/controller-manager/scheduler/coredns 的运行状态
kubectl get pods -o widePod 列表 + 节点 + 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 wideDeployment + 镜像/标签/副本数快速确认当前部署用了哪个镜像
kubectl set image deploy/<name> <container>=<new-image>更新 Deployment 的容器镜像触发滚动更新,比 kubectl edit 效率高
kubectl get sts列出 StatefulSetshort name: sts
kubectl get ds列出 DaemonSetshort name: ds
kubectl get job,cronjob列出 Job 和 CronJobshort 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,endpointsService + 后端 Endpointsendpoints 显示 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 和 PVCSTATUS: Bound 正常;Pending 说明没有 PV 能匹配
kubectl get sc列出 StorageClass动态供给的前提;默认 SC 标记为 (default)
kubectl get cm,secret列出 ConfigMap 和 SecretSecret 值 base64 编码,get -o yamlecho <值> | 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 SecretIngress 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列出命名空间级 RBACRole 定义权限;RoleBinding 绑定到用户/SA
kubectl get clusterrole,clusterrolebinding列出集群级 RBACClusterRole 全局权限(如节点、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 podsecuritykubectl get psa查看 Pod Security Admission1.25+ 替代 PSP 的机制

监控与排错(M7)

命令功能注解
kubectl describe pod <pod> | grep -A 10 Events只查看 Pod EventsEvents 是排错第一入口
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 污点以调度 Pod3 节点以下集群可让 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).dbetcd 快照备份必须指定 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 分钟回顾前一天的笔记。每周日做一次周总结,梳理模块间的关联。