kubernetes Affinity亲和性
kubernetes Affinity 亲和性亲和性/反亲和性调度策略调度策略匹配标签操作符拓扑域支持调度目标nodeAffinity主机In、NotIn、Exists、DoesNotExist、Gt、Lt否指定主机podAffinityPodIn、NotIn、Exists、DoesNotExist是Pod 与指定 Pod 在同一个拓扑域podAnitAffinityPodIn、NotIn、Exi
·
kubernetes Affinity 亲和性
亲和性/反亲和性调度策略
| 调度策略 | 匹配标签 | 操作符 | 拓扑域支持 | 调度目标 |
|---|---|---|---|---|
| nodeAffinity | 主机 | In、NotIn、Exists、DoesNotExist、Gt、Lt | 否 | 指定主机 |
| podAffinity | Pod | In、NotIn、Exists、DoesNotExist | 是 | Pod 与指定 Pod 在同一个拓扑域 |
| podAnitAffinity | Pod | In、NotIn、Exists、DoesNotExist | 是 | Pod 与 指定 Pod 不在同一个拓扑域 |
键值运算关系 affinity.nodeAffinity.nodeSelectorTerms.operator
operator
- In:label 的值在某个列表中
- NotIn:label的值不在某个列表中
- Gt:label的值大于某个值
- Lt:label的值小于某个值
- Exists:某个 label 存在
- DoesNotExist:某个 label 不存在
一、 节点亲和性 pod.spec.nodeAffinity
pod.spec.nodeAffinity
- preferredDuringSchedulingIgnoredDuringExecution:软策略
- requiredDuringSchedulingIgnoredDuringExecution:硬策略
硬策略案例:
node节点亲和性,node选择方案,通过键名匹配键值进行选择。
选择 kubernetes.io/hostname != k8s-node2 的节点进行匹配。
这个节点运行后只会在 Node1 上运行,排除Node2
apiVersion: v1
kind: Pod
metadata:
name: affinity
labels:
app: node-affinity-pod
spec:
containers:
- name: nginx
image: nginx:1.9.1
affinity: #亲和性
nodeAffinity: #node节点亲和性
requiredDuringSchedulingIgnoredDuringExecution: #硬策略限制
nodeSelectorTerms: #node选择方案
- matchExpressions:
- key: kubernetes.io/hostname #键名是 kubernetes.io/hostname=
operator: NotIn # 运算关系: 不在,不是
values:
- k8s-node2 # key的值,不是k8s-node2即可。
kubectl get pod -o wide 查看节点,不论删除几次再创建都只会是 node1 节点。

软策略案例:
如果有则进行匹配,没有也不强行匹配。k8s会找一个合适的节点自行匹配。
案例当中的 K8S 集群没有node3 节点,则自行匹配至 node1 节点。
apiVersion: v1
kind: Pod
metadata:
name: affinity
labels:
app: node-affinity-pod
spec:
containers:
- name: nginx
image: nginx:1.9.1
affinity: #亲和性
nodeAffinity: #node节点亲和性
preferredDuringSchedulingIgnoredDuringExecution: #软策略限制
- weight: 1 #权重为1,如果有多个不同的软策略,则根据权重高的来进行匹配
preference:
- matchExpressions: #匹配规则
- key: kubernetes.io/hostname #键名是 kubernetes.io/hostname=
operator: In # 运算关系: 是,在
values:
- k8s-node3 # key的值,最好是k8s-node3,如果没有node3则在其他节点运行。
kubectl get pod -o wide
硬策略+软策略合并匹配
先满足硬策略,再满足软策略
apiVersion: v1
kind: Pod
metadata:
name: affinity
labels:
app: node-affinity-pod
spec:
containers:
- name: nginx
image: nginx:1.9.1
affinity: #亲和性
nodeAffinity: #node节点亲和性
requiredDuringSchedulingIgnoredDuringExecution: #硬策略限制
nodeSelectorTerms: #node选择方案
- matchExpressions:
- key: kubernetes.io/hostname #键名是 kubernetes.io/hostname=
operator: NotIn # 运算关系: 不在,不是
values:
- k8s-node2 # key的值,不是k8s-node2即可。
preferredDuringSchedulingIgnoredDuringExecution: #软策略限制
- weight: 1 #权重1
preference:
matchExpressions: #匹配规则
- key: kubernetes.io/os # 键名kubernetes.io/os
operator: In # 是,在
values:
- linux # 匹配 os 是 linux
二、Pod 亲和性 podAffinity
pod.spec.affinity.podAffinity/podAntiAffinity
- preferredDuringSchedulingIgnoredDuringExecution:软策略
- requiredDuringSchedulingIgnoredDuringExecution:硬策略
硬、软策略示例:
根据不同的节点标签 app ,来进行匹配
apiVersion: v1
kind: Pod
metadata:
name: pod-3
labels:
app: pod-3
spec:
containers:
- name: pod-3
image: nginx:1.9.1
affinity: #亲和性
podAffinity: #Pod亲和性,运行在同一个 Pod
requiredDuringSchedulingIgnoredDuringExecution: #硬限制策略
- labelSelector: #标签匹配
matchExpressions: #匹配规则,如果有 app=pod-1,则运行在该Pod
- key: app #当app的值
operator: In #是
values:
- node1 #是node1,则进行匹配
topologyKey: kubernetes.io/hostname #通过hostname标签进行判断
apiVersion: v1
kind: Pod
metadata:
name: pod-3
labels:
app: pod-3
spec:
containers:
- name: pod-3
image: nginx:1.9.1
affinity:
PodAntiAffinity: #Pod亲和性,必须不在同一个节点
preferredDuringSchedulingIgnoreDuringExectuion: #软策略
- weight: 1 #权重
podAffinityTerm:
labelSelector:
matchExpressions: #如果有 app=node2 则不运行在该 node2 节点运行。
- key: app
operator: In
values:
- node2
topologykey: kubernetes.io/hostname
查看节点标签:kubectl get pod --show-labels
修改标签:(将 Pod-node1的 app 标签修改成 node2)
kubectl label pod node1 app=node2 --overwrite
更多推荐
所有评论(0)