19、k8s-pod调度-自动调度、定向调度、亲和性调度

概念:在默认请款下、一个pod在哪个节点上运行、是由Scheduler组件采用相应的算法计算出来的、这个过程是不受人为控制的。

kubernetes提供了四种调度方式:

  ·自动调度:由Scheduler来计算pod运行在哪个节点上(默认的)

  ·定向调度:由人为定义的NodeName、NodeSelector来决定 (如pod1上贴上NodeName1、node1节点上也贴上了相同的NodeName1、那么pod1就会定向的运行在node1节点上)

  ·亲和性调度:由人为定义的pod1与pod2(pod2运行在node2节点上)比较亲和所以pod1也会运行在node2节点上:NodeAffinity、PodAffinity、PodAffinity

  ·污点(容忍):污点是对于node节点来说(如node1有污点那么就拒绝pod在node1上运行)、而容忍对于pod来说(pod可以容忍node1的污点,那么pod也可以在node1上运行):Taints、Toleration

 

1、定向调度:

  #nodeName:基于node节点的名字去调度

#指的是利用在pod上声明nodeName或者nodeSelector、以此将pod调度到期望的node节点上、注意这里的调度是强制的、即使要调度的node节点不存在也会强制调度、不过pod会运行失败

NodeName:
    ·用于强制约束将pod调度到指定名字的node节点上、这种方式直接跳过了scheduler的调度逻辑、直接将pod调度到指定的node节点上

实例:=================================
1、创建yaml文件:vim pod-nodename.yaml

-----------------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
 name: pod-nodename
 namespace: dev

spec: 
 containers:                  #pod的属性
 - name: nginx
   image: nginx:1.17.1
   ports:
   - name: nginx-port
     containerPort: 80
 nodeName: node-1        #指定调度到node-1节点上(pod的属性)      node-1是节点名

------------------------------------------------------------------------
2、kubectl create -f pod-nodename.yaml 

3、查看pod:kubectl get pod -ndev -o wide

 

  #nodeSelector:基于node的标签去调度

1、给node-1节点打上标签:kubectl label nodes node-1 nodeenv=pro
2、查看node标签:kubectl get nodes --show-labels
3、创建yaml文件:vim pod-nodeselector.yaml
----------------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
 name: pod-nodeselector
 namespace: dev

spec:
 containers:
 - name: nginx
   image: nginx:1.17.1
   ports:
   - name: nginx-port
     containerPort: 80
     protocol: TCP
 nodeSelector:
     nodeenv: pro #指定调度到具有nodeenv=pro标签的node节点上
-----------------------------------------------------------------------
4、执行:kubectl create -f pod-nodeselector.yaml
5、查看pod运行的节点:kubectl get pod pod-nodeselector -ndev -o wide

 

 

 

==================================================亲和性调度==================================================

#亲和性调度:

  ·NodeAffinity(主要基于与node和pod的亲和性来调度)

Affinity主要分为三类:
    ·nodeAffinity(node亲和性):以node为目标、解决pod可以调度到哪些node的问题
    ·podAffinity(pod亲和性):以pod为目标、解决pod可以和哪些已存在的pod部署在同一个拓扑域中的问题
    ·podAntiAffinity(pod反亲和性):以pod为目标、解决pod不能和哪些已存在pod部署在同一个拓扑域中的问题
场景应用:
    ·亲和性:如果两个应用频繁交互、那就有必要利用亲和性让两个应用尽可能的靠近、这要做可以减少因网络通信而带来的性能损耗
     反亲和性:当应用的采用多副本部署时、有必要采用反亲和性让各各应用实例打散分布在各个node上、这样可以提高服务的高可用性
     
1、NodeAffinity(node亲和性)
    ·可配置项1-硬限制
        spec:
            containers:
                ....
            affinity:        #亲和性设置
              nodeAffinity:    #设置node亲和性
                requiredDuringSchedulingIgnoredDuringExecution:    #设置硬限制条件(x下面的所有条件必须满足才能调度到相应的node上)
                  nodeSelectorTerms:         #节点选择列表
                  - matchExpressions:        #(按节点标签列出的节点选择器要求列表)匹配env的值在["xxx","yyy"]中的标签
                    - key: nodeenv            #nodeenv 为标签名
                      operator: In            #关系符:Exists(存在)、DoesNotExist(不存在)、In(包含)、NotIn(不在...范围)、Gt(大于)、Lt(小于)
                      values: ["xxx","yyy"]
                      
    ·可配置项1-软限制
        spec:
            containers:
                ....
            affinity:        #亲和性设置
              nodeAffinity:    #设置node亲和性
                preferredDuringSchedulingIgnoredDuringExecution:    #设置硬限制条件(x下面的所有条件必须满足才能调度到相应的node上)
                  preference:         #一个节点选择器、与相应的的权重相关联
                  - matchExpressions:        #(按节点标签列出的节点选择器要求列表)匹配env的值在["xxx","yyy"]中的标签
                    - key: nodeenv            #nodeenv 为标签名
                      operator: In
                      values: ["xxx","yyy"]    
                  weigh    #倾向权重、范围在1-100

