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

embedded/2024/10/21 3:05:37/

文章目录

  • 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/embedded/129162.html

相关文章

LeetCode搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target 5 输出: 2 …

六、存储过程和触发器及视图和临时表

一. 存储过程和触发器是数据库中用于实现复杂业务逻辑和自动化操作的重要工具。 下面是对存储过程和触发器的详细讲解和示例说明&#xff1a;存储过程&#xff1a; 存储过程是一组预定义的SQL语句&#xff0c;封装在数据库中并可通过名称调用。存储过程可以接受输入参数和输出…

Win10+Python3.8+GPU版tensorflow2.x环境搭建最简流程(转载学习用)

在开始之前&#xff0c;请确保你的计算机已经安装了Windows 10操作系统&#xff0c;并且具备一个支持CUDA的NVIDIA显卡。 步骤1&#xff1a;安装Python 3.8 你可以选择从Python官网下载Python 3.8的安装包。在下载过程中&#xff0c;请确保勾选“Add Python to PATH”选项&…

gc cr/current block 2-way

官方文档描述 14.9.4 Analyzing Cache Fusion Transfer Impact Using GCS Statistics Describes how to monitor GCS performance by identifying objects read and modified frequently and the service times imposed by the remote access. Waiting for blocks to arrive ma…

java通过模板实现导出

/*** 导出作业票角度统计*/Log(title "导出作业票角度统计", businessType BusinessType.EXPORT)PostMapping("/export")public void export(HttpServletResponse response, PlanWiDto dto) throws IOException {try {ExcelUtil.createExcel(response, &…

线性可分支持向量机的原理推导 9-19基于拉格朗日函数L(w,b,α) 对b求偏导 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式 9-19 是对拉格朗日函数 L ( w , b , α ) L(\mathbf{w}, b, \alpha) L(w,b,α) 中的偏导数进行求解&#xff0c;目的是找到拉格朗日函数对 b b b 的…

东方通 TongHttpServer V6 配置与启动实战指南

东方通 TongHttpServer V6 配置与启动实战指南 文章目录 东方通 TongHttpServer V6 配置与启动实战指南一 简述二 THS 配置1&#xff09;配置负载均衡请求2&#xff09;配置前端网页请求3&#xff09;配置后端反向代理4&#xff09;完整的 httpserver.conf 三 配置开机启动1&am…

jmeter中对于有中文内容的csv文件怎么保存

jmeter的功能很强大&#xff0c;但是细节处没把握好就得不到预期的结果。今天来讲讲有中文内容的csv文件的参数化使用中需要注意的事项。 对于有中文内容&#xff0c;涉及到编码格式&#xff0c;为了让jmeter能正确地读取csv文件中的中文&#xff0c;需要把文件转码为UTF-8BOM…