简介:

affinity是K8S 1.2版本后引入的新特性,类似于nodeSelector,允许使用者指定一些pod在Node间调度的约束,目前支持两种形式:

       1、 requireDuringSchedulinglgnoreDuringExecution : 必须满足pod调度匹配条件,不满足则不调度(严格匹配,硬匹配)

       2、 prequireDuringSchedulinglgnoreDuringExecution: 优先满足pod调度匹配条件,不满足的情况下也会调度到不符合条件的node上(不严格匹配,软匹配)

affinity和nodeSelector对比:

  1、亲和于反亲和对目的标签的选择匹配不仅仅支持and,还支持In、Noth、Exists、DoesNotExist、Gt、Lt

        *In :标签的值存在匹配列表中(匹配成功就调度到目的node,实现node亲和)

        *NotIn :标签的值不存在指定的匹配列表中(不会调度到目的node,实现反亲和)

        *Gt :标签的值大于某个值(字符串)

        *Lt : 标签的值小于摸个值(字符串)

        *Exists :指定的标签存在

 2、可以设置软匹配和硬匹配

 3、可以对pod定义亲和策略,比如允许哪些pod可以或者不可用被调度到同一台node

注:* 如果定义一个nodeSelectorTerms中通过一个matchExpressions基于列表指定了多个operator条件,则只要满足其中一个条件,就会被调度到相应的节点上,即or的关系,即如果nodeSelectorTerms下面有多个条件的话,只要满足任何一个条件就可以了

        *如果定义一个nodeSelectorTerms中都通过一个matchExpressions(匹配表达式)指定key匹配多个条件,则所有的目的条件都必须满足才会调度到对应的节点,即and的关系,如果matchExpressions有多个选项的话,则必须同时满足所有这些条件才能正常调度

常用类型是requireDuringSchedulinglgnoreDuringExecution 硬限制,下面举例应用

1、创建yaml资源

1、编写yaml文件
root@master1:/tmp# cat nodeAffinity-requiredDuring-matchExpressions.yaml
kind: Deployment
#apiVersion: extensions/v1beta1
apiVersion: apps/v1
metadata:
  labels:
    app: myserver-tomcat-app2-deployment-label
  name: myserver-tomcat-app2-deployment
  namespace: myserver
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myserver-tomcat-app2-selector
  template:
    metadata:
      labels:
        app: myserver-tomcat-app2-selector
    spec:
      containers:
      - name: myserver-tomcat-app2-container
        image: tomcat:7.0.94-alpine
        imagePullPolicy: IfNotPresent
        #imagePullPolicy: Always
        ports:
        - containerPort: 8080
          protocol: TCP
          name: http
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions: #匹配条件1,有一个key但是有多个values、则只要匹配成功一个value就可以调度
              - key: disktype   #指定key是disktype,values的值在下面定义
                operator: In    #operator是操作符,这里操作符是In,In标签的值存在列表中,列表在下面指定的是
                values:         #列表中指定了两个values,只要能匹配到一个值就满足匹配条件
                - ssd
                - xxx
            - matchExpressions: #匹配条件2,有一个key但是有多个values、则只要匹配成功一个value就可以调度
              - key: project
                operator: In
                values:
                - mmm  #即使匹配条件2都不满足也可以调度,因为定义了两个matchExpressions只要有任意一个满足就可以调用。
                - nnn


2、创建资源
root@master1:/tmp# kubectl apply -f nodeAffinity-requiredDuring-matchExpressions.yaml

2、查看资源

调度到了172.31.7.111节点上了,这个节点的标签满足disktype=ssd这个匹配

查看两个node标签,都没有第二个匹配条件标签project=mmm或project=nnn,最后还是调度成功了,因为只需要满足这两个匹配条件的一个即可

 

此时如果把172.31.7.111节点的标签删除,已经运行的pod不会受到影响,但是如果把pod删除重建就无发调度创建了,因为111节点的标签已经删除了;但是再重新把接节点打上标签后就立刻恢复正常运行

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