【Kubernetes】Pod学习(八)Pod调度:定向调度与亲和性调度

本文是学习《Kubernetes权威指南》的笔记,主要探讨了Pod的定向调度(NodeSelector)和亲和性调度(NodeAffinity、PodAffinity)。通过示例展示了如何使用kubectl命令给节点打标签,以及如何创建Deployment实现定向调度。还介绍了NodeAffinity的硬限制和软限制,以及PodAffinity和PodAntiAffinity在实现Pod间亲和与互斥调度的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此文为学习《Kubernetes权威指南》的相关笔记

学习笔记:

RC等副本控制器使用了系统自动调度算法完成一组Pod的部署,在完成对Pod的定义后,交由调度器scheduler根据各工作节点情况,以负载均衡的原则进行分配,在这种模式下,Pod副本可能被调度到任意一个可用的工作节点。

阿里云大学云原生公开课上,对Deployment给出的介绍如下:

但在某些场景下, 设计者希望Pod副本能被调度到特定的工作节点上,需要更加细粒度的调度策略设置,完成对Pod的精准调度

NodeSelector为一种定向调度策略,在给工作节点打上标签后,可以在副本控制器创建时通过节点选择器来指定可调度的节点范围,这种方式足够精准,但一定程度上缺乏灵活性。

亲和性策略进一步扩展了Pod调度能力,正如“亲和性”这个定义所表达的,设计者希望这种策略能更细粒度,同时更灵活的去寻找最合适的调度结点,该策略包括节点亲和性和Pod亲和性,亲和性调度机制的优点如下:

  • 更具表达力(不仅仅是死板的“必需满足”)
  • 可以存在软限制,即有优先级策略,可以存在“退而求其次”的情况
  • 可以延伸出Pod之间的亲和或互斥关系,依据节点上正在运行的其他Pod的标签进行限制

Node亲和性与NodeSelector类似,增强了上述两点优势,Pod的亲和性和互斥限制则通过Pod标签而不是节点标签来实现

不难想象上述策略的应用场景,下面是两种策略的运行实例。

一、NodeSelector:定向调度

1、通过kubectl label命令给目标Node打上一些标签

kubectl label nodes <node-name> <label-key>=<label-value>

给xu.node1节点打上标签zone=north

# kubectl label nodes xu.node1 zone=north
node/xu.node1 labeled

查看xu.Node1,可以看到新增加的标签列表,与此同时,可以看到K8s给Node提供的预定义标签

# kubectl describe node xu.node1
Name:               xu.node1
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=xu.node1
                    kubernetes.io/os=linux

                    zone=north

......

创建配置文件redis-master-controller.yaml

原书给出的是创建一个RC,这里修改为创建Deployment

