k8s 集群调度

关于调度

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容忍对应的污点即可。