Kubernetes 容器云学习路线总览
·
9 分钟阅读
kubernetes职业技能大赛容器云学习路线实操驱动
🚀 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 集群
🏗️ 学习方法论
每日节奏:
理论精讲(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 套完整赛题 + 限时挑战 + 全真模拟 | 🟢 冲刺 |
📁 文档目录
| 模块 | Day | 文章标题 |
|---|
| M1 集群架构与搭建 | Day 01 | 集群架构原理与环境准备 |
| Day 02 | 多节点集群与节点管理 |
| Day 03 | 集群运维与 kubectl 精通 |
| M2 Pod 与核心工作负载 | Day 04 | Pod 生命周期与多容器模式 |
| Day 05 | Deployment 与 ReplicaSet |
| Day 06 | DaemonSet、StatefulSet、Job、CronJob |
| Day 07 | Pod 资源综合实战 |
| M3 网络与服务发现 | Day 08 | Service 与集群内服务发现 |
| Day 09 | Ingress 与外部流量接入 |
| Day 10 | 网络策略与 CNI 原理 |
| Day 11 | 网络综合实战 |
| M4 存储与配置管理 | Day 12 | ConfigMap 与 Secret |
| Day 13 | Volume 与 PV/PVC |
| Day 14 | StorageClass 与动态供给 |
| Day 15 | 存储综合实战 |
| M5 调度与资源管理 | Day 16 | 调度策略与亲和性 |
| Day 17 | 资源限制与 QoS |
| Day 18 | 调度综合实战 |
| M6 安全与认证 | Day 19 | RBAC 权限控制 |
| Day 20 | ServiceAccount 与镜像安全 |
| Day 21 | 安全综合实战 |
| M7 监控日志与排错 | Day 22 | Prometheus 监控体系 |
| 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 | 全真模拟考试 |
📚 实践题目来源与参考
一级来源(官方权威)
二级来源(考试与竞赛)
三级来源(练习平台)
| 来源 | 说明 |
|---|
| 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 分钟回顾前一天的笔记。每周日做一次周总结,梳理模块间的关联。
本文采用 CC BY-NC-SA 4.0
更多链接
返回顶部