K8S学习指南(46)-k8s调度之污点与容忍度

2023-12-29 08:28

本文主要是介绍K8S学习指南(46)-k8s调度之污点与容忍度,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 引言
    • 什么是污点与容忍度?
    • 污点(Taints)的基本结构
    • 容忍度(Tolerations)的基本结构
    • 污点与容忍度的使用方法
      • 1. 定义节点污点
      • 2. 定义Pod容忍度
      • 3. 验证污点与容忍度
    • 实际应用示例
    • 结论

引言

Kubernetes(K8s)是一款开源的容器编排平台,具有强大的调度系统,负责将容器化应用程序合理地分配到集群中的节点上。在K8s中,通过污点(Taints)和容忍度(Tolerations)的机制,可以实现对节点的特性进行标记和容忍,从而实现更灵活的调度策略。本文将深入讨论污点与容忍度的概念、用法,并通过详细的示例演示如何在实际场景中应用这两个特性。

什么是污点与容忍度?

在Kubernetes中,污点是一种用于标记节点的机制,它表示该节点上可能存在某些不适用于所有Pod的特性,如特定硬件、操作系统等。而容忍度则是Pod对污点的响应机制,它定义了Pod是否可以被调度到带有特定污点的节点上。

污点和容忍度的主要应用场景包括:

  1. 硬件差异: 将某个节点标记为具有特定硬件特性,如GPU,然后只有那些具备相应容忍度的Pod才能被调度到该节点上。
  2. 操作系统需求: 标记一些节点为运行特定操作系统的节点,只有设置了相应容忍度的Pod才能被调度到这些节点上。
  3. 节点负载限制: 将一些节点标记为负载较高,只有具备相应容忍度的Pod才能被调度到这些节点上,以实现负载均衡。

污点(Taints)的基本结构

在使用污点之前,我们需要了解其基本结构。一个节点可以被标记为具有一个或多个污点,每个污点都由以下几个组件构成:

  • key: 污点的键,用于标识污点。
  • value: 污点的值,与键一起形成唯一的标识。
  • effect: 污点的作用效果,包括NoSchedule(不调度)、PreferNoSchedule(尽量不调度)和NoExecute(驱逐已有Pod)。

以下是一个简单的节点污点示例:

apiVersion: v1
kind: Node
metadata:name: node-1
spec:taints:- key: "special"value: "gpu"effect: "NoSchedule"

在这个示例中,我们将名为node-1的节点标记为具有一个特殊的污点,键为special,值为gpu,作用效果为NoSchedule,表示不允许调度普通Pod到这个节点上。

容忍度(Tolerations)的基本结构

容忍度是Pod对污点的响应机制,它定义了Pod是否可以被调度到带有特定污点的节点上。每个容忍度都由以下几个组件构成:

  • key: 容忍度的键,与污点的键进行匹配。
  • operator: 匹配操作符,包括Exists(键存在)、Equal(键值匹配)等。
  • value: 匹配的值,与污点的值进行匹配。
  • effect: 匹配成功后的生效效果,包括NoSchedule(不调度)、PreferNoSchedule(尽量不调度)和NoExecute(驱逐已有Pod)。

以下是一个简单的Pod容忍度示例:

apiVersion: v1
kind: Pod
metadata:name: tolerant-pod
spec:containers:- name: nginx-containerimage: nginx:latesttolerations:- key: "special"operator: "Equal"value: "gpu"effect: "NoSchedule"

在这个示例中,我们创建了一个名为tolerant-pod的Pod,定义了容忍度,表示该Pod可以被调度到带有special键为gpu值的节点上。

污点与容忍度的使用方法

1. 定义节点污点

要使用污点,首先需要在节点的定义中配置污点。以下是一个带有多个污点的节点定义示例:

apiVersion: v1
kind: Node
metadata:name: node-2
spec:taints:- key: "special"value: "gpu"effect: "NoSchedule"- key: "critical"value: "high-load"effect: "NoSchedule"

在这个示例中,我们创建了一个名为node-2的节点,它被标记为具有两个污点。第一个污点的键为special,值为gpu,作用效果为NoSchedule。第二个污点的键为critical,值为high-load,同样作用效果为NoSchedule

2. 定义Pod容忍度

将定义好的污点应用于实际的Pod。以下是一个示例,演示了如何在Pod中定义容忍度:

