Skip to content

核心对象与控制器

这篇笔记聚焦 Kubernetes 最基础、也最容易只背名词不讲透的一条主线:

  1. Pod 是什么
  2. ReplicaSet 是什么
  3. Deployment 为什么重要
  4. 控制器 到底在控制什么

如果这条主线没有搞清楚,后面看 Service、Ingress、扩缩容和发布,都会缺少抓手。


1. 为什么 Kubernetes 要用“对象”来描述系统

Kubernetes 不是让你一条条手工执行容器管理命令,而是希望你声明:

  1. 我要跑什么
  2. 要跑多少个
  3. 用什么镜像
  4. 暴露什么端口
  5. 出故障后应该恢复到什么状态

这些描述,最终都会落成“对象”。

这里的 对象 可以理解成 Kubernetes 用来描述系统目标状态的一种资源模型


2. Pod 到底是什么

Pod 是 Kubernetes 最小部署单元。

它可以看成 一组应该作为一个整体被调度和运行的容器

为什么不是直接调度单个容器?

因为 Kubernetes 需要一个更高层抽象,来表达:

  1. 哪些容器共享网络命名空间
  2. 哪些容器共享生命周期
  3. 哪些容器应该一起被部署

大多数业务场景里,一个 Pod 里通常只有一个主业务容器。
但也可能有多个协作容器,例如:

  1. 主业务容器
  2. 负责日志、代理或初始化任务的辅助容器

3. 为什么 Pod 不是稳定的长期个体

这是很多人一开始容易误解的点。

Pod 可以被重新创建、重新调度、重新分配 IP。

这意味着:

  1. Pod 名字和实例不是永远不变的
  2. Pod IP 也不是稳定入口
  3. 不应该让别的服务直接依赖某个 Pod 的瞬时地址

这也是后面为什么一定会需要 Service 的原因。


4. ReplicaSet 是什么

ReplicaSet 可以理解成 负责保证某类 Pod 始终维持指定副本数的一层控制器

它解决的是:

  1. 现在只剩 2 个 Pod 了,但目标应该有 3 个
  2. 某个 Pod 挂了,要不要补一个新的

如果把它压缩成一句话:ReplicaSet 关注的是“数量要对”。


5. Deployment 又是什么

Deployment 可以理解成 站在更高一层,管理无状态应用发布和副本演进的控制器

它并不是直接替代 Pod,而是:通过管理 ReplicaSet,再间接管理 Pod。

它解决的是:

  1. 应用应该跑几个副本
  2. 发布时如何滚动更新
  3. 出现问题时如何回滚

所以:

  1. Pod 解决“最小运行单元”问题
  2. ReplicaSet 解决“副本数量”问题
  3. Deployment 解决“版本演进和发布控制”问题

6. 控制器到底在控制什么

控制器 可以理解成 持续观察实际状态,并不断把系统拉回目标状态的那类组件

这也是 Kubernetes 声明式管理的关键。

例如你声明:我要 3 个副本

如果当前只剩 2 个,控制器就会继续创建新的 Pod,直到恢复成 3 个。

所以它控制的不是“某一条命令”,而是:实际状态和目标状态之间的差距。


7. 一个最常见的 Deployment 示例

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      containers:
        - name: app
          image: demo-app:1.0
          ports:
            - containerPort: 8080

这份配置可以这样理解:

  1. 定义一个名为 demo-app 的 Deployment
  2. 目标是始终保持 3 个副本
  3. 每个副本都运行 demo-app:1.0 这个镜像
  4. Pod 上打了 app: demo-app 这个标签

这里的 label 可以理解成 Kubernetes 用来给对象打标记、做选择和归组的一种键值对

它后面会被 selector 用来选中一组 Pod。


8. StatefulSet 为什么经常和 Deployment 放在一起比较

虽然这篇重点是无状态控制器,但还是需要先点出边界。

StatefulSet 更适合:

  1. 稳定网络身份
  2. 稳定存储绑定
  3. 对实例顺序和身份更敏感的应用

它和 Deployment 的区别,不在于“谁更高级”,而在于:它们服务的是不同类型的工作负载。


9. 工程上最常见的几个误区

9.1 误区一:直接手工创建 Pod 就够了

手工 Pod 可以用于临时实验,但项目里更常见的生产方式还是通过控制器管理。

9.2 误区二:Deployment 直接管理 Pod

更具体一点,是 Deployment 管理 ReplicaSet,再由 ReplicaSet 管理 Pod。

9.3 误区三:Pod 就是永久实例

Pod 是可以被替换和重建的,不能把它当成稳定不变的机器。


10. 一句话总结

Kubernetes 的核心对象与控制器这条主线,本质上是在解决:

怎样把应用的运行形态、目标副本数和发布演进方式用一组可声明、可持续维护的对象模型表达出来。

基于 VitePress 构建的个人技术笔记。