11.3.k8s中pod的调度-亲和affinity,反亲和antAffinity

目录

一、概念

二、nodeAffinity-节点亲和性

1.给k8s节点创建标签

2.编辑资源清单设置节点亲和性

3.查看pod所在节点,验证亲和性

三、podAffinity-pod的亲和性

1.编辑资源清单设置pod亲和性

2.查看pod所在节点

四、podAntAffinity-pod的反亲和性


一、概念

在K8S中,亲和性(Affinity)用来定义Pod与节点关系的概念,亲和性通过指定标签选择器和拓扑域约束来决定 Pod 应该调度到哪些节点上。与污点相反,它主要是尽量往某节点靠。

关键点是标签label

在k8s当中,“亲和性”分为三种,节点亲和性、pod亲和性、pod反亲和性;

亲和性分类 名称 解释说明
nodeAffinity 节点亲和性 通过【节点】标签匹配,用于控制pod调度到哪些node节点上,以及不能调度到哪些node节点上;(主角node节点)
podAffinity pod亲和性 通过【节点+pod】标签匹配,可以和哪些pod部署在同一个节点上(拓扑域);(主角是pod)
podAntiAffinity pod反亲和性 通过【节点+pod】标签匹配,与pod亲和性相反,就是和那些pod不在一个节点上(拓扑域);

二、nodeAffinity-节点亲和性

  1. 亲和与反亲和。nodeSelector 提供了一种非常简单的方法来将 pod 约束到具有特定标签的节点上。亲和/反亲和功能极大地扩展了你可以表达约束的类型。
  2. 你可以发现规则是“软”/“偏好”,而不是硬性要求,因此,如果调度器无法满足该要求,仍然调度该 pod
  3. 你可以使用节点上的 pod 的标签来约束,而不是使用节点本身的标签,来允许哪些 pod 可以或者不可以被放置在一起。
  4. 节点亲和(仅作用于调度期间)
    1. requiredDuringSchedulingIgnoredDuringExecution 必须满足
    2. preferredDuringSchedulingIgnoredDuringExecution 倾向满足
  5. IgnoreDuringExecution 表示如果在Pod运行期间Node的标签发生变化,导致亲和性策略不能满足,则继续运行当前的Pod。
  6. nodeaffinity还支持多种规则匹配条件的配置如
    1. In:label 的值在列表内
    2. NotIn:label 的值不在列表内
    3. Gt:label 的值大于设置的值,不支持Pod亲和性
    4. Lt:label 的值小于设置的值,不支持pod亲和性
    5. Exists:设置的label 存在
    6. DoesNotExist:设置的 label 不存在

1.给k8s节点创建标签

[root@k8s1 ~]# kubectl label nodes k8s1 k8s=oslee1
node/k8s1 labeled
[root@k8s1 ~]# kubectl label nodes k8s2 k8s=oslee2
node
Pod 反亲和性是 Kubernetes 中与亲和性相反的概念。一旦其约束条件匹配,该 Pod 将被调度到与匹配 Pod 处于不同 `topologyKey` 的工作节点上,主要用于保障非热点区域、对高性能响应要求不高但重要的业务不受干扰[^1]。 以下是使用 Pod 反亲和性的 YAML 示例: ```yaml apiVersion: v1 kind: Pod metadata: name: pod-affinity-anti namespace: default labels: app: anti spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: kubernetes.io/hostname containers: - name: k8s-test image: k8s-test:v1.0 imagePullPolicy: IfNotPresent ports: - containerPort: 80 ``` 在这个示例中,`podAntiAffinity` 下的 `requiredDuringSchedulingIgnoredDuringExecution` 表示在调度 Pod 时必须满足反亲和性规则,但在 Pod 运行后不再检查。`labelSelector` 用于选择匹配的 Pod,这里是选择 `app` 标签值为 `nginx` 的 Pod。`topologyKey` 指定了拓扑域,即 `kubernetes.io/hostname`,表示基于节点主机名进行隔离。 若需求为将同一服务的副本分散在不同节点,可采用 Pod 反亲和性 + 节点级隔离的方案,其 YAML 示例如下: ```yaml affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - payment topologyKey: "kubernetes.io/hostname" ``` 此方案通过 `requiredDuringSchedulingIgnoredDuringExecution` 确保调度时满足反亲和性规则,`labelSelector` 选择 `app` 标签值为 `payment` 的 Pod,`topologyKey` 基于节点主机名实现隔离,将同一服务的副本分散到不同节点上[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值