• pod&node选择部署策略: nodeSelector和nodeAffinity


    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]
    修改后重启服务
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    示例:

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                      - key: deploy.type
                        operator: In
                        values:
                          - yztssjdxt-test
                          - yztssjdxt
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

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

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

    策略字段字段释义
    requiredDuringSchedulingpod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。
    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
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    而这段配置只需要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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

    字段名称字段释义
    Inlabel.value在列表中
    NotInlabel.value不在列表中
    Exists某个label.value存在
    DoesNotExist某个label.value不存在
    Gtlabel.value的值大于某个值
    Ltlabel.value的值小于某个值

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

        spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                      - key: deploy.type
                        operator: NotIn
                        values:
                          - yztssjdxt-test
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    DOM中node节点方法大全
    证书科普 | 国内主流BIM证书,原来差距这么大
    devops自动化运维平台的核心原则有哪些?
    docker-compose在虚拟机上搭建zookeeper+kafka3.0.0集群
    【深度优先搜索遍历算法的实现,广度优先遍历(BFS-Breadth_First Search),构造最小生成树】
    SQL Server实战六:T-SQL、游标、存储过程的操作
    企业架构LNMP学习笔记44
    算法记录--好多内容也是借鉴大神的
    Java中InputStream写入到文件中
    Java----List接口(Collection的子接口)
  • 原文地址:https://blog.csdn.net/weixin_42082634/article/details/125407019