在默认情况下,一个pod在那个node节点与逆行,是由scheduler组件采用相应的 算法计算出来的,这个工程不受人工孔子,但是在实际使用中,这并不满足需求,因为很多情况下,我们想控制某些pod到某些节点上
- 自动调度:运行在那个节点上完全由schedluer算法计算得出
- 定向调度:nodename 、nodeselector
- 亲和性调度:nodeaffinity、 podaffinity、 podantiaffininty
- 容忍调度: taints 、tolertion
一 定向调度
利用pod声明nodename或nodeselector形式,实现定向,这调度方式是强制性的
[root@master ~]# cat pod.base.yaml apiVersion: v1 kind: Pod metadata: name: test-v1 namespace: dev labels: version: "1" env: "test" spec: containers: - name: busybox image: busybox command: ["/bin/sh","-c","touch /tmp/1.txt;while true;do /bin/echo $(date + %T)>> /tmp/1.txt; sleep 3; done;"] env: - name: "HOSTNAME" value: "slurmmaster" nodeName: server1 ##二级目录
查看pod信息
[root@master ~]# kubectl get pod -n dev -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-v1 2/2 Running 0 77s 10.244.2.16 server1 <none> <none>
标签调度
nodeselector用于将pod添加到指定标签的node节点上,他也是强制约束
//首先分别创建node节点添加标签 ##为server1 添加 host为server1的标签 [root@master ~]# kubectl label nodes server1 host=server1 node/server1 labeled [root@master ~]# kubectl label nodes server2 host=server2 node/server2 labeled
将pod放到server1
[root@master ~]# cat pod.base.yaml apiVersion: v1 kind: Pod metadata: name: test-v1 namespace: dev labels: version: "1" env: "test" spec: containers: - name: nginx1 image: nginx:1 ports: - name: nginx-port containerPort: 80 resources: limits: cpu: "0.1" memory: "1G" livenessProbe: exec: command: ["/bin/ls","/tmp/"] #执行查看一个文件 nodeSelector: host:server1
//查看发现是在server1上面的
[root@master ~]# kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test-v1 2/2 Running 0 14s 10.244.2.17 server1 <none> <none>
三 亲和性调度
优选选择满足条件的node进行调度,也可以调度到不满足调节的节点上,使调度更加灵活
affinity主要分三类:
- nodeaffinity:以node为目标,解决pod可以调度到那些node问题
- podaffinity:pod为目标,解决pod可以和那些存在pod部署同一个拓步中的问题
- podantiaffinity: 以pod为目标,解决pod不饿能和那些已存在pid部署在同一个拓步中的问题
关系符说明
- matchExpressions - key:env operator:Exists ##匹配存在标签key为env的节点 - key:env operator:In values: ["xxx","yyy"] ##匹配key为env且值为xx或yyy