关于kubernates的Pod调度策略

Pod调度方式有,自动调度、定向调度、Node亲和性调度、Pod亲和性和互斥性调度

自动调度:Deployment/RC

自动调度就是采用Deployment或者是RC等对象完成一组Pod的调度与自动控制功能。
下面是一个简单的例子,没有特别的地方。

apiVersion: apps/v1
kind: Deployment metadata :
name: nginx-deploymet
spec: 
  replicas: 3 
  template:
    metadata: 
      labels:
        app: nginx 
    spec:
      containers:
      - name: nginx
        image: nginx :l.7.9 
        ports:
        - containerPort: 80
定向调度:NodeSelector

前面提到的自动调度是通过master上的kube-schduler上的一系列复杂的调度算法实现的,通常我们是不知道Pod最终会被调度到某一个节点上。
NodeSelector的作用就是将Pod调度到我们指定的一些节点上

  • 首先使用kubectl label 给节点打上标签:
#kubectl label nodes  =
$ kubectl label nodes k8s-node-1 zone=node-01

上述命令行操作也可以通过修改资源定义文件的方式 , 并执行 kubectl replace -f xxx.yaml命令来完成。

  • 然后在Pod定义的对象中加入NodeSelector设置
apiVersion: apps/v1
kind: Deployment metadata :
name: nginx-deploymet
spec: 
  replicas: 3 
  template:
    metadata: 
      labels:
        app: nginx 
    spec:
      #NodeSelector设置 zone: node-01对应上面label中的zone:node-01
      nodeSelector: 
        zone: node-01
      containers:
      - name: nginx
        image: nginx :l.7.9 
        ports:
        - containerPort: 80

Pod最终会运行在有zone: node-01标签的节点上。
除此之外,我们还可以在Pod定义中加入nodeName配置,指定Pod运行的具体节点。

apiVersion: apps/v1
kind: Deployment metadata :
name: nginx-deploymet
spec: 
  replicas: 3 
  template:
    metadata: 
      labels:
        app: nginx 
    spec:
      #nodeName设置 Pod有且只能运行在k8s-node-1节点上
      nodeName:  k8s-node-1
      containers:
      - name: nginx
        image: nginx :l.7.9 
        ports:
        - containerPort: 80
Node亲和性调度:NodeAffinity

NodeAffinity即节点亲和性调度,目前有两个亲和性表达:

  • RequiredDuringSchedulinglgnoredDuringExecution:必须满足指定的规则才可以调度 Pod到 Node 上(功能与 nodeSelector很像,但是使用的是不同的语法),相当于硬限制。
  • PreferredDuringSchedulinglgnoredDuringExecution:强调优先满足指定规则,调度器会尝试调度 Pod到 Node上,但并不强求,相当于软限制。多个优先级规则还可以设置权 重( weight)值,以定义执行的先后顺序。
apiVersion: v1
kind: Pod 
metadata:
  name: with-node-affinity
  spec:
    affinity: 
      nodeAffinity:
        requiredDuringSchedulingignoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: beta.kubernetes.io/arch
              operator: In
              values:
              - amd64
.......
Pod亲和性和互斥性调度:PodAffinity/PodAntiAffinity

PodAffinity/PodAntiAffinity即Pod亲和性/Pod互斥性。NodeAffinity是根据节点的标签选择调度的节点,PodAffinity/PodAntiAffinity则是根据节点上运行的Pod的标签来判断是否将Pod调度到该节点。
NOTE: PodAffinity/PodAntiAffinity同NodeAffinity一样有两个条件表达:

  • RequiredDuringSchedulinglgnoredDuringExecution
  • PreferredDuringSchedulinglgnoredDuringExecution
下面通过实例来说明Pod间的亲和性和互斥性:

与节点亲和性类似 , Pod 亲和性的操作符也包括 In、NotIn、 Exists、 DoesNotExist、 Gt、 Lt等。

  • Pod的亲和性调度
    下面创建的Pod将会运行在matchLabels相同的Pod所在的节点上。如果不存在这样的Pod,则我们所创建的Pod将无法运行。
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: zookeeper
  labels:
    app: zookeeper-cluster
spec:
  serviceName: "zookeeper-headless"
  replicas: 3
  template:
    metadata:
      labels:
        app: zookeeper-cluster
    spec:
      affinity:
       # Pod亲和性调度
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - topologyKey: "kubernetes.io/hostname"
              matchExpressions:
                operator: In
                key: app
                value: zookeeper-cluster
......
  • Pod的互斥性调度
    下面创建的Pod将会运行在matchLabels不同的Pod所在的节点上。
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: zookeeper
  labels:
    app: zookeeper-cluster
spec:
  serviceName: "zookeeper-headless"
  replicas: 3
  template:
    metadata:
      labels:
        app: zookeeper-cluster
    spec:
      affinity:
        # Pod互斥性调度
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - topologyKey: "kubernetes.io/hostname"
              matchExpressions:
                operator: In
                key: app
                value: zookeeper-cluster
......

本文是在部署有状态集群应用时遇到的关系Pod调度问题的情况下总结出来的,大部分内容出至于《Kubernetes权威指南:从Docker到Kubernetes实践全接触》一书。

你可能感兴趣的:(关于kubernates的Pod调度策略)