2. Kubernetes 核心概念回顾:Pod、Deployment、Node、Label、Selector 基础
在深入节点池配置与滚动升级之前,必须重新夯实 Kubernetes 最核心的五个抽象概念。这些概念是后续所有调度、亲和性、升级策略的基石。本节将采用“概念-属性-关系”的结构,帮助你建立清晰的认知地图。
2.1 核心概念速览
下表从定义、职责、生命周期三个维度对比了五个核心对象,建议作为后续章节的参考基准。
| 概念 | 定义 | 核心职责 | 生命周期 |
|---|---|---|---|
| Pod | Kubernetes 中最小的可部署计算单元,封装一个或多个容器 | 运行应用实例,共享网络/IP 和存储卷 | 临时性,可被销毁重建,不直接自愈 |
| Deployment | 声明式管理 Pod 副本的控制器 | 确保期望副本数、支持滚动更新与回滚 | 持久化,通过 ReplicaSet 管理 Pod 生命周期 |
| Node | 集群中的工作节点(物理机或虚拟机) | 运行 Pod,提供计算、存储、网络资源 | 相对稳定,可被 cordon/drain 标记维护 |
| Label | 附加到对象的键值对元数据 | 标识、分组、筛选资源 | 与对象共存,可动态增删改 |
| Selector | 基于 Label 的匹配表达式 | 控制器与 Pod 之间的松耦合关联机制 | 声明式,实时生效 |
关键认知:Pod 是“工人”,Node 是“车间”,Deployment 是“生产调度员”,Label 是“工人身上的标签”,Selector 是“调度员手里的筛选清单”。节点池配置的本质,就是通过 Label 和 Selector 控制 Pod 被调度到哪些 Node 上。
2.2 Pod:最小调度单元
Pod 是 Kubernetes 的原子单位。一个 Pod 内的容器共享同一个网络命名空间、IP 地址和存储卷。在节点池升级场景中,Pod 是“被迁移”的对象。
- 临时性:Pod 不提供持久化保证,任何节点维护或升级都会导致 Pod 被驱逐并重新调度。
- 健康检查:livenessProbe 和 readinessProbe 决定 Pod 是否存活以及是否接收流量,直接影响滚动升级的节奏。
- 资源请求与限制:requests 和 limits 决定了 Pod 能否被调度到目标节点,是节点池资源规划的核心参数。
# 一个简单的 Pod 定义示例
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
labels:
app: my-app
version: v1
spec:
containers:
- name: nginx
image: nginx:1.25
ports:
- containerPort: 80
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
2.3 Deployment:声明式副本管理
Deployment 是生产环境中管理无状态应用的首选控制器。它通过 ReplicaSet 间接管理 Pod,并提供声明式的滚动更新策略。
- ReplicaSet 桥接:Deployment 每次更新都会创建新的 ReplicaSet,旧的 ReplicaSet 保留用于回滚。
- 滚动更新策略:通过
maxSurge和maxUnavailable控制升级速率,这是节点池滚动升级的核心机制。 - 版本回滚:利用
kubectl rollout undo快速恢复到上一个稳定版本。
# Deployment 定义示例(含滚动更新策略)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 5
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
version: v2
spec:
containers:
- name: app-container
image: my-app:2.0.0
# 节点选择器(后续章节详解)
nodeSelector:
pool-type: general
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
2.4 Node:集群资源提供者
Node 是 Pod 运行的物理基础。每个 Node 由 kubelet 代理管理,并定期向 API Server 上报状态。
- 节点状态:Ready、NotReady、SchedulingDisabled 等状态直接影响 Pod 调度。
- 节点条件:包括 MemoryPressure、DiskPressure、PIDPressure 等,触发 Pod 驱逐。
- 节点标签:Kubernetes 自动添加
kubernetes.io/hostname、topology.kubernetes.io/zone等标签,用户可自定义标签用于节点池划分。
常见误区:不要直接修改 Node 的内置标签(如
kubernetes.io/hostname),这可能导致调度器行为异常。节点池划分应使用自定义标签,例如 pool-type: gpu 或 pool-size: large。
2.5 Label 与 Selector:调度与关联的纽带
Label 是 Kubernetes 生态中实现松耦合的关键设计。几乎所有资源关联(Service 到 Pod、Deployment 到 Pod、Pod 到 Node)都依赖 Label 和 Selector。
2.5.1 Label 设计原则
- 语义化:使用有意义的键值对,如
tier: frontend、environment: production。 - 可继承:子资源(如 Pod)可以继承父资源(如 Deployment)的标签,便于统一筛选。
- 不可用于唯一标识:Label 不是唯一标识符,多个对象可以拥有相同的 Label 集合。
2.5.2 Selector 匹配类型
| 匹配类型 | 运算符 | 示例 | 说明 |
|---|---|---|---|
| 基于等值 | = / == / != |
environment=production |
精确匹配或排除某个值 |
| 基于集合 | in / notin / exists |
tier in (frontend, backend) |
匹配值集合中的任意一个 |
| 节点亲和性 | requiredDuringScheduling / preferredDuringScheduling |
见后续章节 | 硬性要求或软性偏好 |
2.6 概念关系全景图
下面的 SVG 图展示了五个核心概念之间的关联关系,以及它们在节点池配置场景中的位置。
2.7 节点池场景中的概念映射
在节点池配置与滚动升级的实战中,上述概念会形成以下具体映射关系:
- 节点池 = 一组拥有相同自定义 Label 的 Node 集合。例如
pool-type: general或pool-size: high-memory。 - Pod 调度 = 通过
nodeSelector或节点亲和性规则,将 Pod 绑定到特定节点池。 - 滚动升级 = Deployment 逐步创建新 Pod(新版本),同时终止旧 Pod,期间通过
maxSurge和maxUnavailable控制流量切换。 - 节点池升级 = 先给新节点打上池标签,再通过 Pod 亲和性规则将 Pod 迁移到新节点,最后下线旧节点。
实战要点:理解 Label 和 Selector 的松耦合特性是掌握节点池配置的关键。当你修改节点池标签时,调度器会自动重新评估所有未调度的 Pod,但已经在运行的 Pod 不会受影响——这正是滚动升级需要“先建后删”策略的原因。