Kubernetes(k8s):深入理解k8s中的亲和性(Affinity)及其在集群调度中的应用
- 1、什么是亲和性?
- 2、节点亲和性(Node Affinity)
- 2.1 硬性节点亲和性规则(required)
- 2.2 软性节点亲和性规则(preferred)
- 3、Pod亲和性(Pod Affinity)
- 3.1 Pod硬性亲和性规则
- 3.2 Pod软性亲和性规则
- 4、Pod 反亲和性(Pod Anti-Affinity)
- 5、总结
💖The Begin💖点点关注,收藏不迷路💖
|
在 Kubernetes(K8s)集群中,亲和性(Affinity)是一项强大的功能,它允许我们通过标签选择器来指定 Pod 与节点或其他 Pod 之间的关系,以影响调度决策。
在这篇博客中,我们将深入探讨 Kubernetes 中的亲和性概念、不同类型的亲和性以及它们在集群调度中的应用。
1、什么是亲和性?
在Kubernetes中,亲和性是一种调度策略,用于指定Pod倾向于被调度到具有特定属性的节点。亲和性分为两种类型:
1、节点亲和性(Node Affinity):指定Pod倾向于被调度到具有特定标签或标签表达式的节点。
2、Pod亲和性(Pod Affinity):指定Pod倾向于与具有特定标签或标签表达式的其他Pod共存。
2、节点亲和性(Node Affinity)
节点亲和性允许我们指定 Pod 应该在哪些节点上运行。它可以根据节点的标签来决定 Pod 的调度位置。
节点亲和性规则可以是硬性的或软性的。硬性规则要求 Pod 必须在匹配的节点上运行,而软性规则则更加宽松,只是倾向于将 Pod 调度到符合条件的节点上。
2.1 硬性节点亲和性规则(required)
1、硬性规则指定了 Pod 必须被调度到满足规则条件的节点上,否则 Pod 将无法被调度和启动。
例如,可以使用硬性节点亲和性规则来确保 Pod 只能被调度到拥有特定标签的节点上。这在需要确保特定类型的节点才能运行某些任务时非常有用。
下面是一个示例 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)
软性规则指定了 Pod 更倾向于被调度到满足规则条件的节点上,但并不强制要求。
例如,可以使用软性节点亲和性规则来指定 Pod 更倾向于被调度到某个特定区域的节点上,以减少数据传输延迟。
下面是一个示例 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 必须满足的条件,如果这些条件不能满足,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 偏好的条件,如果这些条件可以满足,Pod 将会优先被调度到符合条件的节点上,但如果无法满足,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 Anti-Affinity)是一种 Kubernetes 调度策略,用于指定 Pod 不能被调度到与其他特定 Pod 相同的节点上。这有助于提高应用程序的可靠性和可用性,避免将相互依赖或相互竞争的 Pod 部署在同一节点上。
以下是一个 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💖点点关注,收藏不迷路💖
|