K8s高级调度--CronJob与污点容忍及亲和力

news/2024/10/18 5:11:44/

文章目录

  • CronJob
    • CronJob 的核心概念
      • Job
      • 调度时间表
      • 并发策略
      • 启动历史保留
    • CronJob YAML 配置示例
      • Cron 表达式
    • CronJob 实际应用场景
      • 定期数据备份
      • 日志清理任务
  • 污点和容忍
    • 污点的概念
    • 污点的三种效应
    • 污点和容忍的工作流程
    • 设置污点和容忍
      • 1. 给节点添加污点
      • 2. 给 Pod 添加容忍
    • 实际应用中的场景
      • 1.专用节点
      • 2.隔离不稳定节点
      • 3.临时节点维护
    • 污点和容忍的管理
      • 添加污点:
      • 删除污点
      • 查看节点上的污点:
  • 亲和力
    • 节点亲和性(Node Affinity)
    • Pod 亲和性(Pod Affinity)
    • Pod 反亲和性(Pod Anti-Affinity)
    • 亲和力的使用场景

CronJob

在 Kubernetes 中,CronJob 是用于周期性调度任务的资源,类似于 Linux 系统中的 cron。CronJob 通过定义一个特定的时间表自动创建和运行 Job,通常用于执行周期性的批处理任务,例如定期备份数据、发送报告或清理过期数据等。

CronJob 的核心概念

Job

CronJob 的核心是 Job,Job 是 Kubernetes 中的一种资源,用于在集群中运行一个或多个 Pod,并确保 Pod 成功完成。如果 Pod 失败,Job 会重新启动直到成功,或者达到失败重试的限制。

调度时间表

CronJob 使用 Cron 表达式来定义任务何时执行。Cron 表达式的格式为 minute hour day-of-month month day-of-week,

Cron表达式minute:       表示任务在每小时的第几分钟执行,范围 0-59。hour:         表示任务在一天中的第几小时执行,范围 0-23。day-of-month: 表示任务在一个月中的哪一天执行,范围 1-31。month:        表示任务在一年中的哪一个月执行,范围 1-12。day-of-week:  表示任务在一周中的哪一天执行,范围 0-6(0 表示星期日)。

并发策略

并发策略:Allow: 默认值,允许多个 CronJob 实例并行运行。Forbid: 禁止并发运行,如果前一个任务尚未完成,新的任务不会启动。Replace: 如果新的任务到达时旧任务还在运行,会终止旧任务并启动新任务。

启动历史保留

启动历史保留:successfulJobsHistoryLimit: 保留的成功任务的历史记录数,默认为 3。failedJobsHistoryLimit: 保留的失败任务的历史记录数,默认为 1

CronJob YAML 配置示例

以下是一个基本的 CronJob 配置示例,该 CronJob 每分钟运行一次,打印当前时间并显示 “Hello from the Kubernetes cluster!” 消息。

apiVersion: batch/v1
kind: CronJob
metadata:name: hello-cronjob
spec:schedule: "*/1 * * * *"  # 每分钟运行一次jobTemplate:spec:template:spec:containers:- name: helloimage: busyboxargs:- /bin/sh- -c- date; echo Hello from the Kubernetes cluster!restartPolicy: OnFailuresuccessfulJobsHistoryLimit: 3  # 成功任务历史保留 3 条failedJobsHistoryLimit: 1      # 失败任务历史保留 1 条
解释:schedule:*/1 * * * * 表示每分钟执行一次该 CronJob。Cron 表达式中每个字段的含义是:每 1 分钟执行一次。jobTemplate:定义了创建的 Job 模板。containers:定义了容器的配置,这里使用 busybox 镜像来执行任务。args:定义容器启动时运行的命令,即打印当前时间并显示一条消息。restartPolicy:指定 Pod 的重启策略为 OnFailure,即仅当任务失败时重新启动容器。successfulJobsHistoryLimit 和 failedJobsHistoryLimit:限制保留的成功和失败任务历史记录的数量。

Cron 表达式

