6-3 Pod亲和与反亲和, 污点与容忍, 驱逐

本文详细介绍了Kubernetes中的Pod亲和、反亲和、污点和容忍机制,以及驱逐策略,包括软驱逐和硬驱逐的条件与设置。通过实例解析了Pod如何根据亲和性规则进行调度,并讨论了污点和容忍如何影响Pod的调度。同时,文章阐述了驱逐优先级和不同类型的驱逐情况。

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

前言

6-2 nodeSelector, nodeName, node亲和与反亲和中通过node打标签和部署文件匹配标签,实现pod可调度性。而Pod亲和与反亲和则通过node已经运行的pod作为调度标准。



Pod亲和

首先创建一个python nginx项目的pod与service。然后再创建其它有亲和关系的Deployment。

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    app: python-nginx-deployment-label
  name: python-nginx-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: python-nginx-selector
  template:
    metadata:
      labels:
        app: python-nginx-selector
        project: python
    spec:
      containers:
      - name: python-nginx-container
        image: nginx:1.20.2-alpine
        imagePullPolicy: Always
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        - containerPort: 443
          protocol: TCP
          name: https

---
kind: Service
apiVersion: v1
metadata:
  labels:
    app: python-nginx-service-label
  name: python-nginx-service
  namespace: myserver
