美文网首页
关于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调度策略

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