【Kubernets】K8S亲和性配置相关说明

K8S亲和性配置相关说明

    • 配置说明
      • [**Kubernetes 亲和性配置详细说明**](#Kubernetes 亲和性配置详细说明)
    • **一、亲和性类型**
    • [**二、节点亲和性(Node Affinity)**](#二、节点亲和性(Node Affinity))
      • [**1. 硬策略:requiredDuringSchedulingIgnoredDuringExecution**](#1. 硬策略:requiredDuringSchedulingIgnoredDuringExecution)
      • [**2. 软策略:preferredDuringSchedulingIgnoredDuringExecution**](#2. 软策略:preferredDuringSchedulingIgnoredDuringExecution)
    • [**三、Pod 亲和性(Pod Affinity)**](#三、Pod 亲和性(Pod Affinity))
      • [**1. 硬策略:requiredDuringSchedulingIgnoredDuringExecution**](#1. 硬策略:requiredDuringSchedulingIgnoredDuringExecution)
      • [**2. 软策略:preferredDuringSchedulingIgnoredDuringExecution**](#2. 软策略:preferredDuringSchedulingIgnoredDuringExecution)
    • [**四、Pod 反亲和性(Pod Anti-Affinity)**](#四、Pod 反亲和性(Pod Anti-Affinity))
      • [**1. 硬策略:requiredDuringSchedulingIgnoredDuringExecution**](#1. 硬策略:requiredDuringSchedulingIgnoredDuringExecution)
      • [**2. 软策略:preferredDuringSchedulingIgnoredDuringExecution**](#2. 软策略:preferredDuringSchedulingIgnoredDuringExecution)
    • [**五、拓扑域(Topology Key)**](#五、拓扑域(Topology Key))
    • **六、完整示例**
    • **七、总结**
    • 相关文献

配置说明

Kubernetes 亲和性配置详细说明

Kubernetes 的亲和性(Affinity)是一种调度策略,用于控制 Pod 调度到特定的节点或与其他 Pod 共存/分离。通过亲和性配置,可以优化资源分配、提高性能以及增强高可用性。


一、亲和性类型

Kubernetes 提供了两种主要类型的亲和性配置:

  1. Node Affinity(节点亲和性)

    控制 Pod 调度到哪些节点上。

  2. Pod Affinity 和 Pod Anti-Affinity(Pod 亲和性和反亲和性)

    控制 Pod 是否与某些已存在的 Pod 共存或分离。


二、节点亲和性(Node Affinity)

1. 硬策略:requiredDuringSchedulingIgnoredDuringExecution

  • 定义:必须满足条件,否则 Pod 不会被调度。

  • 示例 :
    假设我们希望 Pod 只能调度到标签为 disk-type=ssd 的节点上:

    yaml 复制代码
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: disk-type
              operator: In
              values:
              - ssd

2. 软策略:preferredDuringSchedulingIgnoredDuringExecution

  • 定义:优先选择符合条件的节点,但如果找不到符合条件的节点,Pod 仍然可以被调度到其他节点。

  • 示例 :
    假设我们希望 Pod 优先调度到标签为 cpu-num=16 的节点上:

    yaml 复制代码
    affinity:
      nodeAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          preference:
            matchExpressions:
            - key: cpu-num
              operator: In
              values:
              - "16"

三、Pod 亲和性(Pod Affinity)

1. 硬策略:requiredDuringSchedulingIgnoredDuringExecution

  • 定义:Pod 必须与某些已存在的 Pod 共存,否则不会被调度。

  • 示例 :
    假设我们希望新 Pod 与标签为 app=my-app 的 Pod 共存:

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

2. 软策略:preferredDuringSchedulingIgnoredDuringExecution

  • 定义:优先将 Pod 调度到与某些已存在的 Pod 共存的节点上。

  • 示例 :
    假设我们希望新 Pod 优先与标签为 env=production 的 Pod 共存:

    yaml 复制代码
    affinity:
      podAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          podAffinityTerm:
            labelSelector:
              matchExpressions:
              - key: env
                operator: In
                values:
                - production
            topologyKey: kubernetes.io/hostname

四、Pod 反亲和性(Pod Anti-Affinity)

1. 硬策略:requiredDuringSchedulingIgnoredDuringExecution

  • 定义:Pod 必须与某些已存在的 Pod 分离,否则不会被调度。

  • 示例 :
    假设我们希望新 Pod 不与标签为 app=my-app 的 Pod 共存:

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

2. 软策略:preferredDuringSchedulingIgnoredDuringExecution

  • 定义:优先将 Pod 调度到与某些已存在的 Pod 分离的节点上。

  • 示例 :
    假设我们希望新 Pod 优先不与标签为 env=production 的 Pod 共存:

    yaml 复制代码
    affinity:
      podAntiAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
        - weight: 1
          podAffinityTerm:
            labelSelector:
              matchExpressions:
              - key: env
                operator: In
                values:
                - production
            topologyKey: kubernetes.io/hostname

五、拓扑域(Topology Key)

在 Pod 亲和性和反亲和性中,topologyKey 定义了拓扑域的范围。常见的拓扑键包括:

  • kubernetes.io/hostname:表示单个节点。
  • failure-domain.beta.kubernetes.io/zone:表示可用区。
  • failure-domain.beta.kubernetes.io/region:表示区域。

例如,使用 failure-domain.beta.kubernetes.io/zone 可以实现跨可用区的调度策略。


六、完整示例

以下是一个综合使用节点亲和性和 Pod 亲和性的完整示例:

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: example-pod
  labels:
    app: example
spec:
  containers:
  - name: example-container
    image: nginx
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disk-type
            operator: In
            values:
            - ssd
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: cpu-num
            operator: In
            values:
            - "16"
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - my-app
        topologyKey: kubernetes.io/hostname
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: env
              operator: In
              values:
              - production
          topologyKey: kubernetes.io/hostname

七、总结

通过亲和性配置,可以灵活地控制 Pod 的调度行为,从而优化资源分配和提高系统的可靠性。以下是关键点:

  1. 节点亲和性:控制 Pod 调度到哪些节点。
  2. Pod 亲和性:控制 Pod 与哪些已存在的 Pod 共存。
  3. Pod 反亲和性:控制 Pod 与哪些已存在的 Pod 分离。
  4. 拓扑域:定义调度的范围(如节点、可用区或区域)。

根据实际需求,合理配置亲和性规则,能够显著提升 Kubernetes 集群的性能和稳定性。

相关文献

【Kubernets】Kubernets资源类型Deployment详细介绍

相关推荐
March.s12 小时前
Kubernetes 全景导览:从部署演进到云原生底座
云原生·kubernetes·dubbo
熊出没14 小时前
云原生架构落地实践:Kubernetes 生产级配置与 Service Mesh 流量治理
云原生·架构·kubernetes·istio
人生匆匆14 小时前
docker部署ceph集群
ceph·docker·容器
东风微鸣19 小时前
K8s 最佳实践已更新:请使用 Node Swap!
kubernetes
CCblandy21 小时前
一致性哈希到底省了多少搬迁?本机实测 3 轮:取模 6→7 搬 85.8%,V=128 只搬 14.3%,虚拟节点太少会被倾斜骗
后端·python·云原生·性能优化·架构
code_slave(码畜)21 小时前
微服务架构落地:OpenFeign 服务远程调用 + 线程池隔离架构实战 —— 超时控制、重试机制、线程池隔离,防雪崩
spring boot·spring cloud·微服务·云原生·架构·openfeign
励志师code21 小时前
Kubernetes 集群节点生命周期管理实战:从扩容、调度管控到证书续期
运维·docker·容器·kubernetes·gpu算力·kubelet
闲云自留地1 天前
Kubernetes 安装保姆级:关 swap、装 containerd、init 集群、calico 一篇通
容器·贪心算法·kubernetes
木雷坞1 天前
Docker Compose部署Metabase:应用库隔离与日期筛选看板
运维·docker·容器
涵美女程序猿1 天前
ChatCut online 剪微服务熔断测试录屏:仪表盘告警、降级日志与恢复时刻怎样对应
程序人生·微服务·云原生·架构·电脑