spec:
  type: NodePort
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 
<think>我们正在讨论Kubernetes调度中的污点(Taints)、容忍度(Tolerations)、亲和性(Affinity)和反亲和性(Anti-affinity)的工作原理。这些机制共同作用于Pod调度过程,确保Pod被分配到合适的节点上。###1.污点(Taints)容忍度(Tolerations)**污点**是应用于节点的一种标记,用于排斥某些Pod的调度。节点上的污点会阻止没有相应容忍度的Pod被调度到该节点。污点有三个效果:-`NoSchedule`:不会调度新的Pod(除非有容忍度),已运行的Pod不受影响。-`PreferNoSchedule`:尽量不调度,但如果没有其他可用节点,仍可能调度。-`NoExecute`:不仅不调度新Pod,还会驱逐节点上已有的没有相应容忍度的Pod。**容忍度**是Pod的一个属性,允许Pod被调度到带有污点的节点上。一个Pod可以设置多个容忍度,以匹配节点上的多个污点。例如,以下命令给节点`k8s-node2`添加一个污点:```bashkubectltaintnodek8s-node2node-role.kubernetes.io=k8s-node2:NoSchedule```一个Pod容忍度配置示例(YAML片段):```yamltolerations:-key:"node-role.kubernetes.io/k8s-node2"operator:"Equal"value:"true"effect:"NoSchedule"```**工作原理**:调度器检查节点上的污点。对于每个污点,如果Pod没有匹配的容忍度(即`key`、`value`和`effect`都匹配),则该污点会阻止调度。只有当Pod容忍度覆盖了节点的所有污点(或未被覆盖的污点效果是`PreferNoSchedule`且无其他节点可用)时,Pod才能被调度到该节点。###2.亲和性(Affinity)反亲和性(Anti-affinity)亲和性规则允许用户指定Pod被调度到特定节点(或其他Pod同处/分离)的偏好。分为两类:-**节点亲和性(NodeAffinity)**:基于节点标签的规则。-**Pod亲和性(PodAffinity)/反亲和性(PodAnti-affinity)**:基于同一命名空间(或跨命名空间)中其他Pod标签的规则。####节点亲和-`requiredDuringSchedulingIgnoredDuringExecution`:规则,必须满足。-`preferredDuringSchedulingIgnoredDuringExecution`:软规则,尽量满足。示例(要求节点在`zone:us-east`且优选`type:high-mem`):```yamlaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:zoneoperator:Invalues:[us-east]preferredDuringSchedulingIgnoredDuringExecution:-weight:100preference:matchExpressions:-key:typeoperator:Invalues:[high-mem]```####Pod亲和性/反亲和-**亲和性**:将Pod调度到已有特定Pod的节点(或区域)。-**反亲和性**:避免将Pod调度到已有特定Pod的节点(或区域)。示例(避免`app:nginx`的Pod同节点):```yamlaffinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:-labelSelector:matchExpressions:-key:appoperator:Invalues:[nginx]topologyKey:kubernetes.io/hostname```###调度器如何综合这些因素?Kubernetes调度器(kube-scheduler)按顺序执行以下步骤:1.**过滤(Filtering)**:排除不满足性条件的节点(如资源不足、污点无容忍、节点亲和规则不满足)。2.**评分(Scoring)**:对剩余节点按规则评分(亲和性软规则、污点的`PreferNoSchedule`、资源平衡等)。3.**绑定(Binding)**:选择最高分节点,将Pod绑定到该节点。###总结-**污点/容忍度**:节点排斥Pod的机制,用于保留节点或驱逐Pod-**亲和性/反亲和性**:Pod吸引或排斥其他Pod(或节点)的机制,用于优化布局。这些机制共同实现了Kubernetes调度的灵活性和精细控制。§§相关问题§§1.如何配置一个Pod容忍多个污点?2.节点亲和节点选择器(nodeSelector)有何区别?3.在Pod反亲和性中,`topologyKey`的作用是什么?4.如何查看节点上的污点信息?</think>### Kubernetes调度机制详解:污点/容忍度、亲和性/反亲和性 在Kubernetes调度过程中,污点(Taints)、容忍度(Tolerations)、亲和性(Affinity)和反亲和性(Anti-affinity)共同作用于Pod的调度决策,确保Pod被分配到最合适的节点上。以下是它们的工作原理: --- #### 一、污点(Taints)容忍度(Tolerations) **作用**:节点排斥机制,用于保护节点不被随意调度。 - **污点**:节点属性,包含三个要素: - `key=value`(标识符) - `effect`(效果): - `NoSchedule`:禁止新Pod调度(已运行Pod不受影响)[^4] - `PreferNoSchedule`:尽量避免调度 - `NoExecute`:驱逐容忍度的已有Pod[^2] 示例:禁止非系统Pod调度到Master节点 ```bash kubectl taint node master-node node-role.kubernetes.io/master:NoSchedule [^3][^4] ``` - **容忍度**:Pod属性,允许Pod忽略节点污点 ```yaml tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" # 匹配所有值 effect: "NoSchedule" ``` **工作原理**: 1. 调度器检查节点污点列表 2. 若Pod容忍度**完全覆盖**节点污点(相同key+effect),则允许调度 3. 未覆盖的污点会触发其effect(如拒绝调度或驱逐Pod)[^2] > ⚠️ 特殊规则: > - 空`key`+`Exists`操作符匹配所有污点 > - 空`effect`匹配所有效果[^2] --- #### 二、亲和性(Affinity)反亲和性(Anti-affinity) **作用**:定义Pod节点/其他Pod的吸引或排斥关系。 1. **节点亲和性**(Node Affinity) - 基于节点标签调度Pod ```yaml affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: # 性要求 nodeSelectorTerms: - matchExpressions: - key: gpu-type operator: In values: ["a100"] ``` 2. **Pod亲和性/反亲和性**(Inter-Pod- 基于其他Pod分布调度 ```yaml affinity: podAntiAffinity: # 避免同类Pod同节点 requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: ["nginx"] topologyKey: "kubernetes.io/hostname" [^5] ``` - `topologyKey`:定义拓扑域(如主机名、机架、可用区) --- #### 三、调度器决策流程 调度器按优先级处理规则: 1. **过滤阶段**(Predicates) - 排除不满足性条件的节点: - 资源不足 - 污点未容忍 - 节点亲和性不满足 - 反亲和性冲突 2. **评分阶段**(Priorities) - 对剩余节点评分: - 亲和性软规则(`preferredDuringScheduling`) - 资源平衡策略 - 污点`PreferNoSchedule`影响权重 3. **绑定阶段** - 选择最高分节点部署Pod > 💡 **核心区别**: > - 污点/容忍度 = **节点主动拒绝Pod** > - 亲和性/反亲和性 = **Pod主动选择/回避目标**[^1][^5] --- #### 四、典型应用场景 | 机制 | 使用场景 | |------|----------| | 污点 | 保留Master节点、隔离GPU节点[^4] | | 容忍度 | 在Master节点部署系统组件(如CNI插件) | | 节点亲和性 | 将数据库Pod调度到SSD节点 | | Pod反亲和性 | 分散部署同一服务的副本(高可用)[^5] | > 📌 **注意事项**: > 当多个规则冲突时,调度遵循安全优先原则: > 污点`NoExecute` > 节点亲和规则 > 反亲和规则 > 软规则[^2][^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值