可以看到nodeSelector域在spec.spec域之下,是对Pod属性的定义(毕竟Pod是调度基本单位

apiVersion: apps/v1
kind: Deployment
metadata:
 name: redis-master
 labels:
  name: redis-master
spec:
 replicas: 1
 selector:
  matchLabels:
   name: redis-mas

<think>好的,我现在需要详细解释Kubernetes中的污点(Taints)和容忍度(Tolerations)。用户之前的问题是关于Pod调度的问题,特别是当节点资源不足或设置了污点时的情况。现在用户明确想了解污点和容忍度的具体含义,我需要结合之前的回答和提供的引用内容来组织信息。 首先,用户提供的引用[1]、[2]、[3]都涉及到污点和容忍度的定义、作用以及使用场景。我需要整合这些信息,确保覆盖基本概念、核心作用、使用方法、注意事项以及最佳实践。同时,用户之前的问题中提到了当控制器Pod满了或节点资源不足时的处理,所以需要将污点和容忍度这些实际场景联系起来。 我应该从定义开始,解释污点和容忍度各自是什么,然后说明它们如何协同工作。需要提到污点的三种效果(NoSchedule、PreferNoSchedule、NoExecute)以及容忍度的匹配规则。接着,结合引用中的信息,比如引用[3]提到的污点格式和kubectl命令,给出具体的操作示例,帮助用户理解如何实际应用。 另外,用户可能对如何查看节点的污点和如何为Pod设置容忍度感兴趣,需要提供相关的kubectl命令和YAML示例。同时,要注意区分污点节点亲和性的不同,避免混淆,如引用[3]提到的亲和性,但用户当前问题主要关注污点和容忍度,所以需要明确两者的区别。 还需要包括使用场景,比如专用节点、节点维护、驱逐Pod等,这些在引用[2]和[3]中都有提到。案例分析部分可以增强实用性,例如如何为GPU节点设置污点,或者如何在维护期间驱逐Pod。最后,总结最佳实践,帮助用户正确应用这一机制,避免常见错误。 需要检查是否有遗漏的重要点,比如多个污点和容忍度的处理逻辑,引用[1]提到Kubernetes处理多个污点的方式是过滤,这点需要详细说明。同时,注意引用中的关键点,如NoExecute不仅影响调度还会驱逐现有Pod,这点在之前的回答中也提到过,需要强调。 最后,确保语言通俗易懂,结构清晰,分点阐述,并附上示例和命令,方便用户理解实践。可能还需要回答用户潜在的问题,比如如何处理多个污点,或者如何调试调度问题,但根据当前问题,主要集中在含义和详解上,所以保持聚焦。</think>### Kubernetes 污点(Taints)容忍度(Tolerations)详解 --- #### 一、基本概念 1. **污点(Taints)** 污点是**施加在节点上的标记**,用于限制哪些 Pod 可以调度到该节点。它的核心作用是**排斥不匹配的 Pod**,类似于在节点上贴“禁止进入”的告示牌。 - **语法格式**:`key=value:effect` 例如:`gpu=true:NoSchedule` - **核心作用**: - 隔离专用节点(如 GPU 节点、高存储节点) - 防止普通 Pod 调度到关键节点 - 节点维护时驱逐 Pod 2. **容忍度(Tolerations)** 容忍度是**赋予 Pod 的属性**,允许 Pod 忽略节点的污点限制。它相当于 Pod 的“通行证”,使其能够调度到被污染的节点。 - **语法格式**(YAML 示例): ```yaml tolerations: - key: "gpu" operator: "Equal" value: "true" effect: "NoSchedule" ``` - **核心作用**: - 允许特定 Pod 突破污点限制 - 实现精细化资源分配(如机器学习任务调度到 GPU 节点) --- #### 二、污点的三种效果(Effect) | 类型 | 行为 | 适用场景 | |------------------|----------------------------------------------------------------------|------------------------------| | `NoSchedule` | 禁止无容忍度的 Pod 调度到节点(**仅影响新调度**) | 专用节点隔离 | | `PreferNoSchedule` | 尽量避免调度,但非强制(**低优先级限制**) | 非关键资源预留 | | `NoExecute` | 禁止调度 + **驱逐已运行但无容忍度的 Pod**(默认驱逐延迟 300 秒) | 节点维护、故障隔离 | --- #### 三、工作原理 1. **调度流程中的污点过滤** Kubernetes 调度器按以下逻辑处理污点容忍度: - 检查节点所有污点 → 过滤 Pod 已容忍的污点 → 剩余污点决定是否允许调度 - **关键规则**: - Pod 必须容忍节点**所有未被忽略的污点**(`effect=NoSchedule/NoExecute`) - 若剩余污点含 `NoSchedule` → 禁止调度 - 若剩余污点含 `NoExecute` → 禁止调度并驱逐现有 Pod 2. **多污点多容忍度匹配逻辑** - **示例**:节点设置两个污点 ```bash kubectl taint nodes node01 gpu=true:NoSchedule # 污点1 kubectl taint nodes node01 ssd=true:NoExecute # 污点2 ``` - **Pod 容忍度配置**: ```yaml tolerations: - key: "gpu" # 仅容忍污点1 operator: "Exists" effect: "NoSchedule" ``` - **结果**: - 污点2(`ssd=true:NoExecute`)未被容忍 → Pod 无法调度到 `node01` --- #### 四、核心操作指南 1. **管理节点污点** - **添加污点**: ```bash kubectl taint nodes <node-name> key=value:effect # 示例:禁止普通 Pod 调度到 GPU 节点 kubectl taint nodes gpu-node-1 hardware=gpu:NoSchedule ``` - **删除污点**: ```bash kubectl taint nodes <node-name> key:effect- # 示例:移除 GPU 节点的 NoSchedule 限制 kubectl taint nodes gpu-node-1 hardware:NoSchedule- ``` - **查看节点污点**: ```bash kubectl describe node <node-name> | grep Taints ``` 2. **配置 Pod 容忍度** **YAML 示例**(允许 Pod 调度到含 `disk=ssd:NoSchedule` 污点的节点): ```yaml apiVersion: v1 kind: Pod metadata: name: ssd-app spec: containers: - name: nginx image: nginx tolerations: - key: "disk" operator: "Equal" value: "ssd" effect: "NoSchedule" ``` 3. **高级匹配规则** - **`operator: Exists`**:容忍所有含指定 `key` 的污点(无需匹配 `value`) ```yaml tolerations: - key: "gpu" operator: "Exists" # 容忍所有 effect 为 NoSchedule 的 gpu 污点 effect: "NoSchedule" ``` - **容忍所有污点**(慎用!可能破坏隔离性): ```yaml tolerations: - operator: "Exists" # 无 key 和 effect 限制 ``` --- #### 五、典型使用场景 1. **专用硬件节点隔离** - **场景**:GPU 节点仅允许机器学习任务使用 - **操作**: ```bash # 节点添加污点 kubectl taint nodes gpu-node-1 hardware=gpu:NoSchedule ``` ```yaml # Pod 添加容忍度 tolerations: - key: "hardware" operator: "Equal" value: "gpu" effect: "NoSchedule" ``` 2. **节点维护驱逐** - **场景**:节点需要停机维护,需驱逐所有 Pod - **操作**: ```bash # 添加 NoExecute 污点触发驱逐 kubectl taint nodes node-01 maintenance=true:NoExecute # 维护完成后移除污点 kubectl taint nodes node-01 maintenance:NoExecute- ``` 3. **灰度发布控制** - **场景**:限制新版本 Pod调度到特定节点 - **操作**: ```bash # 为测试节点添加污点 kubectl taint nodes test-node-1 env=test:NoSchedule ``` ```yaml # 新版本 Deployment 配置容忍度 spec: template: spec: tolerations: - key: "env" operator: "Equal" value: "test" effect: "NoSchedule" ``` --- #### 六、注意事项最佳实践 1. **避免过度使用 `NoExecute`** - 若大量节点设置 `NoExecute` 污点且 Pod 未配置容忍度,可能导致 Pod 频繁被驱逐,引发服务不稳定。 2. **区分** `污点` **** `节点亲和性` | 机制 | 作用方向 | 优先级逻辑 | |---------------|----------------|-------------------------| | 污点/容忍度 | **排斥性**控制 | “必须满足”条件 | | 节点亲和性 | **吸引性**控制 | “尽量满足”条件 | 3. **调试调度问题** - 检查 Pod 事件日志: ```bash kubectl describe pod <pod-name> | grep Events -A 10 ``` - 查看节点资源污点状态: ```bash kubectl describe node <node-name> | grep -E "Taints|Allocatable" ``` --- ### 总结 污点容忍度是 Kubernetes 中实现**精细化调度控制**的核心机制,通过“节点排斥”Pod 豁免”的配合,可有效管理专用资源、保障集群稳定性。实际使用中需注意避免过度宽松的容忍度配置(如 `operator: Exists`),并结合亲和性规则实现更灵活的调度策略[^1][^2][^3]。 --- ### 相关问题 1. 如何通过节点亲和性(Node Affinity)实现 Pod定向调度? 2. Kubernetes 中 `NoExecute` 污点的驱逐延迟(TolerationSeconds)如何配置? 3. 如何结合污点 Pod 优先级(PriorityClass)实现分级调度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值