0
点赞
收藏
分享

微信扫一扫

九河云:选择AWS有什么优势?

【k8s】:深入理解k8s中的亲和性(Affinity)及其在集群调度中的应用


💖The Begin💖点点关注,收藏不迷路💖

1、什么是亲和性?

在Kubernetes中,亲和性是一种调度策略,用于指定Pod倾向于被调度到具有特定属性的节点。亲和性分为两种类型:

2、节点亲和性(Node Affinity)

节点亲和性允许我们指定 Pod 应该在哪些节点上运行。它可以根据节点的标签来决定 Pod 的调度位置。

节点亲和性规则可以是硬性的或软性的。硬性规则要求 Pod 必须在匹配的节点上运行,而软性规则则更加宽松,只是倾向于将 Pod 调度到符合条件的节点上。

2.1 硬性节点亲和性规则(required)

下面是一个示例 YAML 文件,其中定义了一个 Pod,并指定了硬性节点亲和性规则,要求 Pod 只能被调度到具有标签为 “gpu=true” 的节点上:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod  # 定义 Pod 的名称为 "nginx-pod"
spec:
  containers:
  - name: nginx-container  # 定义 Pod 中的容器名称为 "nginx-container"
    image: nginx:latest  # 使用最新版本的 nginx 容器镜像
  affinity:
    nodeAffinity:  # 指定节点亲和性规则
      requiredDuringSchedulingIgnoredDuringExecution:  # 硬性节点亲和性规则,要求在调度过程中必须满足条件
        nodeSelectorTerms:  # 指定节点选择条件
        - matchExpressions:  # 指定匹配表达式
          - key: gpu  # 定义匹配表达式的键为 "gpu"
            operator: In  # 使用 In 操作符进行匹配
            values:  # 定义匹配的值
            - "true"  # 要求节点的标签中包含值为 "true" 的 "gpu" 标签

2.2 软性节点亲和性规则(preferred)

下面是一个示例 YAML 文件,其中定义了一个 Pod,并指定了软性节点亲和性规则,要求 Pod 更倾向于被调度到具有标签为 “zone=us-west” 的节点上:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod  # Pod的名称
spec:
  containers:
  - name: nginx-container  # 容器的名称
    image: nginx-image  # 容器使用的镜像
  affinity:
    nodeAffinity:  # 节点亲和性
      preferredDuringSchedulingIgnoredDuringExecution:  # 在调度期间优先考虑,但在执行期间被忽略
      - weight: 1  # 权重为1,表示较高的优先级
        preference:  # 优先选择的条件
          matchExpressions:  # 匹配表达式列表
          - key: zone  # 标签的键
            operator: In  # 匹配操作符,表示在值列表中的任何一个
            values:
            - "us-west"  # 匹配的值为"us-west"

3、Pod亲和性(Pod Affinity)

Pod 亲和性允许我们指定 Pod 应该与哪些其他 Pod 共同运行。它可以确保相关的服务或组件在同一节点或不同节点上运行,以提高性能或可用性。与节点亲和性类似,Pod 亲和性规则也可以是硬性的或软性的。

3.1 Pod硬性亲和性规则

以下是一个使用硬性亲和性规则的示例,要求 Pod 只能被调度到具有 “zone=us-west” 和 “environment=production” 标签的节点上:

apiVersion: v1  # 指定 Kubernetes API 版本
kind: Pod  # 定义资源类型为 Pod
metadata:
  name: affinity-pod  # 指定 Pod 的名称为 affinity-pod
spec:
  containers:
  - name: affinity-container  # 定义 Pod 中的容器名称为 affinity-container
    image: affinity-image  # 指定容器所使用的镜像为 affinity-image
  affinity:  # 定义 Pod 的亲和性规则
    nodeAffinity:  # 指定节点亲和性规则
      requiredDuringSchedulingIgnoredDuringExecution:  # 指定为硬性节点亲和性规则
        nodeSelectorTerms:  # 指定节点选择器条件
        - matchExpressions:  # 指定匹配表达式
          - key: zone  # 指定节点标签的键为 zone
            operator: In  # 指定匹配操作符为 In
            values:  # 指定匹配的值
            - us-west  # 匹配值为 us-west
          - key: environment  # 指定节点标签的键为 environment
            operator: In  # 指定匹配操作符为 In
            values:  # 指定匹配的值
            - production  # 匹配值为 production

3.2 Pod软性亲和性规则

以下是一个使用软性亲和性规则的示例,要求 Pod 偏好被调度到具有 “zone=us-east” 或 “zone=us-west” 标签的节点上:

apiVersion: v1  # 指定 Kubernetes API 版本
kind: Pod  # 定义资源类型为 Pod
metadata:
  name: affinity-pod  # 指定 Pod 的名称为 affinity-pod
spec:
  containers:
  - name: affinity-container  # 定义 Pod 中的容器名称为 affinity-container
    image: affinity-image  # 指定容器所使用的镜像为 affinity-image
  affinity:  # 定义 Pod 的亲和性规则
    nodeAffinity:  # 指定节点亲和性规则
      preferredDuringSchedulingIgnoredDuringExecution:  # 指定为软性节点亲和性规则
      - weight: 1  # 指定权重为 1
        preference:  # 指定偏好条件
          matchExpressions:  # 指定匹配表达式
          - key: zone  # 指定节点标签的键为 zone
            operator: In  # 指定匹配操作符为 In
            values:  # 指定匹配的值
            - us-east  # 匹配值为 us-east
      - weight: 1  # 指定权重为 1
        preference:  # 指定偏好条件
          matchExpressions:  # 指定匹配表达式
          - key: zone  # 指定节点标签的键为 zone
            operator: In  # 指定匹配操作符为 In
            values:  # 指定匹配的值
            - us-west  # 匹配值为 us-west

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

以下是一个 Pod 反亲和性的示例 :

要求该 Pod 不能被调度到具有标签 app=my-app 的其他 Pod 所在的节点上。这样可以确保这两个相互关联的 Pod 不会被部署在同一节点上,从而提高应用程序的可靠性。

apiVersion: v1  # 指定 Kubernetes API 版本
kind: Pod  # 定义资源类型为 Pod
metadata:
  name: anti-affinity-pod  # 指定 Pod 的名称为 anti-affinity-pod
spec:
  containers:
  - name: anti-affinity-container  # 定义 Pod 中的容器名称为 anti-affinity-container
    image: anti-affinity-image  # 指定容器所使用的镜像为 anti-affinity-image
  affinity:  # 定义 Pod 的亲和性规则
    podAntiAffinity:  # 指定 Pod 反亲和性规则
      requiredDuringSchedulingIgnoredDuringExecution:  # 指定为硬性 Pod 反亲和性规则
      - labelSelector:  # 指定标签选择器
          matchExpressions:  # 指定匹配表达式
          - key: app  # 指定标签的键为 app
            operator: In  # 指定匹配操作符为 In
            values:  # 指定匹配的值
            - my-app  # 匹配值为 my-app

5、总结

在这里插入图片描述

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

举报

相关推荐

0 条评论