K8s Pod 调度基础——1

发布于:2025-07-02 ⋅ 阅读:(24) ⋅ 点赞:(0)

目录

一、Replication Controller&ReplicaSet

‌一、Replication Controller (RC)‌

‌原理‌

‌特性‌

‌意义‌

‌示例与逐行解释‌

‌二、ReplicaSet (RS)‌

‌原理‌

‌特性‌

‌意义‌

‌示例与逐行解释‌

‌三、RC 与 RS 的对比‌

‌四、总结‌

二、DeamonSet

‌一、核心原理‌

‌二、显著特性‌

‌三、核心意义与应用场景‌

‌四、与其他控制器的对比‌

‌总结‌

三、CronJob


一、Replication Controller&ReplicaSet

一、Replication Controller (RC)

原理
  1. 核心功能‌:

    • 确保指定数量的 Pod 副本‌始终运行‌。若 Pod 因故障或节点问题终止,RC 会自动创建新副本。
    • 通过 ‌标签选择器(Label Selector)‌ 匹配并管理 Pod。
  2. 工作流程‌:

    • 监听机制‌: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: 3
  selector:
    app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80

逐行解释‌:

  1. apiVersion: v1:使用 Kubernetes 核心 API 版本。
  2. kind: ReplicationController:声明资源类型为 RC。
  3. replicas: 3:指定维持 3 个 Pod 副本。
  4. selector: app: nginx:通过标签 app=nginx 选择管理的 Pod。
  5. template:定义 Pod 模板,所有副本均按此配置创建。
  6. containers:指定运行 Nginx 容器,监听 80 端口。

二、ReplicaSet (RS)

原理
  1. 核心改进‌:

    • 继承 RC 功能,但引入更强大的 ‌集合型标签选择器‌(支持 matchLabels 和 matchExpressions)。
    • 通常由 ‌Deployment‌ 管理,实现声明式更新和版本控制。
  2. 工作流程‌:

    • 与 RC 类似,但支持更灵活的 Pod 选择逻辑(如 environment in (prod, staging))。
