k8s 集群调度

作者: yuan_dongj | 来源:发表于2020-06-14 23:58 被阅读0次

    关于调度

    k8s内pod由scheduler调度,scheduler的任务是把pod分配到合适的node节点上。scheduler调度时会考虑到node节点的资源使用情况、port使用情况、volume使用情况等等...在此基础之上,我们也可以控制pod的调度。

    亲和性

    亲和性分为节点亲和与pod亲和,亲和策略分类软策略与硬策略。

    节点亲和

    apiVersion: v1
    kind: Pod
    metadata:
      name: node-affinity
      namespace: test
    spec:
      containers:
      - name: nginx-pod
        image: nginx:latest
      affinity:
        # 节点亲和
        nodeAffinity:
          # 硬策略,条件必须成立
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            # 要调度到node的标签是kubernetes.io/hostname=node01的节点上
            - matchExpressions:
              - key: kubernetes.io/hostname
                operator: In
                values:
                - node01
          # 软策略,条件尽量要成立
          preferredDuringSchedulingIgnoredDuringExecution:
          # 多个软策略的权重,范围在1-100内,越大计算的得分越高
          - weight: 1
            preference:
              matchExpressions:
              # 要调度到node的标签是area=beijing的节点上
              - key: area
                operator: In
                values:
                - beijing
    

    pod亲和常用于避免相同类型的pod调度相同的节点上。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-affinity
      namespace: test
    spec:
      containers:
      - name: nginx-pod
        image: nginx:latest
      affinity:
        # pod亲和 要求与指定的pod在同一个拓扑域
        podAffinity:
          # 硬策略
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx01
            # 拓扑域(node上的标签key)
            topologyKey: kubernetes.io/hostname
        # pod亲和 要求与指定的pod不在同一个拓扑域
        podAntiAffinity:
          # 软策略
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - nginx01
              # 拓扑域(node上的标签key)
              topologyKey: kubernetes.io/hostname
    

    污点

    通过kubctl taint命令可以给某一个node节点设置污点,node上设置了污点之后,可以上node拒绝pod的调度,甚至可以将node上已经存在的pod驱逐出去。

    污点可以用于集群节点迁移准备工作,通过打污点来使当前节点上的pod迁移出去。k8s 的master节点自带污点。

    污点的组成为key=value:effect,effect有以下三个选项:

    • NoSchedule:k8s不会把pod调度到该节点上
    • PreferNoSchedule:k8s尽量不会把pod调度到该节点上
    • NoExecute:k8s不会把pod调度到该节点上,同时会把已有节点驱逐出去
    #设置污点
    kubectl taint nodes node1 key1=value1:NoSchedule
    #去除污点
    kubectl taint nodes node1 key1:NoSchedule-
    

    容忍

    pod可以设置容忍,代表此pod可以容忍某个污点的存在。

    pod.spec.tolerations

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

    k8s的namespace可以提供资源的逻辑隔离,但是无法提供物理隔离。物理隔离可以通过污点与容忍来做。

    比如想隔离不同产品线的服务,可以提前给node打上不同的污点,不同的产品线的pod容忍对应的污点即可。

    相关文章

      网友评论

        本文标题:k8s 集群调度

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