摘要:梳理 Pod、Deployment、StatefulSet、DaemonSet、Job 与 CronJob 的职责、管理关系和选型场景,建立 Kubernetes 工作负载的整体认识。
这一部分是 CKA 考试的核心内容之一,也是 Kubernetes 实际生产环境中最重要的知识模块。
一、Workloads 工作负载概述
1. 什么是 Workloads?
Workloads(工作负载)是 Kubernetes 中用于管理应用程序运行的 API 资源。
简单来说:
- Pod 负责运行容器。
- Deployment 负责管理无状态应用。
- StatefulSet 负责管理有状态应用。
- DaemonSet 负责让每个符合条件的节点运行指定 Pod。
- Job 负责执行一次性任务。
- CronJob 负责定时执行任务。
例如,我们部署一个 Web 应用:
flowchart TB
N0["用户请求"]
N1["Kubernetes Service"]
N2["Deployment"]
N3["ReplicaSet"]
N4["Pod"]
N5["Pod"]
N6["Pod"]
N7["Container"]
N8["Container"]
N9["Container"]
N0 --> N1
N2 -.->|"管理"| N3
N1 -->|"请求"| N4
N1 -->|"请求"| N5
N1 -->|"请求"| N6
N3 -.->|"管理"| N4
N3 -.->|"管理"| N5
N3 -.->|"管理"| N6
N4 --> N7
N5 --> N8
N6 --> N9
这里有一个重要概念:
Workload Controller(工作负载控制器)通过持续监听集群状态,使实际运行状态不断趋近于用户声明的期望状态。
例如:
你希望始终运行 3 个 Nginx Pod。
replicas: 3如果其中一个 Pod 意外退出,控制器会发现:
flowchart TB
N0["期望状态:3 个 Pod<br/>实际状态:2 个 Pod"]
N1["控制器发现状态不一致"]
N2["创建新的 Pod"]
N3["恢复到 3 个 Pod"]
N0 --> N1
N1 --> N2
N2 --> N3
这就是 Kubernetes 的声明式管理和控制器协调机制。
2. Kubernetes Workloads 核心资源
Kubernetes 主要有以下六种工作负载资源:
1. Pod
基础运行单元 Kubernetes 中最小的可部署计算单元。
2. Deployment
无状态应用 管理 ReplicaSet,实现副本控制、滚动更新和回滚。
3. StatefulSet
有状态应用 管理具有稳定身份标识和持久化存储需求的应用。
4. DaemonSet
节点级运行 在所有或指定节点上运行一个 Pod 副本。
5. Job
一次性任务 确保指定数量的任务 Pod 成功完成。
6. CronJob
定时任务 按照 Cron 时间表达式周期性创建 Job。
此外,还有 ReplicaSet,它主要负责维护 Pod 副本数量,通常由 Deployment 管理。
3. 六种工作负载的区别
这是 CKA 必须掌握的知识点。
| 资源 | 主要用途 | 典型应用 |
|---|---|---|
| Pod | 运行容器 | 单个应用实例 |
| Deployment | 无状态应用 | Nginx、Web 服务 |
| StatefulSet | 有状态应用 | MySQL、Redis 集群 |
| DaemonSet | 节点级应用 | 日志采集、监控 Agent |
| Job | 一次性任务 | 数据迁移、批量计算 |
| CronJob | 定时任务 | 定时备份、定时清理 |
重点理解:无状态与有状态
无状态应用(Stateless)
应用实例之间没有必须保持的本地身份或持久化状态。
例如:
Web 应用
Pod-1Pod-2Pod-3三个 Pod 可以互相替换。Pod-1 挂掉后,重新创建一个 Pod 即可。
因此通常使用 Deployment。
有状态应用(Stateful)
应用实例需要保持稳定的身份标识、网络标识或持久化数据。
例如:
MySQL 集群
mysql-0mysql-1mysql-2每个 Pod 都有稳定的名称,并且可以关联独立的持久化存储。
因此通常使用 StatefulSet。
4. Workloads 控制器之间的管理关系
需要特别注意:这些资源并不是完全独立的。
flowchart TB
N0["Kubernetes"]
N1["Workload Controllers"]
N2["Deployment"]
N3["StatefulSet"]
N4["DaemonSet"]
N5["Job"]
N6["CronJob"]
N7["ReplicaSet"]
N8["Pod"]
N9["Pod"]
N10["Pod"]
N11["Pod"]
N12["Job"]
N13["Pod"]
N0 --> N1
N1 --> N2
N1 --> N3
N1 --> N4
N1 --> N5
N1 --> N6
N2 --> N7
N7 --> N8
N3 --> N9
N4 --> N10
N5 --> N11
N6 --> N12
N12 --> N13
理解这张图需要记住:
- Deployment 通常通过 ReplicaSet 管理 Pod。
- StatefulSet 直接管理 Pod。
- DaemonSet 直接管理 Pod。
- Job 负责管理执行任务的 Pod。
- CronJob 负责按照计划创建 Job。
常用命令
查看工作负载:
kubectl get podskubectl get deploymentskubectl get replicasetskubectl get statefulsetskubectl get daemonsetskubectl get jobskubectl get cronjobs查看所有工作负载相关资源:
kubectl get pods,deploy,rs,sts,ds,job,cronjob查看资源详细信息:
kubectl describe deployment nginx查看 YAML:
kubectl get deployment nginx -o yaml查看集群中支持的 API 资源:
kubectl api-resources