实例:
#1、硬限制
·创建yaml文件:vim pod-nodeaffinity-re.yaml
===========================================================================
apiVersion: v1
kind: Pod
matedata:
 name: pod-nodeaffinity-re
 namespace: dev

spec:
 containers:
 - name: nginx
   image: nginx:1.17.1
 affinity:
   nodeAffinity:
     requiredDuringSchedulingIgnoredDuringExecution:
       nodeSelectorTerms:
       - matchExpressions:    #意思就是:这个pod要调度到匹配 标签名为nodeenv的 、标签值在要么是xxx、要么是yyy的node节点上
         - key: nodeenv
           operator: In
           values: ["xxx","yyy"]    #key=xxx  或key=yyy
===================================================================
 ·创建pod:kubectl create -f pod-nodeaffinity-re.yaml
 ·查看pod创建过程中详细信息:kubectl describe pod pod-nodeaffinity-re -ndev
     @Warning  FailedScheduling  31s   default-scheduler  0/2 nodes are available: 2 node(s) didn't match node selector.
     @发现在node节点中没有符合要求的node节点
     @将xxx改为存在的标签值 pro即可将pod创建出来

#2、软限制
·创建yaml文件:vim pod-nodeaffinity-pre.yaml
====================================================================================
apiVersion: v1
kind: Pod
metadata:
 name: pod-nodeaffinity-pre
 namespace: dev

spec:
 containers:
 - name: nginx
   image: nginx:1.17.1
 affinity:
   nodeAffinity:
     preferredDuringSchedulingIgnoredDuringExecution:
     - weight: 1
       preference:
         matchExpressions:
         - key: nodeenv
           operator: In
           values: ["pro","yyy"]
           
======================================================================
·创建pod:kubectl create -f pod-nodeaffinity-pre.yaml

 

#PodAffinity(Pod的亲和性调度)

Pod亲和性的配置:
#硬限制
          spec:
            containers:
                ....
            affinity:        #亲和性设置
              podAffinity:    #设置node亲和性
                requiredDuringSchedulingIgnoredDuringExecution:    #设置硬限制条件(x下面的所有条件必须满足才能调度到相应的node上)
                  namespaces:                 #指定参照pod的namespace
                  topologyKey:                #指定调度作用域
                  labelSelector:                #标签选择器
                    matchExpression:            #按节点标签列出节点选择器要求列表(推荐)
                    - key: nodeenv            #nodeenv 为标签名
                      operator: In            #关系符:Exists(存在)、DoesNotExist(不存在)、In(包含)、NotIn(不在...范围)、Gt(大于)、Lt(小于)
                      values: ["xxx","yyy"]
                    matchLabels:            #指多个matchExpression映射的内容
                      
    ·可配置项1-软限制
        spec:
            containers:
                ....
            affinity:        #亲和性设置
              podAffinity:    #设置node亲和性
                preferredDuringSchedulingIgnoredDuringExecution:    #设置硬限制条件(x下面的所有条件必须满足才能调度到相应的node上)
                  podAffinityTerm:            #选项
                    namespaces:
                    topologyKey:
                    labelSelector:
                      matchExpressions:         #(按节点标签列出的节点选择器要求列表)匹配env的值在["xxx","yyy"]中的标签
                        key: nodeenv            #nodeenv 为标签名
                        operator: In
                        values: ["xxx","yyy"]    
                   weigh    #倾向权重、范围在1-100

topologyKey:用于指定调度时作用域:
    ·如果指定为kubernetes.io/hostname    那就是以Node节点为区分范围
    ·如果指定为 beta.kubernetes.io/os    则以Node节点的操作系统的类型来区分
-------------------------
实例:
#1、先创建一个pod,用于参照
    ·创建pod的yaml文件:vim pod-podaffinity-target.yaml
-----------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
  name: pod-podaffinity-target
  namespace: dev
  labels:
    podenv: pro          #设置标签

spec:
 containers:
 - name: nginx
   image: nginx:1.17.1
 nodeName: node-1       #将pod放在node-1节点上
 ------------------------------------------------------------
     ·创建pod:kubectl create -f pod-podaffinity-target.yaml
     ·查看pod信息: kubectl get pod pod-podaffinity-target -ndev -o wide --show-labels
#2、创建pod的硬限制pod
    ·创建yaml文件:vim pod-podaffinity-req.yaml
 -------------------------------------------------------
 apiVersion: v1
kind: Pod
metadata:
  name: pod-podaffinity-req
  namespace: dev

spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:   #硬限制
      - labelSelector:
          matchExpression:                              #匹配标签
          - key: podenv
            operator: In
            values: ["pro","xxx"]
        topologyKey: kubernetes.io/hostname
 --------------------------------------------------------------------------------
     ·创建pod:kubectl create -f pod-podaffinity-req.yaml
     ·查看pod的详细信息:kubectl get pod pod-podaffinity-req -ndev -o wide --show-labels
     ·将pod-podaffinity-req 这个pod调度到有这个标签的(poddev=pro)pod所在的同一个node节点上去 

 测试pod的反亲和性:

posted @ 2024-07-01 00:11  little小新  阅读(75)  评论(0编辑  收藏  举报