• 22-k8s中pod的调度-亲和性affinity


    一·、概述

            在k8s当中,“亲和性”分为三种,节点亲和性、pod亲和性、pod反亲和性;

    亲和性分类名称解释说明
    nodeAffinity节点亲和性通过【节点】标签匹配,用于控制pod调度到哪些node节点上,以及不能调度到哪些node节点上;(主角node节点)
    podAffinitypod亲和性通过【节点+pod】标签匹配,可以和哪些pod部署在同一个节点上(拓扑域);(主角是pod)
    podAntiAffinitypod反亲和性通过【节点+pod】标签匹配,与pod亲和性相反,就是和那些pod不在一个节点上(拓扑域);

    二、nodeAffinity-节点亲和性

    1,给k8s节点创建标签

    [root@k8s231 ~]# kubectl label nodes k8s231 k8s=xinjizhiwa-01
    node/k8s231 labeled
    [root@k8s231 ~]# kubectl label nodes k8s232 k8s=xinjizhiwa-02
    node/k8s232 labeled
    [root@k8s231 ~]# kubectl label nodes k8s233 k8s=xinjizhiwa-03
    node/k8s233 labeled

    查看标签

    [root@k8s231 dns]# kubectl get nodes --show-labels

    2,编辑资源清单设置节点亲和性

    [root@k8s231 nodeaffinity]# cat nodeaffinity.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dm-affinity
    spec: 
      replicas: 20
      selector: 
        matchLabels:
          k8s: xinjizhiwa
      template:
        metadata:
          name: pod-affinity 
          labels:
            k8s: xinjizhiwa
        spec:
          #声明亲和性
          affinity:
            #声明亲和性类型
            nodeAffinity:
              #硬限制,必须满足的条件有哪些?(不满足下面的条件,亲和性就设置失败)
              requiredDuringSchedulingIgnoredDuringExecution:
                #设置节点选择器列表:
                nodeSelectorTerms:
                #声明基于节点的标签进行关联
                - matchExpressions:
                  - key: k8s
                    values: 
                    - xinjizhiwa-03
                    - xinjizhiwa-02
                    #设置key和value的关系;
                    #--In:key==value(必须写value)
                    #--NotIn:key !=value(必须写value)
                    operator: In
              #软限制,不一定满足,但会优先满足,相当于一高了调度的优先级;
              preferredDuringSchedulingIgnoredDuringExecution:
              #配置权重
              - weight: 10
                #偏向性
                preference:
                  #基于节点的标签进行关联
                  matchExpressions:
                  #节点的标签名称
                  - key: k8s
                    values:
                    - xinjizhiwa-03
                    #关联关系,表示key和values的关系
                    #In:表示包含关系(value必须写)
                    #NotIn:表示不包含(value必须写)
                    #Exists: 表示存在关系(不能写value)
                    #DoesNotExist:不存在(不能写value)
                    #Gt:大于(value必须是一个单一的元素,且值将被解释称一个整数)
                    #Lt:小于(value必须是一个单一的元素,且值将被解释称一个整数)
                    operator: In
          containers:
          - name: c1
            image: nginx:1.20.1-alpine
            ports:
            - containerPort: 80

    3,创建资源

    [root@k8s231 nodeaffinity]# kubectl apply -f nodeaffinity.yaml

    4,查看pod所在节点,验证亲和性

    三、podAffinity-pod的亲和性

            基于“节点标签”进行设置,第一个pod副本创建在了哪个节点上,那么其余副本也会创建在这个节点上;

            拓扑域:节点机器的标签的key和value都相等的机器,就是同一个拓扑域;

    1,编辑资源清单设置pod亲和性

    [root@k8s231 nodeaffinity]# cat podaffinity.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dm-affinity
    spec: 
      replicas: 20
      selector: 
        matchLabels:
          k8s: xinjizhiwa
      template:
        metadata:
          name: pod-affinity 
          labels:
            k8s: xinjizhiwa
        spec:
          #声明亲和性
          affinity:
            #声明亲和性类型
            podAffinity:
              #硬限制,必须满足的条件有哪些?(不满足下面的条件,亲和性就设置失败)
              requiredDuringSchedulingIgnoredDuringExecution:
              #设置拓扑域,指定【节点的标签名】
              #【节点key】就是说,设置了拓扑域,pod就会往这个标签的节点进行创建

              #只要满足key是k8s的节点的标签,那么就是同一个拓扑域
              - topologyKey: k8s
                #【pod标签】确定pod的标签,用于二次确认,选中了拓扑域(节点标签的key),再次选中pod标签才能确认调度到哪个节点;
                labelSelector:
                  matchExpressions: 

                  #意思是说,只要key的值是k8s的pod创建在了哪个节点,“我”就跟随他。也创建在这个节点上;
                  - key: k8s
                    #如果pod标签,出现了key值相同,value值不同的情况下,就不见设置Exists存在的关系了
                    #建议设置:In的方式进行匹配,当然此时Value就不能设置了;
                    operator: Exists
          containers:
          - name: c1
            image: nginx:1.20.1-alpine
            ports:
            - containerPort: 80

    2,创建资源

    [root@k8s231 nodeaffinity]# kubectl apply -f podaffinity.yaml

    3,查看pod所在节点

    [root@k8s231 nodeaffinity]# kubectl get pods -o wide

    四、podAntAffinity-pod的反亲和性

            pod的亲和性:符合拓扑域的范围,指定标签的pod创建在哪里,其他pod就创建在哪里;

            pod的反亲和性:与之相反,符合拓扑域的范围,指定标签的pod创建在哪里,其他pod就不能创建在哪里;

    1,编辑资源清单设置pod的反亲和性

    [root@k8s231 nodeaffinity]# cat podantaffinity.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dm-affinity
    spec: 
      replicas: 4
      selector: 
        matchLabels:
          k8s: xinjizhiwa
      template:
        metadata:
          name: pod-affinity 
          labels:
            k8s: xinjizhiwa
        spec:
          #声明亲和性
          affinity:
            #声明亲和性类型
            podAntiAffinity:
              #硬限制,必须满足的条件有哪些?(不满足下面的条件,亲和性就设置失败)
              requiredDuringSchedulingIgnoredDuringExecution:
              #设置拓扑域,指定【节点的标签名】
              #【节点key】就是说,设置了拓扑域,pod就会往这个标签的节点进行创建
              - topologyKey: k8s
                #【pod标签】确定pod的标签,用于二次确认,选中了拓扑域(节点标签的key),再次选中pod标签才能确认调度到哪个节点;
                labelSelector:
                  matchExpressions: 
                  - key: k8s
                    #如果pod标签,出现了key值相同,value值不同的情况下,就不见设置Exists存在的关系了
                    #建议设置:In的方式进行匹配,当然此时Value就不能设置了;
                    operator: Exists
          containers:
          - name: c1
            image: nginx:1.20.1-alpine
            ports:
            - containerPort: 80
     

    2,创建资源

    [root@k8s231 nodeaffinity]# kubectl apply -f podantaffinity.yaml

    3,查看pod

    结论:

    1,由于第一pod创建在了k8s232中,所以第二个pod就无法再k8s232中创建;

    2,第二个pod就再k8s233中创建了;

    3,由于我们是4个副本,k8s231还设置了污点,无法创建pod;

    4,所以,我们4个副本,最后只能创建成功2个,剩下两个pending;

    至此,亲和性,学习完毕

    #######################

    容器运维学习交流微信群:xinjizhiwa-1030

    #######################

  • 相关阅读:
    封装全局异常处理
    reqable(小黄鸟)+雷电抓包安卓APP
    圆角矩形不是圆:圆角的画法和二阶连续性
    7.3 进程管理之暂停、归档和策略
    JAVA环境下使用DATAX(不使用python调用:也是个人记录一下)
    大学时光仅四年,疫情反反复复占几年
    排序算法总结-C语言
    Js扁平化和tree数据结构转换
    SSH远程登录协议
    leetcode18 四数之和 双指针
  • 原文地址:https://blog.csdn.net/2302_79199605/article/details/136175200