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