目录
一、Replication Controller&ReplicaSet
一、Replication Controller (RC)
原理
特性
意义
示例与逐行解释
二、ReplicaSet (RS)
原理
特性
意义
示例与逐行解释
三、RC 与 RS 的对比
四、总结
二、DeamonSet
一、核心原理
二、显著特性
三、核心意义与应用场景
四、与其他控制器的对比
总结
三、CronJob
一、Replication Controller&ReplicaSet
一、Replication Controller (RC)
原理
-
核心功能:
- 确保指定数量的 Pod 副本始终运行。若 Pod 因故障或节点问题终止,RC 会自动创建新副本。
- 通过 标签选择器(Label Selector) 匹配并管理 Pod。
-
工作流程:
- 监听机制:RC 持续监控集群中与其标签匹配的 Pod 数量。
- 扩缩容:当实际 Pod 数量与
replicas
字段不符时,RC 会通过创建或删除 Pod 来修正差异。
特性
- 简单扩缩容:通过修改
replicas
值直接调整副本数。 - 滚动更新支持:需配合手动操作(如逐步修改 RC 配置)实现。
- 局限性:
- 标签选择器仅支持等式匹配(如
app=nginx
),无法实现复杂条件(如集合匹配)。 - 已被更现代的 ReplicaSet 取代(但仍兼容)。
- 标签选择器仅支持等式匹配(如
意义
- 为 Kubernetes 早期版本提供基础的 Pod 高可用保障,是无状态服务的核心管理工具。
示例与逐行解释
rc-example.yaml
apiVersion: v1
kind: ReplicationController
metadata:name: nginx-rc
spec:replicas: 3selector:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14ports:- containerPort: 80
逐行解释:
apiVersion: v1
:使用 Kubernetes 核心 API 版本。kind: ReplicationController
:声明资源类型为 RC。replicas: 3
:指定维持 3 个 Pod 副本。selector: app: nginx
:通过标签app=nginx
选择管理的 Pod。template
:定义 Pod 模板,所有副本均按此配置创建。containers
:指定运行 Nginx 容器,监听 80 端口。
二、ReplicaSet (RS)
原理
-
核心改进:
- 继承 RC 功能,但引入更强大的 集合型标签选择器(支持
matchLabels
和matchExpressions
)。 - 通常由 Deployment 管理,实现声明式更新和版本控制。
- 继承 RC 功能,但引入更强大的 集合型标签选择器(支持
-
工作流程:
- 与 RC 类似,但支持更灵活的 Pod 选择逻辑(如
environment in (prod, staging)
)。
- 与 RC 类似,但支持更灵活的 Pod 选择逻辑(如
特性
- 增强的选择器:支持多条件匹配(如
AND
逻辑)。 - 与 Deployment 集成:作为 Deployment 的底层组件,负责 Pod 副本管理,而 Deployment 处理滚动更新和回滚。
- 资源版本:属于
apps/v1
API 组,是 RC 的替代品。
意义
- 为现代 Kubernetes 提供更精细的 Pod 管理能力,是 Deployment 的基石,支撑无状态应用的自动化运维。
示例与逐行解释
rs-example.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:name: nginx-rs
spec:replicas: 3selector:matchLabels:app: nginxmatchExpressions:- {key: environment, operator: In, values: [prod]}template:metadata:labels:app: nginxenvironment: prodspec:containers:- name: nginximage: nginx:1.14ports:- containerPort: 80
逐行解释:
apiVersion: apps/v1
:使用apps
组的 API 版本。kind: ReplicaSet
:声明资源类型为 RS。selector.matchLabels
:必须匹配app=nginx
。selector.matchExpressions
:额外要求 Pod 的environment
标签值为prod
。template
:定义 Pod 模板,包含复合标签(app
和environment
)。
三、RC 与 RS 的对比
特性 | Replication Controller | ReplicaSet |
---|---|---|
API 版本 | v1 (核心组) | apps/v1 (扩展组) |
标签选择器 | 仅等式匹配(key=value ) | 支持集合匹配(In , Exists ) |
推荐使用场景 | 旧版本兼容 | 现代集群(通常由 Deployment 管理) |
更新策略 | 需手动操作 | 与 Deployment 协作支持滚动更新 |
四、总结
- Replication Controller:Kubernetes 早期用于保障 Pod 副本数的基础控制器,功能简单但已过时。
- ReplicaSet:RC 的升级版,提供更强大的标签选择能力,是 Deployment 的底层核心,支撑现代无状态应用的自动化管理。
- 最佳实践:直接使用 Deployment 管理 RS,而非手动创建 RS 或 RC。
二、DeamonSet
DaemonSet 是 Kubernetes 中的核心控制器之一,用于确保集群中的每个节点(或符合特定条件的节点)上都运行一个相同且唯一的 Pod 副本。以下是其原理、特性及意义的详细解析:
一、核心原理
-
节点级守护
- 当创建 DaemonSet 时,它会自动为每个符合条件的节点创建并维护一个 Pod。新节点加入集群后,DaemonSet 会立即在新节点上部署 Pod;节点被移除时,该节点上的 Pod 会被自动回收。
- 调度机制:通过 NodeAffinity 和 Kubernetes 调度器协同工作(Kubernetes 1.12 后),确保 Pod 绑定到目标节点。
-
污点容忍(Tolerations)
- 支持为 Pod 配置容忍度,使其能在带有污点(Taints)的特殊节点(如 Master 节点、GPU 节点)上运行。
- 示例:允许在 Master 节点运行
kube-proxy
:tolerations - key: node-role.kubernetes.io/mastereffect: NoSchedule
二、显著特性
-
节点全覆盖与动态伸缩
- 默认覆盖所有节点,也可通过
nodeSelector
或nodeAffinity
限定目标节点(如仅 GPU 节点)。 - 集群扩容时自动在新节点部署 Pod,缩容时自动清理。
- 默认覆盖所有节点,也可通过
-
更新策略
- 滚动更新(RollingUpdate):逐步替换旧 Pod(可设置
maxUnavailable
控制并发数),减少服务中断。 - 按需更新(OnDelete):手动删除旧 Pod 后才创建新版本,适用于需严格控制的场景(如网络插件)。
- 滚动更新(RollingUpdate):逐步替换旧 Pod(可设置
-
资源与健康管理
- 支持为 Pod 配置资源限制(CPU/内存)及优先级,防止资源耗尽。
- 可通过 Liveness/Readiness 探针 监控 Pod 健康状态,实现自动重启。
三、核心意义与应用场景
意义:
- 标准化节点服务:统一管理集群中所有节点的基础设施组件,避免手动部署的复杂性。
- 高可用与自愈:节点故障时自动迁移 Pod,守护进程崩溃时自动重启。
- 资源高效利用:按需部署,避免为临时任务预留专用资源。
典型应用场景:
场景 | 组件示例 | 作用 |
---|---|---|
日志收集 | Fluentd、Filebeat | 从每个节点的 /var/log 采集日志 |
监控代理 | Prometheus Node Exporter、cAdvisor | 采集节点级 CPU/内存等指标 |
网络插件 | Calico、Cilium、kube-proxy | 为节点提供网络策略及服务代理 |
存储服务 | Ceph、GlusterFS 客户端 | 节点级分布式存储挂载 |
安全运维 | Falco(安全审计)、运维Agent | 实时检测异常或执行批量维护任务 |
四、与其他控制器的对比
特性 | DaemonSet | Deployment/ReplicaSet |
---|---|---|
调度目标 | 每个节点运行 1 个 Pod | 集群内运行 指定数量的 Pod |
扩缩容触发 | 节点变化时自动调整 | 手动调整副本数 |
适用场景 | 节点级基础服务(日志/网络) | 无状态应用(Web 服务) |
总结
DaemonSet 是 Kubernetes 管理节点级守护进程的核心工具,通过自动化部署、动态扩缩容和灵活的策略配置,为集群提供日志收集、网络代理、监控等基础设施能力。其设计确保了服务的全局覆盖与高可用性,是生产环境中不可或缺的组件。
三、CronJob
简单来说,CronJob 是 Kubernetes 中用于在特定时间点或按计划周期性地运行 Job 的对象。 它借鉴了类 Unix 系统(如 Linux)中 cron
守护进程的概念,将定时任务的管理带入了容器化和集群化的世界。
核心原理:
-
声明式配置:
- 用户通过 YAML 清单文件定义一个
CronJob
资源。 - 核心字段包括:
schedule
: 使用 Cron 表达式 定义任务运行的时间表(何时运行)。格式为分 时 日 月 周
(例如"0 * * * *"
表示每小时的第 0 分钟运行)。jobTemplate
: 定义要运行的Job
模板。这个Job
描述了真正要执行的任务(在 Pod 中运行的容器命令或脚本)。concurrencyPolicy
: 控制当前正在运行的 Job 尚未完成时,新计划的 Job 是否允许启动 (Allow
,Forbid
,Replace
)。解决并发冲突。startingDeadlineSeconds
: Job 必须在预定时间后多少秒内开始运行,否则被标记为失败(考虑调度延迟)。successfulJobsHistoryLimit
/failedJobsHistoryLimit
: 保留多少已完成(成功/失败)的 Job 记录历史(便于查看日志和排错)。suspend
: 布尔值,用于暂停 (true
) 或恢复 (false
) CronJob 的调度。
- 用户通过 YAML 清单文件定义一个
-
Controller Manager 的 CronJob Controller:
- Kubernetes 控制平面的
kube-controller-manager
组件内运行着一个专门的CronJob Controller
。 - 核心守护循环:
- 监视: 持续监视集群中所有的 CronJob 对象。
- 计算下一次运行时间: 对于每个活跃的 CronJob(
suspend: false
),Controller 根据其schedule
字段计算在当前时间之后下一次应该运行的具体时间点。 - 触发 Job 创建: 当系统时间到达计划的下一次运行时间点时:
- Controller 检查
concurrencyPolicy
:Allow
(默认):总是创建新的 Job。Forbid
:如果当前有任何该 CronJob 创建的 Job 还在运行(状态Running
),则跳过本次计划,等到下一次计划时间再检查。Replace
:如果当前有旧的 Job 还在运行,则终止它(优雅终止期后强制终止),然后立即创建一个新的 Job。
- 检查
startingDeadlineSeconds
:如果当前时间已经超过了计划时间加上这个阈值,则 Controller 认为这次运行“迟到太多”,不会创建 Job,并将这次错过的运行记录为事件(可通过kubectl describe cronjob <name>
查看)。 - 创建 Job 对象: 如果满足策略和时间要求,Controller 创建 一个新的
Job
对象 (metadata.generateName
基于 CronJob 名称生成唯一 Job 名)。
- Controller 检查
- Job 的执行: 一旦 Job 对象被创建,Kubernetes 的 Job Controller 就会接管:
- 根据 Job 的
template
创建一个或多个 Pod。 - 监控 Pod 的执行状态(成功完成、失败)。
- 根据 Job 的配置(如
completions
,parallelism
)管理 Pod 的重试和并行执行。
- 根据 Job 的
- 历史记录管理: CronJob Controller 会根据
successfulJobsHistoryLimit
和failedJobsHistoryLimit
的设置,自动清理旧的、已完成(成功或失败)的 Job 对象及其关联的 Pod(但 Pod 的日志通常需要独立收集)。
- Kubernetes 控制平面的
关键特性:
- 基于 Cron 表达式的精确调度: 提供强大的时间控制能力,满足分钟、小时、天、月、周级别的各种定时需求。
- Job 模板化: 将“何时运行”(CronJob)和“运行什么”(Job)清晰分离。
jobTemplate
定义了每次计划执行时的具体任务逻辑。 - 并发控制 (
concurrencyPolicy
): 关键特性,防止因任务执行时间过长导致多个实例意外并行运行,引发资源争用或逻辑冲突。Forbid
和Replace
策略提供了灵活性。 - 容错与重试:
- Job 级别的重试: 由 Job Controller 负责。如果 Pod 运行失败(退出码非零),Job Controller 会根据 Job Spec 中配置的
backoffLimit
自动创建新的 Pod 重试任务。 - 错过的调度 (
startingDeadlineSeconds
): 处理短暂的调度器繁忙或控制平面问题导致的延迟,避免大量积压的 Job 同时启动冲击系统。
- Job 级别的重试: 由 Job Controller 负责。如果 Pod 运行失败(退出码非零),Job Controller 会根据 Job Spec 中配置的
- 历史记录保留: 保留一定数量的成功/失败 Job 记录,便于审计、日志查看和故障排查 (
kubectl get jobs
/kubectl logs <pod-name>
)。 - 暂停与恢复 (
suspend
): 无需删除 CronJob 即可临时停止其调度,方便维护或调试。 - 资源管理与隔离: 每个 Job/Pod 可以定义自己的资源请求 (
requests
) 和限制 (limits
),确保任务运行时获得所需资源且不会耗尽节点资源。多个 CronJob 的任务在集群资源池中共享与隔离。 - 声明式 API: 通过清单文件描述期望状态,Kubernetes 负责使其达成并维持。
核心意义与价值:
- 自动化运维任务:
- 数据库备份/恢复: 定时备份关键数据库。
- 日志轮转/清理: 清理旧日志文件,释放存储空间。
- 证书轮换: 自动更新服务证书。
- 集群维护: 定期运行集群健康检查、资源报告生成。
- 缓存预热/刷新: 在访问高峰前预热缓存。
- 周期性数据处理与分析:
- ETL 作业: 按计划(如每天凌晨)从源系统抽取数据、转换、加载到数据仓库。
- 报告生成: 定时生成业务或系统性能报告。
- 机器学习模型训练/再训练: 按计划更新模型。
- 微服务架构中的定时触发:
- 触发批处理服务。
- 发送周期性通知或提醒。
- 执行定期的数据同步任务。
- 提升可靠性与可管理性:
- 标准化: 将原来分散在各服务器上的 crontab 任务集中到 Kubernetes 统一管理。
- 弹性与自愈: 任务运行在 Pod 中,Pod 故障时由 Job Controller 自动重启(根据
backoffLimit
)。节点故障时,任务会被调度到其他健康节点运行。 - 资源利用率: 集群资源池化,避免为偶尔运行的定时任务预留专用服务器。
- 监控与日志: 与 Kubernetes 的监控(Prometheus, Metrics Server)和日志(EFK, Loki)生态系统无缝集成,方便跟踪任务执行状态、性能和日志。
- 版本控制与审计: CronJob 定义作为 YAML 文件可纳入 Git 进行版本控制,变更可追踪。
- 云原生实践: CronJob 是 Kubernetes 原生提供的定时任务解决方案,避免了在容器内运行 crond 或使用外部调度系统的复杂性,符合云原生理念。
与传统 cron
的主要区别:
特性 | 传统 cron (单机) | Kubernetes CronJob (集群) |
---|---|---|
运行环境 | 单个服务器/虚拟机 | Kubernetes 集群 (分布式) |
调度单位 | 直接执行命令/脚本 | 创建 Job 对象,Job 再创建 Pod 执行容器 |
资源管理 | 受限于单机资源 | 集群资源池,可调度到任意节点,资源隔离 |
高可用/容错 | 依赖服务器高可用,任务本身无自动重启/转移 | Pod 故障自动重启 (Job),节点故障自动迁移任务 |
并发控制 | 通常较弱,依赖脚本自身逻辑 (flock 等) | 内置强大并发策略 (Allow , Forbid , Replace ) |
声明式管理 | 配置文件管理 (如 /etc/crontab ) | Kubernetes YAML 清单,API 驱动 |
监控/日志 | 分散,需自行收集整合 | 与 K8s 监控/日志生态 (Prometheus, EFK) 集成 |
历史记录 | 通常依赖日志文件 | 自动保留 Job 历史记录 |
暂停/恢复 | 需注释或移动 cron 条目 | 简单设置 suspend: true/false |
总结:
Kubernetes 的 CronJob 是一个强大的原生对象,它将经典的定时任务概念完美地融入了容器化、集群化的云原生环境。其核心原理是通过 Controller 监听 CronJob 定义,基于 Cron 表达式计算计划时间,并在满足条件(并发策略、截止时间)时创建 Job 对象来执行具体任务。它的特性(精确调度、并发控制、容错重试、历史记录、资源管理)和意义(自动化运维、数据处理、标准化、提升可靠性弹性、云原生集成)使其成为在 Kubernetes 上运行周期性、批处理作业的首选和标准方式。理解 CronJob 对于有效管理和自动化 Kubernetes 集群中的任务至关重要。
基本脚本
apiVersion: batch/v1
kind: CronJob
metadata:name: log-cleanernamespace: default
spec:schedule: "0 * * * *" # 每小时的第0分钟运行concurrencyPolicy: Forbid # 禁止并发执行startingDeadlineSeconds: 300 # 允许延迟5分钟successfulJobsHistoryLimit: 3 # 保留3个成功记录failedJobsHistoryLimit: 1 # 保留1个失败记录jobTemplate:spec:template:spec:containers:- name: log-cleanerimage: alpine:latestcommand: ["/bin/sh", "-c"]args: - echo "开始清理日志...";find /var/log/app -name "*.log" -mtime +7 -delete;echo "清理完成"volumeMounts:- name: log-volumemountPath: /var/log/apprestartPolicy: OnFailurevolumes:- name: log-volumehostPath:path: /var/log/app
逐行解释:
-
apiVersion: batch/v1
- 指定使用的Kubernetes API版本 -
kind: CronJob
- 声明这是一个CronJob资源 -
metadata
部分:name: log-cleaner
- 给这个CronJob命名namespace: default
- 指定部署到default命名空间
-
spec
部分(CronJob核心配置):schedule: "0 * * * *"
- cron表达式,表示每小时的第0分钟运行concurrencyPolicy: Forbid
- 如果前一个任务还在运行,跳过本次执行startingDeadlineSeconds: 300
- 允许任务延迟最多5分钟启动- 历史记录保留设置:成功3个,失败1个
-
jobTemplate
部分(定义实际运行的Job):spec.template
- Pod模板定义containers
配置:- 使用alpine镜像
command
和args
组合相当于执行一个shell脚本- 脚本内容:查找并删除/var/log/app目录下7天前的.log文件
-
volumeMounts
和volumes
:- 将宿主机的/var/log/app目录挂载到容器内
- 这样容器内操作会直接影响宿主机上的日志文件
这个示例展示了完整的CronJob配置,包含了定时调度、任务定义、资源挂载等关键元素。实际使用时可以根据需求调整schedule、镜像和command等内容