一、亲和&反亲和
基于已经在 node 节点上运行的 Pod 的标签来约束新创建的 Pod 可以调度到的目的节点。
在集群上运行一个 nginx pod,其有2个标签。
apiVersion: v1
kind: Pod
metadata:
name: nginx-0
labels:
app: nginx
env: pod-test
spec:
containers:
- name: nginx-0
image: nginx:1.23.2-alpine
1.1 亲和性
在 requiredDuringSchedulingIgnoredDuringExecution(硬亲和) 和
preferredDuringSchedulingIgnoredDuringExecution(软亲和)中,topologyKey 不允许为空。
- 硬亲和:必须匹配成功才调度,如果匹配失败则拒绝调度。
- 软亲和:能匹配成功就尽量调度到配置的 topologyKey,匹配不成功会由kubernetes自行调度。
# 硬亲和
apiVersion: v1
kind: Pod
metadata:
name: tomcat-1
labels:
app: tomcat
spec:
containers:
- name: tomcat-1
image: tomcat:9
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: env
operator: In
values:
- pod-test
topologyKey: "kubernetes.io/hostname"
---
# 软亲和
apiVersion: v1
kind: Pod
metadata:
name: tomcat-2
labels:
app: tomcat
spec:
containers:
- name: tomcat-2
image: tomcat:9
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: env
operator: In
values:
- pod-test
topologyKey: "kubernetes.io/hostname"
1.2 反亲和
在 requiredDuringSchedulingIgnoredDuringExecution(硬亲和) 和 preferredDuringSchedulingIgnoredDuringExecution(软亲和)中,topologyKey 不允许为空。
对于 requiredDuringSchedulingIgnoredDuringExecution 要求的 Pod 反亲和性,准入控制器 LimitPodHardAntiAffinityTopology 被引入以确保 topologyKey 只能是 kubernetes.io/hostname,如果希望 topologyKey 也可用于其他定制拓扑逻辑,可以更改准入控制器或者禁用。
只有3个工作节点的情况下,再增加一个 pod 副本,这个新增的副本只会一直处于“Pending”状态。
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: pod-nginx
project: test
name: nginx-3
spec:
replicas: 3
selector:
matchLabels:
app: pod-nginx
template:
metadata:
labels:
app: pod-nginx
project: test
spec:
containers:
- name: nginx-3
image: nginx:1.23.2-alpine
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: project
operator: In
values:
- test
topologyKey: "kubernetes.io/hostname"
尽量把4个副本调度到不同节点,只有3个工作节点的情况下,有一个节点会调度2个副本。
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: pod-nginx
project: test
name: nginx-4
spec:
replicas: 4
selector:
matchLabels:
app: pod-nginx
template:
metadata:
labels:
app: pod-nginx
project: test
spec:
containers:
- name: nginx-4
image: nginx:1.23.2-alpine
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: project
operator: In
values:
- test
topologyKey: "kubernetes.io/hostname"
二、污点与容忍
- 污点(taints),用于node节点排斥 Pod调度,与亲和的作用是完全相反的,即 taint 的 node 和 pod 是排斥调度关系。
- 容忍(toleration),用于 pod 容忍 node 节点的污点信息,即 node 有污点信息也会将新的 pod 调度到 node。
污点的三种类型:
- NoSchedule:将不会把 pod 调度到具有该污点的 node 上。
- PreferNoSchedule:将尽量避免把 pod 调度到具有该污点的 node 上。
- NoExecute:将不会把 pod 调度到具有该污点的 node 上,同时会将 node 上已经存在的 pod 强制驱逐出去。
基于operator的污点匹配:
- Exists:容忍度不需要 value 而是直接匹配污点类型。
- Equal:需要指定 value 并且 value 的值需要等于 tolerations 的 key。
# 给所有节点打上污点
# kubectl taint nodes w1 w2 w3 k1=v1:NoSchedule
# # 去掉污点
# # kubectl taint nodes w1 w2 w3 k1:NoSchedule-
# 如果设置容忍,则无法调度到工作 w1~w3 节点上
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: pod-nginx
project: test
name: nginx-5
spec:
replicas: 5
selector:
matchLabels:
app: pod-nginx
template:
metadata:
labels:
app: pod-nginx
project: test
spec:
containers:
- name: nginx-5
image: nginx:1.23.2-alpine
tolerations:
- key: "k1"
operator: "Equal"
value: "v1"
effect: "NoSchedule"
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net