Appearance
Kubernetes 21天精通计划
学习概览
| 阶段 | 主题 | 天数 | 核心产出 |
|---|---|---|---|
| 🌱 第一周 | 核心基础 | Day 1-7 | 完整集群环境 + LNMP部署 |
| 🚀 第二周 | 进阶核心 | Day 8-14 | 自动扩缩容 + 高级调度 |
| 🏭 第三周 | 生产运维 | Day 15-21 | GitOps + CKA备考 |
每日学习节奏
| 时段 | 内容 | 关键动作 |
|---|---|---|
| Hour 1 | 理论学习 | 阅读官方文档,画架构图,记录疑问 |
| Hour 2-3 | 动手实操 | Kind集群+K9s,故意制造错误观察现象 |
| Hour 4 | 复盘总结 | 用自己的话写解释,整理YAML到仓库 |
第一周:核心基础
目标:掌握Kubernetes核心对象,搭建完整集群环境
Day 1:环境搭建与工具链
📋 任务清单
- [ ] 安装 Kind、K9s、Lens、Helm
- [ ] 创建3节点Kind集群
- [ ] 配置kubectl多上下文切换
- [ ] 熟悉K9s终端操作
🔧 核心命令
点击查看:创建生产级多节点集群
bash
# 创建生产级多节点集群
kind create cluster --name prod-like --config - <<'EOF'
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
kubeadmConfigPatches:
- |
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "ingress-ready=true"
extraPortMappings:
- containerPort: 80
hostPort: 80
- containerPort: 443
hostPort: 443
- role: worker
labels:
tier: frontend
zone: zone-a
- role: worker
labels:
tier: backend
zone: zone-b
- role: worker
labels:
tier: database
zone: zone-c
EOF📝 今日产出
| 产出物 | 说明 |
|---|---|
| 工具就绪清单 | Kind + K9s + Lens + Helm 安装确认 |
| 集群拓扑图 | 1控制平面 + 3工作节点架构 |
| K9s快捷键笔记 | 常用操作速查 |
Day 2:Pod深度掌握
📋 任务清单
- [ ] 理解Pod生命周期与重启策略
- [ ] 配置Liveness/Readiness/Startup探针
- [ ] 模拟探针失败,观察Pod行为
- [ ] 故障排查流程文档
🔧 核心配置
点击查看:探针实战配置
yaml
apiVersion: v1
kind: Pod
metadata:
name: probe-demo
spec:
containers:
- name: app
image: nginx
livenessProbe: # 存活探针:失败则重启容器
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 3
readinessProbe: # 就绪探针:失败则从Service摘除
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 3
startupProbe: # 启动探针:保护慢启动应用
httpGet:
path: /startup
port: 80
failureThreshold: 30
periodSeconds: 10🎯 关键概念
| 探针类型 | 作用 | 失败行为 |
|---|---|---|
livenessProbe | 检查容器是否存活 | 重启容器 |
readinessProbe | 检查是否可接收流量 | 从Service端点移除 |
startupProbe | 保护慢启动应用 | 禁用其他探针直到成功 |
Day 3:Deployment与滚动更新
📋 任务清单
- [ ] 理解Deployment与ReplicaSet关系
- [ ] 配置滚动更新策略
- [ ] 执行版本升级与回滚
- [ ] 实现手动金丝雀发布
🔧 核心命令
bash
# 观察滚动更新过程
kubectl set image deployment/web nginx=nginx:1.20 --record
kubectl rollout status deployment/web -w
kubectl rollout history deployment/web
kubectl rollout undo deployment/web --to-revision=1
# 金丝雀:通过调整replica实现比例控制
kubectl scale deployment/web-v1 --replicas=8
kubectl scale deployment/web-v2 --replicas=2📊 更新策略对比
| 策略 | 配置 | 适用场景 |
|---|---|---|
| RollingUpdate | maxSurge: 1, maxUnavailable: 0 | 零停机更新 |
| Recreate | 先删除再创建 | 不允许并行运行 |
| 自定义 | 控制速率和并发 | 大规模集群 |
Day 4:Service与网络基础
📋 任务清单
- [ ] 掌握4种Service类型
- [ ] 验证集群DNS解析
- [ ] 理解Endpoint与Service关系
- [ ] 网络拓扑实验
🔧 实验矩阵
| Service类型 | 适用场景 | 验证命令 |
|---|---|---|
ClusterIP | 集群内部通信 | kubectl run test --rm -it --image=busybox -- wget -O- http://svc-name |
NodePort | 外部临时访问 | curl localhost:30080 |
Headless | 直接访问Pod | nslookup svc-name 返回所有Pod IP |
ExternalName | 外部服务映射 | CNAME验证 |
Day 5:ConfigMap与Secret
📋 任务清单
- [ ] 配置分离原理
- [ ] 4种注入方式实践
- [ ] 热更新机制
- [ ] 配置管理规范
🔧 注入方式对比
| 方式 | 命令示例 | 特点 |
|---|---|---|
| 环境变量 | --from-literal=key=value | 简单,不支持热更新 |
| Volume挂载 | volumeMounts | 支持热更新,文件形式 |
| SubPath | subPath: config.conf | 挂载单个文件 |
| Template | 配置中引用 | 动态渲染 |
Day 6:存储系统
📋 任务清单
- [ ] PV/PVC/StorageClass关系
- [ ] 动态PV创建
- [ ] 部署有状态应用(MySQL)
- [ ] 多节点调度验证
🔧 关键命令
bash
# 查看Kind默认StorageClass
kubectl get sc standard -o yaml
# 验证数据持久化
kubectl exec -it mysql-pod -- mysql -p -e "CREATE DATABASE test;"
# 删除Pod,重建后验证数据还在Day 7:周复盘与综合项目
📋 任务清单
- [ ] 部署完整LNMP栈
- [ ] 绘制知识图谱
- [ ] 整理kubectl备忘录
- [ ] 代码提交到GitHub
🏆 本周产出
📁 k8s-learning/
├── 📁 week-01/
│ ├── 📁 day-01-cluster/ # 集群配置
│ ├── 📁 day-02-pods/ # Pod模板
│ ├── 📁 day-03-deployment/ # 部署配置
│ ├── 📁 day-04-service/ # 网络配置
│ ├── 📁 day-05-config/ # 配置管理
│ ├── 📁 day-06-storage/ # 存储方案
│ └── 📁 day-07-project/ # LNMP完整项目
└── 📄 README.md第二周:进阶核心
目标:掌握高级调度、网络策略、自动扩缩容
Day 8:Ingress与流量管理
📋 任务清单
- [ ] Ingress控制器原理
- [ ] 多域名与HTTPS配置
- [ ] URL重写与流量分割
- [ ] 金丝雀发布实践
🔧 高级路由配置
点击查看:基于权重的金丝雀发布
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: canary
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-v2
port:
number: 80Day 9:StatefulSet与有状态应用
📋 任务清单
- [ ] StatefulSet特性:稳定标识、有序部署
- [ ] 部署MySQL主从
- [ ] 部署Redis集群
- [ ] 存储管理策略
📊 StatefulSet vs Deployment
| 特性 | StatefulSet | Deployment |
|---|---|---|
| Pod名称 | 有序、可预测 | 随机哈希 |
| 存储 | 独立PV,跟随Pod | 共享或无状态 |
| 启动顺序 | 顺序启动,逆序停止 | 并行 |
| 网络标识 | 稳定DNS | 临时 |
Day 10:DaemonSet与Job系统
📋 任务清单
- [ ] DaemonSet(日志/监控代理)
- [ ] Job执行模式与重试策略
- [ ] CronJob定时任务
- [ ] 并行Job与工作队列
Day 11:RBAC权限系统
📋 任务清单
- [ ] User/ServiceAccount区别
- [ ] Role/ClusterRole设计
- [ ] 多租户环境配置
- [ ] 最小权限原则实践
🔧 实战场景
bash
# 创建只能查看特定namespace的开发者账号
kubectl create namespace dev-team
kubectl create serviceaccount dev-user -n dev-team
kubectl create role developer --verb=get,list,watch --resource=pods,deployments -n dev-team
kubectl create rolebinding dev-binding --role=developer --serviceaccount=dev-team:dev-user -n dev-teamDay 12:NetworkPolicy网络策略
📋 任务清单
- [ ] 零信任网络理念
- [ ] 默认拒绝策略
- [ ] 命名空间隔离
- [ ] 微服务白名单
Day 13:资源调度高级技巧
📋 任务清单
- [ ] 资源请求/限制与QoS
- [ ] 节点亲和性
- [ ] Pod亲和/反亲和
- [ ] 拓扑分布约束
🔧 反亲和配置示例
点击查看:Pod分散调度
yaml
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values: ["web"]
topologyKey: kubernetes.io/hostnameDay 14:周复盘与HPA自动扩缩容
📋 任务清单
- [ ] 部署Metrics Server
- [ ] 配置CPU/内存HPA
- [ ] 自定义指标扩缩容
- [ ] 整理YAML模板库
🔧 HPA配置
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70第三周:生产运维与生态
目标:掌握Helm、监控、GitOps,通过CKA考试
Day 15:Helm包管理
📋 任务清单
- [ ] Helm架构与Chart结构
- [ ] 编写自定义Chart
- [ ] 可配置化部署
- [ ] Hook与升级策略
🎯 实战任务
将Day 7的LNMP栈改造为Helm Chart
Day 16:监控与可观测性
📋 任务清单
- [ ] Prometheus+Grafana架构
- [ ] 部署kube-prometheus-stack
- [ ] 配置告警规则
- [ ] 日志聚合方案
Day 17:故障排查实战
📋 任务清单
- [ ] 系统化排查方法论
- [ ] 10种常见故障场景
- [ ] 根因分析练习
- [ ] 故障案例库
🔥 故障清单
| 序号 | 故障现象 | 排查命令 |
|---|---|---|
| 1 | Pod Pending | kubectl describe pod, kubectl get events |
| 2 | ImagePullBackOff | kubectl describe pod, 检查镜像名/Secret |
| 3 | CrashLoopBackOff | kubectl logs --previous, kubectl describe |
| 4 | 服务无法访问 | kubectl get endpoints, kubectl port-forward |
| 5 | 节点NotReady | kubectl describe node, 检查kubelet |
| 6 | 存储挂载失败 | kubectl get pv,pvc, kubectl describe pvc |
| 7 | OOMKilled | kubectl describe pod, 调整limits |
| 8 | Evicted | kubectl get pods --field-selector=status.phase=Failed |
| 9 | 证书过期 | kubeadm certs check-expiration |
| 10 | 网络策略阻断 | 临时删除NetworkPolicy测试 |
Day 18:安全加固
📋 任务清单
- [ ] Pod安全策略
- [ ] SecurityContext配置
- [ ] 网络隔离加固
- [ ] 镜像安全扫描
Day 19:备份与灾难恢复
📋 任务清单
- [ ] etcd备份原理
- [ ] Velero架构与部署
- [ ] 定时备份配置
- [ ] 跨云恢复演练
Day 20:GitOps与ArgoCD
📋 任务清单
- [ ] GitOps理念与工作流
- [ ] ArgoCD部署与配置
- [ ] 自动同步与健康检查
- [ ] Kustomize多环境管理
Day 21:CKA备考与职业规划
📋 任务清单
- [ ] CKA考试模拟(killer.sh)
- [ ] 云厂商K8s服务对比
- [ ] 制定后续学习计划
- [ ] 技术成长路线图
🎓 后续方向
mermaid
graph TD
A[CKA认证通过] --> B[深入方向]
B --> C[Operator开发]
B --> D[多集群管理]
B --> E[云原生安全]
B --> F[服务网格Istio]
B --> G[Serverless/Knative]配套资源
工具链
| 工具 | 用途 | 安装命令 |
|---|---|---|
| Kind | 本地K8s集群 | go install sigs.k8s.io/kind@latest |
| K9s | 终端UI | brew install k9s |
| Lens | 桌面GUI | winget install Mirantis.Lens |
| Helm | 包管理 | brew install helm |
| kubectl | 命令行工具 | 随Docker Desktop安装 |
学习资源
| 类型 | 推荐 |
|---|---|
| 官方文档 | kubernetes.io/docs |
| 互动教程 | K8s官方教程 |
| 书籍 | 《Kubernetes in Action》 |
| 模拟考试 | killer.sh |
| 社区 | CNCF Slack #kubernetes-users |
学习检查清单
Week 1 完成标准
- [ ] 能独立创建多节点Kind集群
- [ ] 能解释Pod生命周期和探针区别
- [ ] 能完成Deployment滚动更新和回滚
- [ ] 能部署LNMP完整应用栈
Week 2 完成标准
- [ ] 能配置Ingress多域名和HTTPS
- [ ] 能部署StatefulSet有状态应用
- [ ] 能设计RBAC多租户权限
- [ ] 能配置HPA自动扩缩容
Week 3 完成标准
- [ ] 能编写Helm Chart
- [ ] 能排查10种常见故障
- [ ] 能配置GitOps工作流
- [ ] 能完成CKA模拟考试
贡献与反馈
如果你发现任何问题或有改进建议,欢迎提交PR或Issue。
Happy Kubernetes Learning! 🚀