* * * * *
| | | | |
| | | | +----- 一周中的星期几 (0 - 6) (0 代表星期天)
| | | +------- 一年中的月份 (1 - 12)
| | +--------- 一个月中的天 (1 - 31)
| +----------- 一天中的小时 (0 - 23)
+------------- 每小时的分钟 (0 - 59)
示例:"*/5 * * * *":    每 5 分钟运行一次。"0 0 * * *":      每天午夜(00:00)运行一次。"0 12 * * 1-5":   每周一至周五中午 12 点运行一次。

CronJob 实际应用场景

定期数据备份

定期数据备份 在生产环境中,定期备份数据库或应用数据是常见的需求。可以设置一个 CronJob,每天凌晨备份数据库,并将其存储在持久化存储或云存储上。

apiVersion: batch/v1
kind: CronJob
metadata:name: db-backup
spec:schedule: "0 0 * * *"  # 每天凌晨 0 点执行jobTemplate:spec:template:spec:containers:- name: backupimage: postgres:13env:- name: PGHOSTvalue: "database-service"- name: PGUSERvalueFrom:secretKeyRef:name: db-secretkey: username- name: PGPASSWORDvalueFrom:secretKeyRef:name: db-secretkey: passwordargs:- /bin/sh- -c- pg_dumpall -c -U $PGUSER > /backups/backup.sqlrestartPolicy: OnFailurevolumes:- name: backup-storagepersistentVolumeClaim:claimName: backup-pvc

这个例子展示了如何使用 PostgreSQL 镜像备份数据库,并将其保存到挂载的持久卷中。该任务每天凌晨运行一次。

日志清理任务

日志清理任务 定期清理旧日志文件或临时数据是另一种常见的需求。可以设置一个 CronJob 每周执行一次清理操作。

apiVersion: batch/v1
kind: CronJob
metadata:name: clean-logs
spec:schedule: "0 2 * * 0"  # 每周日凌晨 2 点执行jobTemplate:spec:template:spec:containers:- name: cleanerimage: busyboxargs:- /bin/sh- -c- rm -rf /var/log/*.logrestartPolicy: OnFailure

Kubernetes 中的 CronJob 用于定期执行任务,类似于传统操作系统中的 cron。通过设置 CronJob,可以实现如数据备份、日志清理、报告生成等周期性任务。CronJob 的配置灵活,支持并发策略、启动期限、任务历史等配置项。使用 Cron 表达式可以精确定义任务的调度时间,满足生产环境中的多种定期任务需求。

污点和容忍

在 Kubernetes 中,污点(Taint) 和 容忍(Toleration) 是用于控制 Pod 调度的一种机制。通过给节点添加污点,可以避免不希望的 Pod 被调度到该节点上,除非这些 Pod 对应的容忍(Toleration)允许它们被调度到该节点。

污点的核心思想是:节点会“驱逐”掉不具备相应容忍的 Pod。这意味着 Kubernetes 可以防止某些节点上的 Pod 执行,除非它们显式允许容忍这些污点。

污点的概念

污点的概念1.Taint (污点):给节点添加污点,表示“不允许”某些 Pod 调度到该节点,除非 Pod 有相应的容忍。污点由键(key)、值(value) 和 效应(effect) 三部分组成:key=value:effect,其中 key 和 value 表示自定义的标识信息,effect 表示污点对 Pod 的影响。2.Toleration (容忍):Pod 通过设置容忍来允许自己被调度到带有污点的节点上。Pod 中的容忍允许其忽略节点的污点并继续调度到该节点。容忍使用与污点相同的键、值和效应,但它们的目的正好相反,表示 Pod 可以在含有该污点的节点上运行。

污点的三种效应

污点的三种效应1.NoSchedule:有这个污点的节点不允许调度不具备相应容忍的 Pod。意味着没有容忍的 Pod 不会被调度到这个节点上。2.PreferNoSchedule:Kubernetes 会尽量避免将没有容忍的 Pod 调度到该节点,但不是强制的。这是一种软约束,意味着 Kubernetes 会优先避免在该节点上调度不符合条件的 Pod。3.NoExecute:一旦污点被添加到节点上,所有没有相应容忍的 Pod 都会从该节点驱逐出去。这种效应会同时影响已经在节点上运行的 Pod 和即将调度的 Pod。

