pod调度

作者: 慕知 | 来源:发表于2021-08-27 18:05 被阅读0次

    kube-scheduler 是 Kubernetes 集群的默认调度器; 在做调度决定时需要考虑的因素包括: 单独和整体的资源请求、硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间 的干扰等等

    一,指定nodeName

    一,指定nodeName:(与containers同级别) 
    
    示例:
    
    spec:
      containers:
      - name: nginx
        image: nginx
      nodeName: node1
    
    1)如果节点没有资源容纳pod,则调度失败 
    2)节点不存在,调度失败
    
    
    

    二,nodeSelector

    二,nodeSelector(与containers同级别) 
    示例:
    
    # 给node1打标签
    kubectl label nodes node1 disktype=ssd
    
    #指定按照标签选择节点 
    spec:
      containers:
      - name: nginx
        image: nginx
      nodeSelector:
        disktype: ssd 
    
    1) 如果没有匹配到标签会无法运行pod,pending状态
    2) 删除node标签不会影响已运行的pod,伸缩或者重新部署会pending
    
    
    
    

    三,亲和/反亲和

    
    
    (基于上面的nodeSelector扩展,nodeSelector匹配不到标签会调度失败,可以发现规则是“软”/“偏好”,而不是硬性要求,因此,如果调度器无法满足该要求,仍然调度该pod)
    
    节点亲和
    • requiredDuringSchedulingIgnoredDuringExecution 必须满足
    • preferredDuringSchedulingIgnoredDuringExecution 倾向满足
    • IgnoreDuringExecution 表示如果在Pod运行期间Node的标签发生变化,导致 亲和性策略不能满足,则继续运行当前的Pod。
    
    
    nodeaffinity还支持多种规则匹配条件的配置:
    • In: label 的值在列表内
    • NotIn: label 的值不在列表内
    • Gt: label 的值大于设置的值,不支持Pod亲和性 • Lt:label 的值小于设置的值,不支持pod亲和性 • Exists:设置的label 存在
    • DoesNotExist: 设置的 label 不存在
    
    
    示例1: spec:
      containers:
      - name: nginx
        image: nginx
          spec:
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                      - key: disktype
                        operator: In
                        values:
                          - ssd
    
    必须满足,调度到标签为disktype=ssd的节点上
    
    
    
    
    
    示例2: 
      template:
        metadata:
          labels:
            app: nginx
        spec:
          affinity:
            nodeAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:   
                - preference:
                    matchExpressions:
                      - key: disktype
                        operator: In
                        values:
                          - ssd
                  weight: 1
              requiredDuringSchedulingIgnoredDuringExecution:     
                nodeSelectorTerms:
                  - matchExpressions:
                      - key: kubernetes.io/hostnme
                        operator: NotIn
                        values:
                          - cn-shanghai.192.168.50.27
    
    1) 倾向满足调度到,标签为disktype=ssd的节点上
    2) 必须满足,不调度在节点cn-shanghai.192.168.50.27上
    
    
    
    
    
    
    示例3:
    
      template:
        metadata:
          labels:
            app: nginx
        spec:
          affinity:
            podAntiAffinity:
              preferredDuringSchedulingIgnoredDuringExecution:
                - podAffinityTerm:
                    labelSelector:
                      matchExpressions:
                        - key: disktype
                          operator: In
                          values:
                            - ssd
                    topologyKey: kubernetes.io/hostname
                  weight: 100
    反亲和
    不调度到,标签为disktype=ssd的节点
    
    
    

    四,污点

    # • Taints(污点)是Node的一个属性,设置了Taints后,所以Kubernetes是不会将 Pod调度到这个Node上的,
    
    于是Kubernetes就给Pod设置了个属性Tolerations(容忍), 只要 Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去
    
    
    tolerations中定义的key、value、effect,要与node上设置的taint保持一致: 
    • 如果 operator 是 Exists ,value可以省略。
    • 如果 operator 是 Equal ,则key与value之间的关系必须相等。
    • 如果不指定operator属性,则默认值为Equal
    
    还有两个特殊值:
    • 当不指定key,再配合Exists 就能匹配所有的key与value ,可以容忍所有污点。 • 当不指定effect ,则匹配所有的effect。
    #必须满足
    
     # 添加污点
    kubectl taint node node1 node-role.kubernetes.io/master:NoSchedule
    
    #Toleration(容忍) 
    operator可以定义为:
    Equal:表示key是否等于value,默认 Exists:表示key是否存在,此时无需定义value
    tain 的 effect 定义对 Pod 排斥效果 
    
    NoSchedule:仅影响调度过程,对现存的Pod对象不产生影响; 
    NoExecute:既影响调度过程,也影响显著的Pod对象;不容忍的Pod对象将被驱逐
    PreferNoSchedule: 表示尽量不调度
    
    
    
    
    #示例1: 
    
    spec:
          containers:
          - name: myapp
            image: myapp:v1
          tolerations:
            - effect: NoExecute
              key: kafka
              operator: Equal
              value: kafkadaptation
    #以上的配置容忍kafka=kafkadaptation,则打了污点的标签可以调度(如果没有这个配置的容器,不可以被调度打了污点的节点上)
    
    
    
    
    
    
    #示例2: containers:
          - name: myapp
            image: myapp:v1
          tolerations:
          - operator: "Exists"
            effect: "NoSchedule"
    tolerationSeconds: 6000(当 pod 需要被驱逐时,可以继续在 node 上 运行的时间)
    
    # 当不指定key,再配合Exists 就能匹配所有的key与value ,可以容忍所有污点。(容忍后有污点的节点都可以调度)
    
    1)如果effect是NoSchedule(如上),则打了污点的NoSchedule节点也会被调度
    2)如果effect是NoExecute,则打了污点的NoExecute节点可以被调度
    3)如果不指定effect,则忽视所有污点,所有打了污点的标签都可以被调度(如示例3)
    
    
    
    #示例3:
    
          containers:
          - name: myapp
            image: myapp:v1
          tolerations:
          - operator: "Exists"
    # • 当不指定effect ,则匹配所有的effect。即所有污点都会忽视
    
    
    
    
    
    PS1:
    如果想让一个deployment不管有多少个pod都在一个节点上,
          tolerations:
            - effect: NoExecute
              key: wd
              operator: Equal
              value: wd
    
    只能NoExecute才可以做到
    
    
    
    
    PS2:
    如果10个节点打了一样的污点,有10个deployment需要在这10台机器跑,并且各个服务之间的pod不能再用一个节点上(10个deployment各只有一个pod为例)
    
    
    # 设置pod反亲和
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchExpressions:
                      - key: adaptor
                        operator: In
                        values:
                          - adaptor
                  topologyKey: kubernetes.io/hostname
          containers:
    ... ...
              resources:
                requests:
                  cpu: 250m
                  memory: 64Mi
          terminationGracePeriodSeconds: 30
    # 增加容忍度
          tolerations:
            - effect: NoExecute
              key: kafka
              operator: Equal
              value: kafkadaptation
          volumes:
            - hostPath:
                path: /etc/localtime
                type: ''
              name: volume-localtime
    
    

    相关文章

      网友评论

          本文标题:pod调度

          本文链接:https://www.haomeiwen.com/subject/vplmiltx.html