k8s亲和力和非亲和力

在 Kubernetes 中,亲和力(Affinity)和非亲和力(Anti-Affinity)是用于控制 Pod 调度策略的机制,它们可以帮助优化资源利用率、提高应用性能和可用性。以下是亲和力和非亲和力的详细解释:

亲和力(Affinity)

亲和力允许用户定义规则,指定 Pod 应该被调度到哪些节点上。亲和力分为两种类型:
节点亲和力(Node Affinity)
定义:节点亲和力允许用户通过节点的标签来指定 Pod 应该被调度到哪些节点上。

作用:可以提高资源利用率、优化性能。

Node亲和力允许你指定Pod应该被调度到具有特定标签的节点上。它分为两种类型:

requiredDuringSchedulingIgnoredDuringExecution:必须满足的规则,否则Pod不会被调度。

preferredDuringSchedulingIgnoredDuringExecution:尽力满足的规则,但不是必须的。

示例:

bash 复制代码
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: color
          operator: In
          values:
          - blue
          - green

这个例子表示 Pod 只会被调度到标签为 color=blue 或 color=green 的节点上。

Pod 亲和力(Pod Affinity)
定义:Pod 亲和力允许用户通过其他 Pod 的标签来指定 Pod 应该被调度到哪些节点上。

作用:可以确保相关 Pod 被调度到同一节点或相近的节点上,从而减少网络延迟。

Pod亲和力允许你指定Pod应该与其他具有特定标签的Pod共同部署在同一个节点上。它同样分为两种类型:

requiredDuringSchedulingIgnoredDuringExecution:必须满足的规则。

preferredDuringSchedulingIgnoredDuringExecution:尽力满足的规则。

示例:

bash 复制代码
affinity:
  podAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values:
          - web
      topologyKey: kubernetes.io/hostname

这个例子表示 Pod 只会被调度到已经运行了标签为 app=web 的其他 Pod 的节点上。

详细解释

1.affinity

含义:定义 Pod 的亲和力和非亲和力策略。

作用:用于控制 Pod 的调度行为,确保 Pod 被调度到满足特定条件的节点上。

  1. podAffinity

含义:定义 Pod 的亲和力策略。

作用:确保 Pod 与某些其他 Pod 调度到同一节点或相近的节点上。

  1. requiredDuringSchedulingIgnoredDuringExecution

含义:表示这个亲和力规则在调度期间是必须满足的,但在执行期间可能会被忽略。

作用:确保在调度时,Pod 只会被调度到满足条件的节点上。如果节点上的条件在运行时发生变化,这个规则可能会被忽略。

  1. labelSelector

含义:定义标签选择器,用于选择其他 Pod。

作用:通过标签选择器,指定哪些 Pod 是我们关心的。

  1. matchExpressions

含义:定义匹配表达式,用于选择满足特定条件的 Pod。

作用:通过匹配表达式,指定哪些 Pod 是我们想要与当前 Pod 调度到同一节点上的。

  1. key 和 operator

key:标签的键。

operator:匹配操作符,可以是 In、NotIn、Exists、DoesNotExist 等。

values:标签的值列表。

  1. topologyKey

含义:定义拓扑域的键。

作用:指定在哪个拓扑域内应用亲和力策略。常见的拓扑键包括:

kubernetes.io/hostname:表示节点的主机名。

failure-domain.beta.kubernetes.io/zone:表示可用区。

failure-domain.beta.kubernetes.io/region:表示区域。

非亲和力(Anti-Affinity)

非亲和力允许用户定义规则,指定 Pod 不应该被调度到哪些节点上。非亲和力也分为两种类型:
节点非亲和力(Node Anti-Affinity)
定义:节点非亲和力允许用户通过节点的标签来指定 Pod 不应该被调度到哪些节点上。

作用:可以提高容错性、确保资源隔离。

Node亲和力允许你指定Pod应该被调度到具有特定标签的节点上。它分为两种类型:

requiredDuringSchedulingIgnoredDuringExecution:必须满足的规则,否则Pod不会被调度。

preferredDuringSchedulingIgnoredDuringExecution:尽力满足的规则,但不是必须的。

示例:

bash 复制代码
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: color
          operator: NotIn
          values:
          - yellow

这个例子表示 Pod 不会被调度到标签为 color=yellow 的节点上。

Pod 非亲和力(Pod Anti-Affinity)
定义:Pod 非亲和力允许用户通过其他 Pod 的标签来指定 Pod 不应该被调度到哪些节点上。

作用:可以确保相关 Pod 不被调度到同一节点或相近的节点上,从而提高可用性。

Pod亲和力允许你指定Pod应该与其他具有特定标签的Pod共同部署在同一个节点上。它同样分为两种类型:

requiredDuringSchedulingIgnoredDuringExecution:必须满足的规则。

preferredDuringSchedulingIgnoredDuringExecution:尽力满足的规则。

示例:

bash 复制代码
affinity:	
  podAntiAffinity:	
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values:
          - db
      topologyKey: kubernetes.io/hostname

这个例子表示 Pod 不会被调度到已经运行了标签为 app=db 的其他 Pod 的节点上。
详细解释

1.affinity

含义:定义 Pod 的亲和力和非亲和力策略。

作用:用于控制 Pod 的调度行为,确保 Pod 被调度到满足特定条件的节点上,或者避免被调度到某些节点上。

2.podAntiAffinity

含义:定义 Pod 的非亲和力策略。

作用:确保 Pod 不与某些其他 Pod 调度到同一节点或相近的节点上。

3.requiredDuringSchedulingIgnoredDuringExecution

含义:表示这个非亲和力规则在调度期间是必须满足的,但在执行期间可能会被忽略。

作用:确保在调度时,Pod 不会被调度到不符合条件的节点上。如果节点上的条件在运行时发生变化,这个规则可能会被忽略。

4.labelSelector

含义:定义标签选择器,用于选择其他 Pod。

作用:通过标签选择器,指定哪些 Pod 是我们关心的。

5.matchExpressions

含义:定义匹配表达式,用于选择满足特定条件的 Pod。

作用:通过匹配表达式,指定哪些 Pod 是我们想要避免与当前 Pod 调度到同一节点上的。

6.key 和 operator

key:标签的键。

operator:匹配操作符,可以是 In、NotIn、Exists、DoesNotExist 等。

values:标签的值列表。

7.topologyKey

含义:定义拓扑域的键。

作用:指定在哪个拓扑域内应用非亲和力策略。常见的拓扑键包括:

kubernetes.io/hostname:表示节点的主机名。

failure-domain.beta.kubernetes.io/zone:表示可用区。

failure-domain.beta.kubernetes.io/region:表示区域。

查看亲和力设置

要查看Pod的亲和力设置,可以使用kubectl describe pod 命令。这将显示Pod的详细信息,包括其亲和力规则。

相关推荐
探云抛雾؁ۣۖ26 分钟前
云计算---k8s运维~创建pod与pod的安全策略
运维·kubernetes·云计算
小白不想白a2 小时前
【K8s】K8s控制器——复制集和deployment
云原生·容器·kubernetes
hhzz3 小时前
一键设置 NTP & 时区的脚本(亲测,适用于部署 K8S 的前置环境)
云原生·容器·kubernetes
Akamai中国11 小时前
SharePlay确保最佳游戏体验
人工智能·云原生·云计算
苏侠客85211 小时前
在docker上部署fastapi的相关操作
docker·容器·fastapi
婷儿z14 小时前
云原生环境 Prometheus 企业级监控实战
云原生·prometheus
小白不想白a14 小时前
【k8s】k8s中的几个概念性问题
云原生·容器·kubernetes
北巷初晴、15 小时前
Kubernetes-核心概念Service
云原生·容器·kubernetes
掘金-我是哪吒15 小时前
分布式微服务系统架构第163集:哈罗电池设备Netty网关架构
分布式·微服务·云原生·架构·系统架构
容器魔方21 小时前
KubeEdge秋季带薪远程实习来了!2025年LFX Mentorship开启申请
云原生·容器·云计算