美文网首页
关于kubernates的Pod调度策略

关于kubernates的Pod调度策略

作者: hnbcao | 来源:发表于2018-11-21 12:04 被阅读0次

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 <node-name> <label-key>=<label-value>
$ 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调度策略

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

  • K8s Scheduler(4)

    scheduler故名思维负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上。 调度流程 给pod做调度...

  • kuberntes - pod调度

    影响调度的因素 待调度Pod列表可用node列表调度算法 :主机过滤 | 主机打分调度策略 主机过滤 主机打分 手...

  • 一文学会k8s调度策略

    1、 kubernetes集群POD调度策略 (1) 、 NoSchedule: 一定不能被调度 (2) 、 P...

  • Pod调度(指定节点、污点、亲和性)

    创建一个Pod的工作流程 相关概念 工作流程图 Pod中影响调度的主要属性 资源调度依据 调度策略 资源限制对Po...

  • k8s Affinity 亲和性专题源码分析 (二)

    前面文章一部分已有介绍Pod亲和性相关的调度策略算法分析,接下来我们继续Pod相关调度算法分析: 三 POD亲和性...

  • pipeline项目中源代码变更自动触发构建

    之前pipeline运行在pod中,基于jenkins kubernates的插件,在pod中实现 下载源码---...

  • pod 调度亲和性

    关于pod调度https://www.centos.bz/2017/07/kubernetes-pod-sched...

  • k8s 集群调度

    关于调度 k8s内pod由scheduler调度,scheduler的任务是把pod分配到合适的node节点上。s...

  • k8s调度漫谈

    Kubernetes Scheduler 的作用是将待调度的 Pod 按照一定的调度算法和策略绑定到集群中一个合适...

网友评论

      本文标题:关于kubernates的Pod调度策略

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