Kubernetes——污点和容忍度
Pod是一组一个或多个容器,是 Kubernetes 中最小的可部署单元。节点是集群中单个机器的表示(我们可以简单地将这些机器视为一组 CPU 和 RAM)。节点可以是虚拟机,也可以是托管在 Azure 等云提供商上的数据中心中的物理机。
当用户运行下面给出的 pod 创建命令时,请求将被发送到 API 服务器。调度程序一直在监视 API 服务器的新事件,它识别未分配的 pod,并根据节点选择器、污染/容忍度、节点亲和力、CPU 和内存要求等各种因素决定应该选择哪个节点来部署这个 pod。一旦决定了节点并将其发送到 API 服务器,然后kubelet确保 pod 正在分配的节点上运行。
kubectl (client ): kubectl create -f
需要污染和容忍:
具有不同硬件的节点:如果您有一个具有不同硬件的节点(例如:GPU)并且您只想在其上调度需要 GPU 的 pod。示例:假设有 2 个应用程序 APP 1:一个简单的仪表板应用程序和 APP 2:一个数据密集型应用程序,两者都有不同的 CPU 和内存要求。 APP1 不需要太多内存和 CPU,而 APP 2 需要高内存和 CPU(GPU 机器)。现在借助 taints 和 tolerations + Node affinity,我们可以确保 APP 2 部署在 CPU 和内存较高的节点上,而 APP1 可以调度在任何 CPU 和内存较低的节点上。
限制节点中的 pod 数量:如果您希望节点调度一定数量的 pod 以减少该节点上的负载,那么 Taints/Tolerations + Node Affinity 可以帮助我们实现它。示例:考虑有一个包含数据库应用程序的 pod,该数据库应用程序需要快速查询数据并具有高可用性。因此,我们将为这个 pod 分配一个具有高内存和 CPU 的节点。现在节点中将只有一个 pod,这使得节点资源的使用更加快速高效。
- 节点亲和性确保 pod 被安排在特定节点中。
- 污点与节点亲和性相反;它们允许一个节点排斥一组 pod。
- Toleration应用于 Pod,并允许(但不要求)Pod 调度到具有匹配污点的节点上。
让我们通过一个例子来理解这一点:假设有一个人 N1 和蚊子 P1。污染示例:人 N1 应用了驱虫剂(污染),所以现在蚊子 P1 将无法攻击人 N1。现在让我们假设有一个黄蜂 P2 试图攻击人 N1
耐受性示例:黄蜂 P2 对驱虫剂具有耐受性,因此没有效果,并且会攻击人 N1。这里有两件事决定蚊子或黄蜂是否可以落在人身上:蚊子 P1 的污染(驱避剂)和黄蜂 P2 的耐受性
在 Kubernetes 世界中,Persons 对应 Nodes,Mosquito、Wasp 对应 Pods。
例子
案例 1:污点节点 1(蓝色)
由于不容忍 Pod,因此它们都不会被安排在节点 1 上
案例 2:我们为 pod D 添加容差。现在只有 Pod D 能够在节点 1 上进行调度
污点和容忍度
污点是节点的一种属性,如果它们不能容忍节点污点,就会将 Pod 推开。像标签一样,多个污点可以应用于一个节点。
How can we enable certain pods to be scheduled on tainted nodes ?
By specifying which pods are tolerant to specific taint; we add tolerations to certain pods.
Tolerations 设置为 Pod,并允许 Pod 调度到具有匹配污点的节点上。污点和容忍与安全无关。
句法:
kubectl taints nodes node-name key=value:taint-effect
污染效果:
- NoSchedule :Pod 不会被调度到节点上,除非它们是宽容的。这意味着如果在已经包含 pod 的节点上应用了 taint,那么所有与 taint 不匹配的现有 pod 都将从节点中驱逐。如果它与该节点的所有污点不匹配,则不会在该节点上安排更多新的 pod。
- PreferNoSchedule :调度程序不希望在 taint 节点上调度 pod,但不能保证。意味着调度器会尽量不在节点上放置不能容忍污点的 Pod,但这不是必需的。
- NoExecute :一旦 NoExecute 污点应用于节点,所有现有 pod 将被驱逐,而不匹配节点的容忍度。
NoSchedule 污点效果示例:
目前,没有一个豆荚对蓝色有耐受性。
Pod D YAML 文件:
- 第 1-2 行:Kubernetes Pod API v1。顺便说一句,Kubernetes 知道要创建哪个组件。
- 第 3-4 行:元数据提供不影响 pod 行为的信息,它用于定义 pod 的名称和一些标签(稍后将由控制器使用)
- 第 5 行:规范我们在这里定义容器。 pod 可以有多个容器
- 第 6-8 行:这里的容器名称是 redis-container,镜像 Redis 将从容器注册表中拉取。
- 第 7 行:运算符默认值为 Equal。如果键相同且效果相同,则容忍“匹配”污点,并且: 运算符 = Exists(在这种情况下不应指定值)。 运算符 = Equal 并且值相等。如果键为空且运算符存在则匹配所有键和值(即会容忍一切效果是污点效果的类型,这里我们选择了NoSchedule效果
现在将节点 1 污染为蓝色
kubectl taint nodes node1 app=blue:NoSchedule
这里,node1 –> 将应用污点的节点的名称。 app=blue:NoSchedule –> 键值对:污点效果的类型。这意味着没有 pod 将能够调度到 node1 上,除非它具有匹配的容忍度。
Pod C 将从节点 1 中被驱逐,因为它不能容忍污染蓝色。
In the above example, Node D was scheduled on Node 1. What if it was scheduled on another node? Is it possible ?
Yes
Taints/Tolerations + Node Affinity = Assures that a specific pod can only schedule on a specific node only and No other pods can be scheduled in tainted nodes.Example o
注意:主节点中没有任何 pod。因为在创建集群时,Kubernetes 会污染它的主节点,因此没有在主节点上调度任何 Pod。
kubectl describe node kubemaster | grep Taints
输出: