默认配置下,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,灵活添加各种自定义属性。

贴签示例

将node2节点的label设置为disktype=ssd

添加标签

1
2
[root@pool1 yaml]# kubectl label nodes pool2 disktype=ssd
node/pool2 labeled
1
2
3
4
5
[root@pool1 yaml]# kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
node Ready control-plane,master 21d v1.21.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
pool2 Ready <none> 21d v1.21.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,'disktype=ssd',kubernetes.io/arch=amd64,kubernetes.io/hostname=pool2,kubernetes.io/os=linux
pool3 Ready <none> 21d v1.21.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=pool3,kubernetes.io/os=linux

运行Pod到指定标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@node1 ~]# vi 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:
# 将Pod运行到带有ssd标签的节点下
disktype: ssd
[root@node1 ~]# kubectl apply -f nginx.yml

root@pool1 yaml]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mysql-deploy-69c6869d65-sbzhl 1/1 Running 0 53m 240.185.2.77 pool2
nginx-deploy-849865cbbb-fkqmn 1/1 Running 0 47h 240.185.1.58 pool2
nginx-deploy-849865cbbb-pvnh7 1/1 Running 0 47h 240.185.1.59 pool2

删除标签

1
2
[root@node1 ~]# kubectl label nodes pool2 disktype-
# 删除之后,已经运行在node2的Pod不会被影响,是不会去重新部署的