apiVersion: v1
kind: Pod
metadata:name: tolerant-pod-2
spec:containers:- name: nginx-containerimage: nginx:latesttolerations:- key: "special"operator: "Equal"value: "gpu"effect: "NoSchedule"- key: "critical"operator: "Exists"effect: "NoSchedule"

在这个示例中,我们创建了一个名为tolerant-pod-2的Pod,定义了两个容忍度。第一个容忍度表示该Pod可以被调度到带有special键为gpu值的节点上,而第二个容忍度表示该Pod可以被调度到带有critical键的节点上。

3. 验证污点与容忍度

通过查看节点和Pod的描述,我们可以验证污点与容忍度是否被正确应用。执行以下命令:

kubectl describe node <node-name>
kubectl describe pod <pod-name>

在输出中,你应该能够看到与定义的污点和容忍度相对应的信息,确认节点是否被正确标记为有污点,以及Pod是否被正确容忍。

实际应用示例

假设我们有一个Kubernetes集群,其中包含一些具有GPU的节点,同时一些节点负载较高。我们希望确保GPU密集型的Pod能够被调度到具有GPU的节点上,并且负载较高的Pod能够避免被调度到负载已经较高的节点上。通过污点与容忍度,我们可以实现这一需求。

以下是一个示例,演示了如何在集群中使用污点与容忍度:

apiVersion: v1
kind: Node
metadata:name: gpu-node
spec:taints:- key: "gpu"value: "true"effect: "NoSchedule"
---
apiVersion: v1
kind: Node
metadata:name: high-load-node
spec:taints:- key: "load"value: "high"effect: "NoSchedule"
---
apiVersion: v1
kind: Pod
metadata:name: gpu-intensive-pod
spec:containers:- name: gpu-containerimage: gpu-intensive-app:latesttolerations:- key: "gpu"operator: "Equal"value: "true"effect: "NoSchedule"
---
apiVersion: v1
kind: Pod
metadata:name: low-load-pod
spec:containers:- name: low-load-containerimage: low-load-app:latesttolerations:- key: "load"operator: "Exists"effect: "NoSchedule"

在这个示例中,我们创建了两个节点,分别是gpu-nodehigh-load-node,它们分别被标记为具有gpuload的污点。然后,我们创建了两个Pod,gpu-intensive-podlow-load-pod,它们分别定义了对应的容忍度。gpu-intensive-pod容忍gpu污点,而low-load-pod容忍load污点。

通过这样的方式,我们可以实现GPU密集型Pod被调度到具有GPU的节点上,而负载较低的Pod避免被调度到负载较高的节点上。

结论

污点与容忍度是Kubernetes中非常有用的调度特性,通过定义节点的污点和Pod的容忍度,实现了对集群资源的更细粒度控制。通过本文的详细介绍和示例,希望读者能够更好地理解和运用污点与容忍度,从而优化Kubernetes集群中的Pod的调度策略,提高应用程序的性能和可用性。

这篇关于K8S学习指南(46)-k8s调度之污点与容忍度的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/548919

相关文章

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

k8s中实现mysql主备过程详解

《k8s中实现mysql主备过程详解》文章讲解了在K8s中使用StatefulSet部署MySQL主备架构,包含NFS安装、storageClass配置、MySQL部署及同步检查步骤,确保主备数据一致... 目录一、k8s中实现mysql主备1.1 环境信息1.2 部署nfs-provisioner1.2.

k8s admin用户生成token方式

《k8sadmin用户生成token方式》用户使用Kubernetes1.28创建admin命名空间并部署,通过ClusterRoleBinding为jenkins用户授权集群级权限,生成并获取其t... 目录k8s admin用户生成token创建一个admin的命名空间查看k8s namespace 的

k8s搭建nfs共享存储实践

《k8s搭建nfs共享存储实践》本文介绍NFS服务端搭建与客户端配置,涵盖安装工具、目录设置及服务启动,随后讲解K8S中NFS动态存储部署,包括创建命名空间、ServiceAccount、RBAC权限... 目录1. NFS搭建1.1 部署NFS服务端1.1.1 下载nfs-utils和rpcbind1.1

k8s容器放开锁内存限制问题

《k8s容器放开锁内存限制问题》nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并... 目录问题问题确认放开容器max locked memory限制总结参考:https://Access

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

Linux之计划任务和调度命令at/cron详解

《Linux之计划任务和调度命令at/cron详解》:本文主要介绍Linux之计划任务和调度命令at/cron的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux计划任务和调度命令at/cron一、计划任务二、命令{at}介绍三、命令语法及功能 :at

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring