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

相关推荐
神奇侠20241 小时前
快速入手K8s+Docker+KubeSphere+DevOps
docker·kubernetes·devops
CN_HW1 小时前
k8s证书续期
云原生·容器·kubernetes
somdip1 小时前
若伊微服务版本教程(自参)
微服务·云原生·架构
C-20023 小时前
Dashboard的安装和基本使用
运维·kubernetes
java1234_小锋3 小时前
Zookeeper的典型应用场景?
分布式·zookeeper·云原生
老马啸西风6 小时前
Neo4j GDS-09-neo4j GDS 库中路径搜索算法实现
网络·数据库·算法·云原生·中间件·neo4j·图数据库
可观测性用观测云6 小时前
Kube-Proxy 可观测性最佳实践
kubernetes
阿里云云原生6 小时前
无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测
云原生
阿里云云原生7 小时前
Serverless MCP 运行时业界首发,函数计算让 AI 应用最后一公里提速
云原生·serverless