K8s 解决什么
Docker 解决"打包应用"。编排器(K8s)解决:
- 一个应用要跑 N 份 → 谁来调度
- 一个 Pod 挂了 → 谁来拉起
- 一个版本要发新版 → 怎么不停服务发出去
- 配置 / 密钥 / 网络 → 怎么管
K8s 是事实标准(CNCF 毕业项目),不是唯一选择(Nomad / 云商托管 ECS / 最近的 K3s / Talos 各有场景)。生产 K8s 学习成本高——如果你不需要它解决的问题,先别上。
心智模型:声明式 + 控制循环
你写 YAML 描述目标状态,K8s 持续做 reconcile:
你声明: "myapp 要 3 份"
K8s 控制循环: 看现在 2 份 → 拉一份起来 → 检查
看现在 4 份(误启) → 干掉一份 → 检查
...
只要"实际"和"声明"有差距,控制循环就动。这条原则贯穿所有资源。
核心资源(一张图说清)
┌────────────────────────────────────────────────────────────┐
│ Cluster │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Namespace(逻辑隔离:dev / staging / prod / xxx) │ │
│ │ ┌─────────────────┐ ┌──────────────┐ │ │
│ │ │ Deployment │ │ Service │ │ │
│ │ │ ↓ 管理 │ │ ↓ 抽象 │ │ │
│ │ │ ReplicaSet │ │ │ │ │
│ │ │ ↓ 管理 │ │ │ │ │
│ │ │ Pods (1+ 容器) │←─┤ ClusterIP │ │ │
│ │ └─────────────────┘ └──────┬───────┘ │ │
│ │ ↑ │ │
│ │ ┌──────────────────────────┴──────┐ │ │
│ │ │ Ingress(外部 → Service) │ │ │
│ │ └──────────────────────────────────┘ │ │
│ │ ┌──────────────┐ ┌──────────────┐ │ │
│ │ │ ConfigMap │ │ Secret │(注入到 Pod) │ │
│ │ └──────────────┘ └──────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ Nodes(实际跑 Pod 的机器) │
└────────────────────────────────────────────────────────────┘
7 个最重要的对象
| 对象 | 一句话 |
|---|---|
| Pod | 最小调度单位,1+ 容器共享网络 / 卷 |
| Deployment | 声明"我要 N 份这个 Pod",自动管理升级 / 回滚 |
| ReplicaSet | Deployment 内部用——新手不用直接写 |
| Service | 给一组 Pod 一个稳定的 DNS 名 + 负载均衡 |
| Ingress | 7 层入口路由(HTTP host / path → Service) |
| ConfigMap | 非敏感配置(JSON / 文件 / 环境变量) |
| Secret | 敏感配置(base64 编码,不是加密) |
标签 / 选择器:松耦合的关键
# Deployment 给 Pod 打标
metadata:
labels:
app: myapp
env: prod
# Service 用标签选一组 Pod
spec:
selector:
app: myapp
env: prod
Service 不直接绑 Pod 名字 — 绑标签。Pod 来来去去,标签匹配的就纳入 Service。这是 K8s 解耦的核心机制。
几个新手常踩的坑
- 写 Pod 不写 Deployment:Pod 挂了不会自动拉起。99% 时候要写 Deployment。
- Service
type: LoadBalancer在裸金属不工作:要装 MetalLB 之类。云上自动开 LB。 - 没设资源 requests/limits:Pod 互相抢资源,节点挂连锁反应。
- 没写 readinessProbe:Pod 起来就接流量,但应用还没初始化好——503 海啸。
学习路径建议
1. 先在本地跑 minikube / kind / k3d 玩
2. 部署一个简单 Deployment + Service + Ingress
3. 加 ConfigMap / Secret
4. 加 readiness/liveness 探针
5. 加 HPA(自动扩容)
6. 上 Helm(下篇)
7. 上托管 K8s(EKS / GKE / ACK / TKE)
推荐阅读
- Kubernetes 官方文档 — 概念 / 任务 / 参考都齐
- Kubernetes the Hard Way — Kelsey Hightower 的经典实操,从零拼装 K8s 控制平面
- The Kubernetes Book (Nigel Poulton) — 入门最易读
- Programming Kubernetes (O'Reilly) — 想写 Operator/Controller 的进阶
下一篇:把这些概念落到 yaml 里,部署一个真的 Web 服务。