特性
  • 增强的选择器‌:支持多条件匹配(如 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: 3
  selector:
    matchLabels:
      app: nginx
    matchExpressions:
      - {key: environment, operator: In, values: [prod]}
  template:
    metadata:
      labels:
        app: nginx
        environment: prod
    spec:
      containers:
      - name: nginx
        image: nginx:1.14
        ports:
        - containerPort: 80

逐行解释‌:

  1. apiVersion: apps/v1:使用 apps 组的 API 版本。
  2. kind: ReplicaSet:声明资源类型为 RS。
  3. selector.matchLabels:必须匹配 app=nginx
  4. selector.matchExpressions:额外要求 Pod 的 environment 标签值为 prod
  5. template:定义 Pod 模板,包含复合标签(app 和 environment)。

三、RC 与 RS 的对比

特性 Replication Controller ReplicaSet
API 版本 v1(核心组) apps/v1(扩展组)
标签选择器 仅等式匹配(key=value 支持集合匹配(InExists
推荐使用场景 旧版本兼容 现代集群(通常由 Deployment 管理)
更新策略 需手动操作 与 Deployment 协作支持滚动更新

四、总结

  • Replication Controller‌:Kubernetes 早期用于保障 Pod 副本数的基础控制器,功能简单但已过时。
  • ReplicaSet‌:RC 的升级版,提供更强大的标签选择能力,是 ‌Deployment 的底层核心‌,支撑现代无状态应用的自动化管理。
  • 最佳实践‌:直接使用 ‌Deployment‌ 管理 RS,而非手动创建 RS 或 RC。

二、DeamonSet

DaemonSet 是 Kubernetes 中的核心控制器之一,用于确保集群中的每个节点(或符合特定条件的节点)上都运行一个‌相同且唯一‌的 Pod 副本。以下是其原理、特性及意义的详细解析:


一、核心原理

  1. 节点级守护

    • 当创建 DaemonSet 时,它会‌自动为每个符合条件的节点创建并维护一个 Pod‌。新节点加入集群后,DaemonSet 会立即在新节点上部署 Pod;节点被移除时,该节点上的 Pod 会被自动回收。
    • 调度机制:通过 ‌NodeAffinity‌ 和 Kubernetes 调度器协同工作(Kubernetes 1.12 后),确保 Pod 绑定到目标节点。
  2. 污点容忍(Tolerations)

    • 支持为 Pod 配置容忍度,使其能在带有污点(Taints)的特殊节点(如 Master 节点、GPU 节点)上运行。
    • 示例:允许在 Master 节点运行 kube-proxy
      tolerations
      - key: node-role.kubernetes.io/master
       effect: NoSchedule 

二、显著特性

  1. 节点全覆盖与动态伸缩

    • 默认覆盖所有节点,也可通过 ‌nodeSelector 或 nodeAffinity‌ 限定目标节点(如仅 GPU 节点)。
    • 集群扩容时自动在新节点部署 Pod,缩容时自动清理。
  2. 更新策略

    • 滚动更新(RollingUpdate)‌:逐步替换旧 Pod(可设置 maxUnavailable 控制并发数),减少服务中断。
    • 按需更新(OnDelete)‌:手动删除旧 Pod 后才创建新版本,适用于需严格控制的场景(如网络插件)。
  3. 资源与健康管理

    • 支持为 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 守护进程的概念,将定时任务的管理带入了容器化和集群化的世界。

核心原理:

  1. 声明式配置:

    • 用户通过 YAML 清单文件定义一个 CronJob 资源。
    • 核心字段包括:
      • schedule: 使用 ‌Cron 表达式‌ 定义任务运行的时间表(何时运行)。格式为 分 时 日 月 周(例如 "0 * * * *" 表示每小时的第 0 分钟运行)。
      • jobTemplate: 定义要运行的 Job 模板。这个 Job 描述了真正要执行的任务(在 Pod 中运行的容器命令或脚本)。
      • concurrencyPolicy: 控制当前正在运行的 Job 尚未完成时,新计划的 Job 是否允许启动 (AllowForbidReplace)。解决并发冲突。
      • startingDeadlineSeconds: Job 必须在预定时间后多少秒内开始运行,否则被标记为失败(考虑调度延迟)。
      • successfulJobsHistoryLimit / failedJobsHistoryLimit: 保留多少已完成(成功/失败)的 Job 记录历史(便于查看日志和排错)。
      • suspend: 布尔值,用于暂停 (true) 或恢复 (false) CronJob 的调度。
  2. 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 名)。
      • Job 的执行:‌ 一旦 Job 对象被创建,Kubernetes 的 ‌Job Controller‌ 就会接管:
        • 根据 Job 的 template 创建一个或多个 Pod。
        • 监控 Pod 的执行状态(成功完成、失败)。
        • 根据 Job 的配置(如 completionsparallelism)管理 Pod 的重试和并行执行。
      • 历史记录管理:‌ CronJob Controller 会根据 successfulJobsHistoryLimit 和 failedJobsHistoryLimit 的设置,自动清理旧的、已完成(成功或失败)的 Job 对象及其关联的 Pod(但 Pod 的日志通常需要独立收集)。

关键特性:

  1. 基于 Cron 表达式的精确调度:‌ 提供强大的时间控制能力,满足分钟、小时、天、月、周级别的各种定时需求。
  2. Job 模板化:‌ 将“何时运行”(CronJob)和“运行什么”(Job)清晰分离。jobTemplate 定义了每次计划执行时的具体任务逻辑。
  3. 并发控制 (concurrencyPolicy):‌ 关键特性,防止因任务执行时间过长导致多个实例意外并行运行,引发资源争用或逻辑冲突。Forbid 和 Replace 策略提供了灵活性。
  4. 容错与重试:
    • Job 级别的重试:‌ 由 Job Controller 负责。如果 Pod 运行失败(退出码非零),Job Controller 会根据 Job Spec 中配置的 backoffLimit 自动创建新的 Pod 重试任务。
    • 错过的调度 (startingDeadlineSeconds):‌ 处理短暂的调度器繁忙或控制平面问题导致的延迟,避免大量积压的 Job 同时启动冲击系统。
  5. 历史记录保留:‌ 保留一定数量的成功/失败 Job 记录,便于审计、日志查看和故障排查 (kubectl get jobs / kubectl logs <pod-name>)。
  6. 暂停与恢复 (suspend):‌ 无需删除 CronJob 即可临时停止其调度,方便维护或调试。
  7. 资源管理与隔离:‌ 每个 Job/Pod 可以定义自己的资源请求 (requests) 和限制 (limits),确保任务运行时获得所需资源且不会耗尽节点资源。多个 CronJob 的任务在集群资源池中共享与隔离。
  8. 声明式 API:‌ 通过清单文件描述期望状态,Kubernetes 负责使其达成并维持。

核心意义与价值:

  1. 自动化运维任务:
    • 数据库备份/恢复:‌ 定时备份关键数据库。
    • 日志轮转/清理:‌ 清理旧日志文件,释放存储空间。
    • 证书轮换:‌ 自动更新服务证书。
    • 集群维护:‌ 定期运行集群健康检查、资源报告生成。
    • 缓存预热/刷新:‌ 在访问高峰前预热缓存。
  2. 周期性数据处理与分析:
    • ETL 作业:‌ 按计划(如每天凌晨)从源系统抽取数据、转换、加载到数据仓库。
    • 报告生成:‌ 定时生成业务或系统性能报告。
    • 机器学习模型训练/再训练:‌ 按计划更新模型。
  3. 微服务架构中的定时触发:
    • 触发批处理服务。
    • 发送周期性通知或提醒。
    • 执行定期的数据同步任务。
  4. 提升可靠性与可管理性:
    • 标准化:‌ 将原来分散在各服务器上的 crontab 任务集中到 Kubernetes 统一管理。
    • 弹性与自愈:‌ 任务运行在 Pod 中,Pod 故障时由 Job Controller 自动重启(根据 backoffLimit)。节点故障时,任务会被调度到其他健康节点运行。
    • 资源利用率:‌ 集群资源池化,避免为偶尔运行的定时任务预留专用服务器。
    • 监控与日志:‌ 与 Kubernetes 的监控(Prometheus, Metrics Server)和日志(EFK, Loki)生态系统无缝集成,方便跟踪任务执行状态、性能和日志。
    • 版本控制与审计:‌ CronJob 定义作为 YAML 文件可纳入 Git 进行版本控制,变更可追踪。
  5. 云原生实践:‌ CronJob 是 Kubernetes 原生提供的定时任务解决方案,避免了在容器内运行 crond 或使用外部调度系统的复杂性,符合云原生理念。

与传统 cron 的主要区别:

特性 传统 cron (单机) Kubernetes CronJob (集群)
运行环境 单个服务器/虚拟机 Kubernetes 集群 (分布式)
调度单位 直接执行命令/脚本 创建 Job 对象,Job 再创建 Pod 执行容器
资源管理 受限于单机资源 集群资源池,可调度到任意节点,资源隔离
高可用/容错 依赖服务器高可用,任务本身无自动重启/转移 Pod 故障自动重启 (Job),节点故障自动迁移任务
并发控制 通常较弱,依赖脚本自身逻辑 (flock 等) 内置强大并发策略 (AllowForbidReplace)
声明式管理 配置文件管理 (如 /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-cleaner
  namespace: default
spec:
  schedule: "0 * * * *"  # 每小时的第0分钟运行
  concurrencyPolicy: Forbid  # 禁止并发执行
  startingDeadlineSeconds: 300  # 允许延迟5分钟
  successfulJobsHistoryLimit: 3  # 保留3个成功记录
  failedJobsHistoryLimit: 1      # 保留1个失败记录
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: log-cleaner
            image: alpine:latest
            command: ["/bin/sh", "-c"]
            args: 
              - echo "开始清理日志...";
                find /var/log/app -name "*.log" -mtime +7 -delete;
                echo "清理完成"
            volumeMounts:
            - name: log-volume
              mountPath: /var/log/app
          restartPolicy: OnFailure
          volumes:
          - name: log-volume
            hostPath:
              path: /var/log/app

逐行解释:

  1. apiVersion: batch/v1 - 指定使用的Kubernetes API版本

  2. kind: CronJob - 声明这是一个CronJob资源

  3. metadata部分:

    • name: log-cleaner - 给这个CronJob命名
    • namespace: default - 指定部署到default命名空间
  4. spec部分(CronJob核心配置):

    • schedule: "0 * * * *" - cron表达式,表示每小时的第0分钟运行
    • concurrencyPolicy: Forbid - 如果前一个任务还在运行,跳过本次执行
    • startingDeadlineSeconds: 300 - 允许任务延迟最多5分钟启动
    • 历史记录保留设置:成功3个,失败1个
  5. jobTemplate部分(定义实际运行的Job):

    • spec.template - Pod模板定义
    • containers配置:
      • 使用alpine镜像
      • commandargs组合相当于执行一个shell脚本
      • 脚本内容:查找并删除/var/log/app目录下7天前的.log文件
  6. volumeMountsvolumes

    • 将宿主机的/var/log/app目录挂载到容器内
    • 这样容器内操作会直接影响宿主机上的日志文件

这个示例展示了完整的CronJob配置,包含了定时调度、任务定义、资源挂载等关键元素。实际使用时可以根据需求调整schedule、镜像和command等内容


网站公告

今日签到

点亮在社区的每一天
去签到