一、Node标签概念

每个node节点默认会有很多标签,标签在日常工作中就类似我们的一个标识;看到标签 就能晓得这台node节点的主要用处;

1.1 为节点添加标签

查看节点

[root@master01 ~]# kg node
NAME       STATUS   ROLES           AGE     VERSION
master01   Ready    control-plane   4d15h   v1.26.9
master02   Ready    control-plane   4d15h   v1.26.9
master03   Ready    control-plane   4d15h   v1.26.9
node01     Ready    <none>          4d15h   v1.26.9
node02     Ready    <none>          4d15h   v1.26.9

为node节点加上核心应用的标签

[root@master ~]# kubectl label nodes node01 apptype=core

验证节点标签

[root@master01 ~]# kubectl get nodes --show-labels | grep apptype=core
node01     Ready    <none>          4d15h   v1.26.9   apptype=core,beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux

去除节点标签

[root@master01 ~]# kubectl label nodes node01 apptype-

二、调度策略

2.1 nodeSelector

nodeSelector 是节点选择约束的最简单推荐形式。你可以将 nodeSelector 字段设置你希望 目标节点所具有的节点标签 。 Kubernetes只会将 Pod 调度到拥有你所指定的每个标签的节点上。

[root@master01 ~]# vim busybox.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox
spec:
  replicas: 3
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      nodeSelector:
        apptype: core
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/abroad_images/busybox
        name: busybox
        imagePullPolicy: IfNotPresent
        command:
        - /bin/sh
        - -c
        - sleep 3000

演示说明:

1、将下面两行进行注释

        nodeSelector:
          apptype=core

2、根据下面文件进行创建deployment

[root@master01 ~]# vim busybox.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox
spec:
  replicas: 3
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      #nodeSelector:
      #  apptype: core
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/abroad_images/busybox
        name: busybox
        imagePullPolicy: IfNotPresent
        command:
        - /bin/sh
        - -c
        - sleep 3000

[root@master01 ~]# k apply -f busybox.yaml

3、验证,观察到默认是分配到不同node节点

[root@master01 ~]# kg po -owide
NAME                       READY   STATUS    RESTARTS   AGE   IP               NODE       NOMINATED NODE   READINESS GATES
busybox-5f47ccc474-nkdcp   1/1     Running   0          20s   172.21.231.135   node02     <none>           <none>
busybox-5f47ccc474-tkrp8   1/1     Running   0          20s   172.18.71.2      master03   <none>           <none>
busybox-5f47ccc474-twnhc   1/1     Running   0          20s   172.29.55.7      node01     <none>           <none>

4、将上面两行取消注释

删除前面操作

[root@master01 ~]# k delete  -f busybox.yaml

重新定义yaml文件,将下面两行内容取消注释

      nodeSelector:
        apptype: core

完整配置文件如下:

[root@master01 ~]# vim busybox.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox
spec:
  replicas: 3
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      nodeSelector:
        apptype: core
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/abroad_images/busybox
        name: busybox
        imagePullPolicy: IfNotPresent
        command:
        - /bin/sh
        - -c
        - sleep 3000

[root@master01 ~]# k apply -f busybox.yaml

5、再次验证,观察到因为节点没有打指定标签apptype=core无法调度

[root@master01 ~]# kg po -owide
NAME                       READY   STATUS    RESTARTS   AGE     IP       NODE     NOMINATED NODE   READINESS GATES
busybox-74b8bf9d79-dhcjq   0/1     Pending   0          2m36s   <none>   <none>   <none>           <none>
busybox-74b8bf9d79-kp8s7   0/1     Pending   0          2m36s   <none>   <none>   <none>           <none>
busybox-74b8bf9d79-tl7tt   0/1     Pending   0          2m36s   <none>   <none>   <none>           <none>

6、给node01节点打上指定标签后,再次查看,观察到三个Pod全部调度到指定的node01节点上

[root@master01 ~]# kubectl label nodes node01 apptype=core
[root@master01 ~]# kg po -owide
NAME                       READY   STATUS    RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATES
busybox-74b8bf9d79-dhcjq   1/1     Running   0          5m49s   172.29.55.8    node01   <none>           <none>
busybox-74b8bf9d79-kp8s7   1/1     Running   0          5m49s   172.29.55.9    node01   <none>           <none>
busybox-74b8bf9d79-tl7tt   1/1     Running   0          5m49s   172.29.55.10   node01   <none>           <none>

7、环境复原

# 删除资源
[root@master01 ~]# k delete -f busybox.yaml

# 删除标签
[root@master01 ~]# kubectl label nodes node01 apptype-