默认配置下,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中。

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0