1、登录服务器修改节点标签

查看所有节点labels:
kubectl get nodes --show-labels

添加labels:
kubectl label nodes node2 [label.key]=[label.value]

修改pod配置文件与工作节点标签对应
修改yaml配置文件:

添加nodeSelector配置,样式为[label.key]: [label.value]
nodeSelector:
  [label.key]: [label.value]
修改后重启服务

示例:

apiVersion: apps/v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: namespace
  labels:
    app: nginx-pod
spec:
   nodeSelector:
     deploy.type: assembly_app
   containers:
     - name: nginx
       image: "nginx"
       restartPolicy: Always

拓展:
nodeSelector配置相对简单,k8s提供了另外一个pod调度配置:nodeAffinity(节点亲和),相对于nodeSelector的简单匹配他拥有更多更加个性化的配置。

spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: deploy.type
                    operator: In
                    values:
                      - yztssjdxt-test
                      - yztssjdxt

这段配置表示:该pod可以被调度到标签key为 “deploy.type” ,值为 “yztssjdxt-test” 或 “yztssjdxt” 的节点。

通过使用的语句不同,调度分成软策略(soft)和硬策略(hard),在软策略下,如果没有满足调度条件的节点,pod会忽略这条规则,继续完成调度。而硬策略下,pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。

DuringScheduling和IgnoredDuringExecution组合生成目前主要的nodeaffinity策略

策略字段

字段释义

requiredDuringScheduling

pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。

preferredDuringScheduling

表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。

IgnoredDuringExecution

表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,pod也会继续运行。

RequiredDuringExecution

表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,则重新选择符合要求的节点。

软硬策略可以组合使用,如下面这段配置中pod必须被调度到标签为 “deploy.type=yztssjdxt-test” 的节点。另外,在满足该条件的节点中,优先使用具有 “server=oms” 标签的节点。

spec:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: deploy.type
                  operator: In
                  values:
                    - yztssjdxt-test
          preferredDuringSchedulingIgnoredDuringExecution:
              - weight: 1
                  preference:
                  matchExpressions:
                      - key: server
                          operator: In
                          values:
                              - oms

nodeAffinity中nodeSelector字段下,节点满足任何一个条件即可;但更下一级matchExpressions,节点必须同时满足所有条件才能运行pod 。

如下面这段配置需要deploy.type=yztssjdxt-test、server=oms同时满足

spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: deploy.type
                    operator: In
                    values:
                      - yztssjdxt-test
                  - key: server
                    operator: In
                    values:
                      - oms

而这段配置只需要deploy.type=yztssjdxt-test、deploy.type1=yztssjdxt满足一个即可

spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: deploy.type
                    operator: In
                    values:
                      - yztssjdxt-test
              - matchExpressions:
                  - key: deploy.type1
                    operator: In
                    values:
                      - yztssjdxt

operator字段:pod与node的匹配逻辑,可选的操作符有:

字段名称

字段释义

In

label.value在列表中

NotIn

label.value不在列表中

Exists

某个label.value存在

DoesNotExist

某个label.value不存在

Gt

label.value的值大于某个值

Lt

label.value的值小于某个值

如下方这段配置,pod将不会调度到deploy.type=yztssjdxt-test的node上

spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: deploy.type
                    operator: NotIn
                    values:
                      - yztssjdxt-test