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)

推荐阅读

下一篇:把这些概念落到 yaml 里,部署一个真的 Web 服务。