污点和容忍的工作流程

污点和容忍的工作流程1.管理员通过给节点设置污点,防止 Pod 被调度到不合适的节点上。2.开发者可以为 Pod 添加容忍,允许 Pod 被调度到带有特定污点的节点上。3.如果 Pod 没有容忍某节点的污点,那么它将不会被调度到该节点,或被驱逐出节点。

设置污点和容忍

1. 给节点添加污点

假设我们希望给一个名为 node1 的节点添加一个污点,防止普通 Pod 被调度到这个节点上。可以使用以下命令:

kubectl taint nodes node1 key1=value1:NoSchedule

这个命令为节点 node1 添加了一个污点 key1=value1:NoSchedule,没有相应容忍的 Pod 将无法被调度到这个节点上。

2. 给 Pod 添加容忍

要让某些 Pod 容忍这个污点,可以在 Pod 的 YAML 文件中添加 tolerations 字段,例如:

apiVersion: v1
kind: Pod
metadata:name: tolerant-pod
spec:containers:- name: nginximage: nginxtolerations:- key: "key1"operator: "Equal"value: "value1"effect: "NoSchedule"

在这个例子中,Pod tolerant-pod 通过添加容忍,允许它被调度到带有 key1=value1:NoSchedule 污点的节点上。

实际应用中的场景

1.专用节点

如果有些节点专门用于运行某些特定的工作负载(如 GPU 计算),可以使用污点避免其他非 GPU 工作负载被调度到这些节点上。

kubectl taint nodes gpu-node gpu=true:NoSchedule

这个命令会给节点 gpu-node 添加一个污点,防止没有 GPU 容忍的 Pod 被调度到该节点。

apiVersion: v1
kind: Pod
metadata:name: gpu-pod
spec:containers:- name: gpu-containerimage: nvidia/cudatolerations:- key: "gpu"operator: "Equal"value: "true"effect: "NoSchedule"

这个 Pod gpu-pod 可以被调度到带有 gpu=true:NoSchedule 污点的节点上,因为它包含了相应的容忍。

2.隔离不稳定节点

当 Kubernetes 检测到某些节点出现问题时,可以给这些节点添加污点,使其不再调度新的 Pod,同时驱逐已经运行的 Pod。

kubectl taint nodes node1 node-problem=true:NoExecute

当节点 node1 被标记为有问题时,所有没有 NoExecute 容忍的 Pod 会被从该节点上驱逐。

3.临时节点维护

如果一个节点需要维护,管理员可以通过添加 NoSchedule 污点来避免新的 Pod 被调度到该节点,同时不影响已经在节点上运行的 Pod。

kubectl taint nodes node1 maintenance=true:NoSchedule

此时,没有 maintenance=true:NoSchedule 容忍的 Pod 将不会被调度到这个节点。

污点和容忍的管理

添加污点:

kubectl taint nodes <node-name> <key>=<value>:<effect>

删除污点

要删除污点,可以在命令末尾加上 -,例如:

kubectl taint nodes <node-name> <key>=<value>:<effect>-

查看节点上的污点:

使用以下命令查看节点上的污点:

kubectl describe node <node-name>
总结污点(Taint) 是在节点上设置的限制,用于阻止不符合条件的 Pod 被调度到该节点。容忍(Toleration) 是在 Pod 上设置的配置,用于允许特定的 Pod 调度到带有污点的节点。污点和容忍主要用于隔离和调度策略的控制,帮助管理员将不同的工作负载分配到合适的节点上,或者隔离有问题的节点。

通过合理使用污点和容忍,Kubernetes 提供了强大的调度控制能力,可以确保特定 Pod 的调度规则,适合多种不同的场景和需求。

亲和力

