K8S 污点和容忍度(Taint,Toleration)

2024-04-18 13:20

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

介绍

在 Kubernetes 中,污点(Taints)和容忍度(Tolerations)是用于节点调度的一种机制,它们允许你控制哪些 Pod 能够调度到哪些节点上。

污点(Taints)

污点是节点上的一种属性,它会阻止未经授权的 Pod 调度到该节点上。当你在节点上设置了一个污点时,只有那些具有匹配容忍度的 Pod 才能够在该节点上被调度。

作用方式:污点通过给节点添加标签的方式生效。
语法:污点由 key、value 和 effect 三个部分组成。
key:污点的名称。
value:污点的值。
effect:污点的影响,可以是 “NoSchedule”(默认)或 “PreferNoSchedule”。“NoSchedule” 表示将阻止未经容忍的 Pod 调度到该节点上,而 “PreferNoSchedule” 表示尽量不在该节点上调度未经容忍的 Pod,但不是绝对禁止。

创建污点

kubectl taint nodes node01 key1=value1:NoSchedule

查看污点

# 查看所有节点的是否有污点
[root@master01 ~]# kubectl describe node | grep -i taint
Taints:             <none>
Taints:             <none>
Taints:             <none>
Taints:             key1=value1:NoSchedule
Taints:             <none>

删除污点

kubectl taint nodes node1 key1=value1:NoSchedule-

容忍度(Tolerations):

容忍度是 Pod 的一个属性,它允许 Pod 被调度到带有指定污点的节点上。如果 Pod 具有与节点上设置的污点匹配的容忍度,则它可以被调度到该节点上。

作用方式:通过在 Pod 的 YAML 配置中添加 tolerations 来指定。
语法:容忍度由 key、operator、value、effect 四个部分组成。
key:与节点上设置的污点的 key 匹配。
operator:用于指定匹配规则,常见的有 “Equal”、“Exists”、“Exists”。
value:与节点上设置的污点的 value 匹配。
effect:与节点上设置的污点的 effect 匹配。

添加容忍度

这是部分yaml文件内容,添加容忍度其实类似于添加标签。

tolerations:
- key: "key1"operator: "Equal"value: "value1"effect: "NoSchedule"

具体应用

根据咱们上面添加的污点设置一下nginx Pod容忍度。

apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresenttolerations:- key: "key1"value: "value1"operator: "Exists"effect: "NoSchedule"operator: "Equal"

部署这个Pod以后将会调度到node01上面。

operator 字段解释:

  • operator: “Equal” : 当 operator 设置为 “Equal” 时,容忍度会精确匹配节点上设置的污点的键、值和效果。只有当节点上的污点的键、值和效果与容忍度配置中的完全匹配时,Pod 才能够被调度到该节点上。
  • operator: “Exists” : 当 operator 设置为 “Exists” 时,容忍度只关注节点上是否存在指定键的污点,而不关心污点的值和效果。只要节点上存在与容忍度配置中的键匹配的污点,无论其值和效果如何,Pod 都能够被调度到该节点上。
  • operator: “Exists” : 当 operator 设置为 “DoesNotExist” 时,容忍度只关注节点上是否不存在指定键的污点。只有当节点上不存在与容忍度配置中的键匹配的污点时,Pod 才能够被调度到该节点上。

effect 字段解释

  • effect: “NoSchedule” :除非具有匹配的容忍度规约,否则新的 Pod 不会被调度到带有污点的节点上。 当前正在节点上运行的 Pod 不会被驱逐。
  • effect: “PreferNoSchedule” :PreferNoSchedule 是“偏好”或“软性”的 NoSchedule。 控制平面将尝试避免将不能容忍污点的 Pod 调度到的节点上,但不能保证完全避免。
  • effect: “NoExecute” :如果 Pod 不能容忍这类污点,会马上被驱逐。
    如果 Pod 能够容忍这类污点,但是在容忍度定义中没有指定 tolerationSeconds, 则 Pod 继续运行,如果 Pod 能够容忍这类污点,而且指定了 tolerationSeconds, 则 Pod 还能在这个节点上继续运行这个指定的时间长度。 这段时间过去后,节点生命周期控制器从节点驱除这些 Pod。

举个例子:

apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: nginximage: nginxtolerations:- key: "key1"operator: "Equal"value: "value1"effect: "NoExecute"tolerationSeconds: 3600  # 容忍度持续时间为 3600 秒(1 小时),超过这个时间仍然会呗驱逐。

说明

  • 可以给一个节点添加多个污点,也可以给一个 Pod 添加多个容忍度设置。 Kubernetes 处理多个污点和容忍度的过程就像一个过滤器:从一个节点的所有污点开始遍历, 如果全部匹配则调度到该节点,只要有一个不匹配就不会调度到该节点。

基于污点的驱逐

  • node.kubernetes.io/not-ready:节点未准备好。这相当于节点状况 Ready 的值为 “False”。
  • node.kubernetes.io/unreachable:节点控制器访问不到节点. 这相当于节点状况 Ready 的值为 “Unknown”。
  • node.kubernetes.io/memory-pressure:节点存在内存压力。
  • node.kubernetes.io/disk-pressure:节点存在磁盘压力。
  • node.kubernetes.io/pid-pressure:节点的 PID 压力。
  • node.kubernetes.io/network-unavailable:节点网络不可用。
  • node.kubernetes.io/unschedulable:节点不可调度。
  • node.cloudprovider.kubernetes.io/uninitialized:如果 kubelet 启动时指定了一个“外部”云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在 cloud-controller-manager 的一个控制器初始化这个节点后,kubelet 将删除这个污点。

通过污点和容忍度的组合,你可以精确地控制 Pod 在 Kubernetes 集群中的调度行为,确保特定类型的任务被分配到特定类型的节点上,从而更好地管理资源和提高系统的稳定性和可靠性。

这篇关于K8S 污点和容忍度(Taint,Toleration)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

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

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

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

k8s部署MongDB全过程

《k8s部署MongDB全过程》文章介绍了如何在Kubernetes集群中部署MongoDB,包括环境准备、创建Secret、创建服务和Deployment,并通过Robo3T工具测试连接... 目录一、环境准备1.1 环境说明1.2 创建 namespace1.3 创建mongdb账号/密码二、创建Sec

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

90、k8s之secret+configMap

一、secret配置管理 配置管理: 加密配置:保存密码,token,其他敏感信息的k8s资源 应用配置:我们需要定制化的给应用进行配置,我们需要把定制好的配置文件同步到pod当中容器 1.1、加密配置: secret: [root@master01 ~]# kubectl get secrets ##查看加密配置[root@master01 ~]# kubectl get se

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP