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的详细信息,包括其亲和力规则。

相关推荐
一点晖光2 小时前
docker配置npm环境变量出现问题
docker·容器·npm
一分半心动3 小时前
windows docker desktop 安装VibeVoice
运维·docker·容器
LucidX3 小时前
Docker核心操作实战
运维·docker·容器
隔壁阿布都3 小时前
Docker Compose中的网络管理
运维·docker·容器
yuxb734 小时前
kubernetes弹性伸缩
笔记·kubernetes
ice_bird4 小时前
Ansible一键部署k8s1.28.2集群
kubernetes·ansible
2301_767902645 小时前
Containerd 从入门到实战
运维·容器
老实巴交的麻匪5 小时前
(九)学习、实践、理解 CI/CD 与 DevOps:持续发布 CD,从容器镜像到生产环境
运维·云原生·自动化运维
泽君学长5 小时前
Docker核心技术详解与简单实战
运维·docker·容器
苦逼IT运维5 小时前
VMware Horizon 与 Docker 冲突排错记录
linux·运维·docker·容器·自动化