在 Kubernetes 中,亲和力(Affinity) 是用于控制 Pod 如何在集群中的节点上分布的机制。它通过设置规则,定义哪些 Pod 更倾向于或必须被调度到特定节点上。亲和力机制可以帮助你优化应用的资源利用率、提高可靠性以及实现应用隔离。亲和力分为 节点亲和性(Node Affinity) 和 Pod 亲和性(Pod Affinity),相对应的还有 Pod 反亲和性(Pod Anti-Affinity)。

节点亲和性(Node Affinity)

节点亲和性 是基于节点的标签来定义 Pod 对节点的调度策略。它类似于 nodeSelector,但提供了更多的表达方式和灵活性,允许你指定"软"(preferred)或"硬"(required)规则。

节点亲和性(Node Affinity)1.硬性亲和性(requiredDuringSchedulingIgnoredDuringExecution)Pod 必须调度到满足特定条件的节点上,否则无法启动。2.软性亲和性(preferredDuringSchedulingIgnoredDuringExecution)Pod 更倾向于调度到满足条件的节点上,但如果没有可用节点,也不会阻止 Pod 的调度。

示例:节点亲和性
以下例子展示了一个 Pod 必须调度到带有 disktype=ssd 标签的节点上(硬性要求),并且更倾向于调度到带有 zone=us-west 标签的节点上(软性要求)。

apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- name: nginximage: nginxaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: disktypeoperator: Invalues:- ssdpreferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: zoneoperator: Invalues:- us-west在这个例子中:1.硬性亲和性要求 Pod 只能调度到标签 disktype=ssd 的节点上。2.软性亲和性表示,Pod 优先调度到标签 zone=us-west 的节点上,但不强制。

Pod 亲和性(Pod Affinity)

Pod 亲和性 用于指定某些 Pod 倾向于与特定的其他 Pod 一起运行。Pod 亲和性允许你将具有协作关系的 Pod 安排在同一个节点或节点组上,例如需要低延迟通信的应用。

示例:Pod 亲和性
下面的例子展示了一个 Pod 需要与带有标签 app=web 的 Pod 部署在同一个节点上。

apiVersion: v1
kind: Pod
metadata:name: backend
spec:containers:- name: backendimage: nginxaffinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:labelSelector:matchExpressions:- key: appoperator: Invalues:- webtopologyKey: "kubernetes.io/hostname"在这个例子中:该 Pod 需要与带有标签 app=web 的 Pod 在同一主机(由 kubernetes.io/hostname 定义的拓扑键)上运行,这是硬性要求。

Pod 反亲和性(Pod Anti-Affinity)

Pod 反亲和性 用于指定某些 Pod 不应与特定的其他 Pod 一起运行。Pod 反亲和性通常用于确保 Pod 分布在不同节点上,以避免单点故障(比如高可用性应用)或避免资源争用。

示例:Pod 反亲和性
以下例子展示了一个 Pod 不能与带有标签 app=frontend 的 Pod 部署在同一个节点上。

apiVersion: v1
kind: Pod
metadata:name: database
spec:containers:- name: databaseimage: postgresaffinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:labelSelector:matchExpressions:- key: appoperator: Invalues:- frontendtopologyKey: "kubernetes.io/hostname"在这个例子中:该Pod不能与带有标签 app=frontend 的 Pod 部署在同一个节点上,这是一个硬性要求。topologyKey: "kubernetes.io/hostname" 指定 Pod 必须分布在不同的节点上。

亲和力的使用场景

亲和力的使用场景1.高可用性:使用 Pod 反亲和性 可以确保相同类型的 Pod 分布在不同的节点上,以实现高可用性。比如,在多副本数据库部署中,避免多个副本调度到同一节点,以降低单点故障的风险。2.低延迟要求的应用:使用 Pod 亲和性 可以确保互相依赖的 Pod 部署在相同的节点或相近的拓扑上,减少网络延迟,例如微服务架构中的前端和后端服务。3.节点资源优化:使用节点亲和性 确保应用调度到具有特定硬件资源(如 GPU 或 SSD)的节点上,以满足性能要求。多租户隔离:通过 节点亲和性 和 Pod 反亲和性 可以确保不同租户的 Pod 部署在不同的节点上,实现资源隔离。

