节点亲和性
(。・∀・)ノ
节点亲和性,顾名思义就是Pod和某个节点比较亲近
大致分为3种(硬亲和、软亲和、反亲和)
案例1 硬亲和
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity
spec:
affinity: #亲和性设置
nodeAffinity: #节点亲和性设置
requiredDuringSchedulingIgnoredDuringExecution:
#硬亲和设置
nodeSelectorTerms: #节点匹配的信息设置
- matchExpressions: #匹配表达式
- key: env_role
operator: In #包含于
values:
- dev #允许env_role=dev的节点
- test #允许env_role=test的节点
containers:
- name: webdemo
image: nginx:1.15
部署
kubectl create -f req-affinity.yaml
查看
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
with-node-affinity 0/1 Pending 0 20s
#可以看到状态为Pending模式,表示改容器没有被调度成功
硬亲和,要求节点必须有key=value的值,如果没有则不会被调度。我们给他添加一个标签
kubectl label nodes 192.168.1.21 env_role=dev
再次查看
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
with-node-affinity 1/1 Running 0 7m53s 10.244.2.2 192.168.1.21 <none> <none>
#可以看到pod运行在添加了标签的节点192.168.1.21上
案例2 软亲和
cat > pre-affinity.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: with-node-affinity-pre
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
#软亲和
- weight: 1
preference:
matchExpressions:
- key: group
operator: In
values:
- otherprod
containers:
- name: webdemo
image: nginx:1.15
EOF
部署
kubectl create -f pre-affinity.yaml
查看
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
with-node-affinity-pre 1/1 Running 0 55s 10.244.2.3 192.168.1.21 <none> <none>
#可以看到,使用软亲和时如果没有设置标签,那么会随机找个节点去运行(不强求)
打标签
kubectl label nodes 192.168.1.22 group=otherprod
重建pod
#删除
kubectl delete -f pre-affinity.yaml
#新建
kubectl create -f pre-affinity.yaml
查看
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
with-node-affinity-pre 1/1 Running 0 46s 10.244.1.2 192.168.1.22 <none> <none>
#可以看到运行在192.168.1.22节点上
小结:
硬亲和,必须要求运行在指定标签的节点上
软亲和,如果有对应标签则优先运行到该节点,如果没有则随机
到这里大家发现软、硬亲和的配置都差不多。 无非都是有没有key=value
但是需要注意一个参数 "operator" 即匹配的操作符
#突然想看看有那些参数了,怎么整? 还记得explain吗
kubectl explain pod.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.matchExpressions.operator
返回
DESCRIPTION:
Represents a key's relationship to a set of values. Valid operators are In,
NotIn, Exists, DoesNotExist. Gt, and Lt.
常用操作符
1. In #包含自, 比如上面的硬亲和就包含env_role=dev、env_role=test两种标签
2. NotIn #和上面相反,凡是包含该标签的节点都不会匹配到
3. Exists #存在里面和In比较类似,凡是有某个标签的机器都会被选择出来。使用Exists的operator的话,values里面就不能写东西了。
4. Gt #greater than的意思,表示凡是某个value大于设定的值的机器则会被选择出来。
5. Lt #less than的意思,表示凡是某个value小于设定的值的机器则会被选择出来。
6. DoesNotExists #不存在该标签的节点