Kubernetes中资源对象实例与资源控制器实例的控制关系是怎样的?

Kubernetes 中资源对象实例与资源控制器实例的对应关系(结合用例详解)

在 Kubernetes 中,资源对象(如 Pod、Deployment、ReplicaSet)是系统中持久化的实体,而资源控制器(如 Deployment Controller、ReplicaSet Controller)是负责管理这些对象的控制逻辑。两者通过 声明式 APIWatch 机制 动态协作,确保实际状态与用户声明的期望状态一致。


1. 核心概念

1.1 资源对象(Resource Object)

  • 定义:Kubernetes 中的实体(如 Pod、Deployment、Service),通过 YAML/JSON 定义,存储在 etcd 中。
  • 特点:
    • 具有 metadata(如名称、标签)、spec(期望状态)和 status(实际状态)。
    • 通过 kubectl 或 API Server 创建、更新或删除。

1.2 资源控制器(Resource Controller)

  • 定义:运行在控制平面中的守护进程(如 Deployment Controller、ReplicaSet Controller),负责监听对象变化并驱动系统向期望状态收敛。
  • 特点:
    • 每个控制器专注于管理特定类型的资源对象。
    • 通过 Watch 机制 监听对象变更,触发协调逻辑(Reconciliation Loop)。

2. 对应关系模型

上层资源控制器与下层资源对象的关系是 【一对多】 的层级管理结构:

  • 上层控制器管理下层对象:例如:
    • Deployment Controller 管理 ReplicaSet 对象。
    • ReplicaSet Controller 管理 Pod 对象。
  • 对象间的所有权链:通过 ownerReferences 字段建立从属关系(如 Pod 的 ownerReferences 指向其所属的 ReplicaSet)。

对应关系示意图:

Deployment Controller
  │
  └──→ 管理 Deployment 对象
         │
         └──→ 创建 ReplicaSet 对象
                │
                ReplicaSet Controller
                  │
                  └──→ 管理 ReplicaSet 对象
                         │
                         └──→ 创建 Pod 对象
                                │
                                Node 上的 kubelet
                                  │
                                  └──→ 管理容器运行时(如 containerd)

3. 用例分析:创建 Deployment 的完整流程

假设用户创建一个包含 2 个 Nginx 副本的 Deployment:

3.1 用户提交 Deployment 定义

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest

3.2 资源对象与控制器的交互流程

步骤 1:Deployment 对象创建
  • 用户操作kubectl apply -f deployment.yaml
  • 结果:
    • Deployment 对象通过 API Server 持久化到 etcd。
    • Deployment Controller 监听 Deployment 对象的 ADDED 事件,触发协调逻辑。
步骤 2:Deployment Controller 创建 ReplicaSet
  • 控制器行为:
    1. Deployment Controller 读取 Deployment 的 spec(如 replicas: 2 和 Pod 模板)。
    2. 创建一个新的 ReplicaSet 对象(如 nginx-deployment-5c64f67f9c),并通过 API Server 写入 etcd。
  • 关键字段:
    • ReplicaSet 的 ownerReferences 指向父对象(Deployment)。
    • ReplicaSet 的 spec.replicas 继承自 Deployment 的 spec.replicas
步骤 3:ReplicaSet Controller 创建 Pod
  • 控制器行为:
    1. ReplicaSet Controller 监听 ReplicaSet 对象的 ADDED 事件。
    2. 检测到 ReplicaSet 的 spec.replicas: 2,发现当前实际 Pod 数量为 0。
    3. 通过 API Server 创建 2 个 Pod 对象(如 nginx-deployment-5c64f67f9c-abc12nginx-deployment-5c64f67f9c-xyz34)。
  • 关键字段:
    • Pod 的 ownerReferences 指向其所属的 ReplicaSet。
    • Pod 的标签(app: nginx)必须匹配 ReplicaSet 的 spec.selector
步骤 4:调度器(Scheduler)分配节点
  • 控制器行为:
    1. Scheduler 监听未调度的 Pod(nodeName 为空)。
    2. 为每个 Pod 选择最优节点,并通过 API Server 更新 Pod 的 nodeName
步骤 5:kubelet 启动容器
  • 节点行为:
    1. 目标节点上的 kubelet 监听到分配给本节点的 Pod。
    2. 调用容器运行时(如 containerd)创建容器,并更新 Pod 状态为 Running

4. 关键机制详解

4.1 控制器与对象的绑定关系

  • Deployment → ReplicaSet:
    • Deployment 通过 spec.selector 匹配其管理的 ReplicaSet。
    • 更新 Deployment 的 Pod 模板时,会创建新的 ReplicaSet,并逐步替换旧的 ReplicaSet。
  • ReplicaSet → Pod:
    • ReplicaSet 通过 spec.selector 匹配其管理的 Pod。
    • 如果 Pod 被手动删除,ReplicaSet Controller 会重新创建 Pod。

4.2 ownerReferences 与垃圾回收

  • 作用:建立对象间的从属关系,确保父对象删除时,子对象也被自动清理(级联删除)。
  • 示例:
    • 删除 Deployment 时,其关联的 ReplicaSet 和 Pod 会被自动删除。
    • 直接删除 ReplicaSet 时,其关联的 Pod 也会被删除。

4.3 状态协调(Reconciliation Loop)

  • 控制器行为:
    1. 监听对象的事件(如 ADDEDMODIFIEDDELETED)。
    2. 比较实际状态(如当前运行的 Pod 数量)与期望状态(如 spec.replicas)。
    3. 执行操作(如创建/删除 Pod)使实际状态趋近期望状态。

5. 其他用例扩展

5.1 横向扩展(Scaling)

  • 用户操作kubectl scale deployment nginx-deployment --replicas=5
  • 控制器响应:
    1. Deployment Controller 更新 Deployment 的 spec.replicas
    2. ReplicaSet Controller 检测到 ReplicaSet 的 spec.replicas 变化,创建额外的 3 个 Pod。

5.2 滚动更新(Rolling Update)

  • 用户操作:更新 Deployment 的镜像版本(如 nginx:latestnginx:1.25)。
  • 控制器响应:
    1. Deployment Controller 创建新的 ReplicaSet(如 nginx-deployment-7b8f6c5d4f)。
    2. 旧 ReplicaSet 的 spec.replicas 逐步减少,新 ReplicaSet 的 spec.replicas 逐步增加。
    3. 最终旧 ReplicaSet 的副本数为 0,所有流量切到新 Pod。

6. 总结:资源对象与控制器对应关系

资源对象 控制器 职责 父子关系
Deployment Deployment Controller 管理 ReplicaSet,实现滚动更新和回滚 父对象:Deployment
ReplicaSet ReplicaSet Controller 确保 Pod 副本数与期望值一致 子对象:ReplicaSet
Pod kubelet 在节点上运行容器,并上报状态 子对象:Pod
  • 核心逻辑控制器通过监听上层对象的变化,创建并管理下层对象,最终将用户声明的期望状态转化为实际运行状态。​

通过这种层级化的管理模型,Kubernetes 实现了高度自动化的运维能力,同时保证了系统的弹性和自愈性

posted @ 2025-05-12 01:40  JaxYoun  阅读(36)  评论(0)    收藏  举报