默认配置下,Scheduler 会将 Pod 调度到所有可用的 Node。不过有些情况我们希望将 Pod 部署到指定的 Node,比如将有大量磁盘 I/O 的 Pod 部署到配置了 SSD 的 Node;或者 Pod 需要 GPU,需要运行在配置了 GPU 的节点上。
Kubernetes是通过label来实现这个功能的,同之前的docker swarm集群的label是一样的,通过对节点进行label的设置,将Pod运行的指定的label节点上。
label是key-value对,各种资源都可以设置label,灵活添加各种自定义属性。
给节点设置标签
使用kubectl label
命令
将node2节点的label设置为disktype=ssd
node1节点作为集群master,如果设置了标签,想要指定Pod运行的话,还需要将节点的taint给删除,参考伸缩Pod
[root@node1 ~]# kubectl label nodes node2 disktype=ssd
node/node2 labeled
查看节点标签
[root@node1 ~]# kubectl get nodes --show-labels
# 可以在node2中看到刚才新添加的label标签
NAME STATUS ROLES AGE VERSION LABELS
node1 Ready master 45m v1.18.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node2 Ready <none> 30m v1.18.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
node3 Ready <none> 30m v1.18.1 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node3,kubernetes.io/os=linux
注意
除了可以自定义的标签外,每个节点中还有几个自己维护的label。
使用yaml文件指定节点label
编写yaml文件
[root@node1 ~]# vim nginx.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
label:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.8
ports:
- containerPort: 80
nodeSelector:
# 最终希望运行的容器部署到指定的节点label中,所以在容器的设置下进行写入nodeSelector选项
disktype: ssd
运行模板文件
[root@node1 ~]# kubectl apply -f nginx.yml
deployment.apps/nginx created
查看pod的部署位置
已经全部在node2节点运行
[root@node1 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-7d686f84b9-8vwzv 1/1 Running 0 22m 10.244.1.2 node2
nginx-7d686f84b9-cp6cc 1/1 Running 0 22m 10.244.1.4 node2
nginx-7d686f84b9-fdpwg 1/1 Running 0 22m 10.244.1.3 node2
删除节点label
[root@node1 ~]# kubectl label nodes node2 disktype-
node/node2 labeled
删除之后,已经运行在node2的Pod不会被影响,是不会去重新部署的
如果要重新调度运行Pod,只需要将yaml文件中的nodeSelector字段删除,重新部署即可
如果想要将node2的所有pod转移到node3,设置node3的节点label,只需要在yaml文件中将nodeSelector改为node3的节点label,重新部署,就会将pod全部转移到node3中。