亲和力与调度策略的结合

亲和力可以与 Kubernetes 调度策略结合使用,进一步优化应用的调度。例如,结合 资源请求和限制 来确保应用不仅调度到特定节点,还能够合理分配资源。同时,配合 优先级和抢占 策略可以确保高优先级的 Pod 可以调度到最适合的节点上。

Kubernetes 的亲和力机制提供了灵活的方式来控制 Pod 的调度,帮助优化资源利用、提高可用性并满足应用的各种需求。通过配置 节点亲和性、Pod 亲和性 和 Pod 反亲和性,可以实现精确的调度控制。


http://www.ppmy.cn/news/1539902.html

相关文章

植物大战僵尸杂交版即将新增内容介绍

新BOSS僵尸&#xff1a;埃德加二世 特点&#xff1a;埃德加博士的克隆体&#xff0c;驾驶小型机甲。体型&#xff1a;小于原版僵王的头。血量&#xff1a;120000&#xff0c;是原版僵王复仇的2倍。免疫效果&#xff1a;减速、冰冻、黄油效果&#xff0c;能阻挡子弹。行为模式&…

vue3中监视 Reactive对象中的属性

watch 的第一个参数可以是不同形式的“数据源”&#xff1a;它可以是一个 ref (包括计算属性)、一个响应式对象、一个 getter 函数、或多个数据源组成的数组 一、框架&#xff1a; <template><div class"divBox"><h2>姓名&#xff1a;{{ person.…

写一个程序拷贝文件 C语言版(含源码)

在当前目录下放一个文件data.txt&#xff0c;写一个程序&#xff0c;将data.txt文件拷贝一份&#xff0c;生成data_copy.txt文件。 基本思路&#xff1a; 打开文件data.txt&#xff0c;读取数据打开文件data_copy.txt&#xff0c;写数据从data.txt中读取数据存放到data_copy.…

什么是NLP?

文章目录 NLP概述NLP三个字母含义NLP发展历程NLP杰出贡献者NLP应用前景NLP对人生的积极影响NLP基本精神&#xff1a;12条前提假设NLP部分基本术语结束语 NLP概述 大家好&#xff0c;今天我们将一起探索NLP&#xff0c;即神经语言程序学这一强大的领域。NLP是对人类主观经验的研…

第六课 Vue中的条件语句指令

Vue中的条件语句指令 Vue中提供了条件语句指令&#xff0c;用户无需单独再写条件语句 基础示例&#xff1a; 判断 10 > 5 <div id"app"><div v-if"10 > 5">显示</div></div><script>new Vue({el: #app})</scrip…

统一认证服务升级

现状 项目概述 1.后端认证服务 提供注册/登录/用户信息管理 提供Token管理 2.前端登录-sdk 提供统一登录弹窗SDK 现有认证流程 登录SDK详解 登录项目提供了统一登录的login.js&#xff0c;其功能是提供统一的登录页面&#xff0c;封装回调函数&#xff08;如点击事件回调…

学习笔记——交换——STP(生成树)基本概念

三、基本概念 1、桥ID/网桥ID (Bridege ID&#xff0c;BID) 每一台运行STP的交换机都拥有一个唯一的桥ID(BID)&#xff0c;BID(Bridge ID/桥ID)。在STP里我们使用不同的桥ID标识不同的交换机。 (2)BID(桥ID)组成 BID(桥ID)组成(8个字节)&#xff1a;由16位(2字节)的桥优先级…

SpringBoot原理(续)

上篇博客在跟踪SpringBoot自动配置的源码的时候&#xff0c;在自动配置类声明bean的时候&#xff0c;除了在方法上加了一个Bean注解以外&#xff0c;还会经常用到一个注解&#xff0c;就是以Conditional开头的这一类的注解。以Conditional开头的这些注解都是条件装配的注解。下…