美文网首页
K8s Scheduler(4-1)

K8s Scheduler(4-1)

作者: jaymz明 | 来源:发表于2020-06-07 12:47 被阅读0次

    Affinity 和 AntiAffinity

    Affinity: 和nodeSelector很像,提供了更多维度去部署pod。比如你希望哪些pod必须部署在同一个node上,或者同一个zone里。

    有两种类型:requiredDuringSchedulingIgnoredDuringExecution,preferredDuringSchedulingIgnoredDuringExecution

    业界也喜欢叫hard和soft规定。requiredDuringSchedulingIgnoredDuringExecution表示pod一定要满足下列要求才允许部署(跟nodeSelector一样)。后者则没那么强制性要求,也允许跑在其他地方。类型中包含IgnoredDuringExecution和NodeSelector类似,如果在运行时,node的label变化了导致affinity规则不满足,这个pod仍然会运行在这个node上。未来有计划提供requiredDuringSchedulingRequiredDuringExecution,这个目的就是一旦标签变化,就会立即驱逐evict pod。

    pods/pod-with-node-affinity.yaml 
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: with-node-affinity
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/e2e-az-name
                operator: In
                values:
                - e2e-az1
                - e2e-az2
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1 #(1-100)
            preference:
              matchExpressions:
              - key: another-node-label-key
                operator: In #(NotIn,Exists,DoesNotExist,Gt,Lt)
                values:
                - another-node-label-value
      containers:
      - name: with-node-affinity
        image: k8s.gcr.io/pause:2.0
    

    如果你既指定了nodeSelector,同时也设置了affinity rule, 那么就必须满足两者pod才可以调度。

    preferredDuringSchedulingIgnoredDuringExecution里的weight的取值范围是1到100,调度器会根据资源需求,affinity 满足度自动合计出weight值,weight值越高的node,pod将优先选择。

    那么AntiAffinity是做什么的?

    它的表现就是排他性的。比如我们在生产环境经常会用到类似于rabbitmq的消息队列服务,一般为了能够高可用,会做HA,所以在调度的过程中会出现两个rabbitmq跑在了同一个node上,不仅浪费了资源,而且也增加了风险。所以我们可以用antiAffinity来强制pod部署在不同的node上。通过topologyKey来区分:

    比如 1. kubernetes.io/hostname,根据hostname来区分拓扑结构。

    1. failure-domain.beta.kubernetes.io/zone
    2. failure-domain.beta.kubernetes.io/region

    如下图,在node的label为app=store上,分别部署一个nginx-pod-affinity的pod。

    pods/pod-with-node-antiaffinity.yaml
    
    apiVersion: v1
    kind: Deployment
    metadata:
      name: nginx-pod-affinity
    spec:
      selector:
        matchLabels:
          app: store
      replicas: 3
      template:
        metadata:
          labels:
            app: store
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - store
                topologyKey: "kubernetes.io/hostname"
          containers:
          - name: nginx
            image: nginx
    

    Taints 和 Tolerations

    给node设置污点Taint,如:

    kubectl taint nodes node1 key=value:NoSchedule
    

    设置污点表明该node不在调度任何pod,除非pod有相应的容忍度Toleration。

    删除操作和删除label一样。最后加个-。

    kubectl taint nodes node1 key:NoSchedule-
    

    下图表明虽然node1设置了taint,但是pod也设置了toleration,因此该pod还是可以部署在node1上的。

    pods/pod-with-toleration.yaml 
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
      tolerations:
      - key: "key"
        operator: "Equal"
        value: "value"
        effect: "NoSchedule"
    
    

    每个污点有一个key和value作为污点的标签,其中value可以为空,effect描述污点的作用。当前taint effect支持如下三个选项:

    • NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上.
    • PreferNoSchedule:表示k8s将尽量避免将Pod调度到具有该污点的Node上.
    • NoExecute:表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去

    Toleration:

    • 其中key, vaule, effect要与Node上设置的taint保持一致
    • operator的值为Exists将会忽略value值
    • tolerationSeconds用于描述当Pod需要被驱逐时可以在Pod上继续保留运行的时间

    下面看一下在Pod上设置容忍的两个特例:

    示例1: 当不指定key值时,表示容忍所有的污点key:

    tolerations:
    - operator: "Exists"
    

    示例2:当不指定effect值时,表示容忍所有的污点作用:

    tolerations: 
        - key: "key"  
          operator: "Exists" 
    

    相关文章

      网友评论

          本文标题:K8s Scheduler(4-1)

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