kubernetes使用 (六)Pod调度策略--亲和性

节点亲和性

(。・∀・)ノ

节点亲和性,顾名思义就是Pod和某个节点比较亲近

大致分为3种(硬亲和、软亲和、反亲和)

 案例1 硬亲和

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:     #亲和性设置
    nodeAffinity:    #节点亲和性设置
      requiredDuringSchedulingIgnoredDuringExecution:
                    #硬亲和设置
        nodeSelectorTerms:  #节点匹配的信息设置
        - matchExpressions:  #匹配表达式
          - key: env_role   
            operator: In    #包含于
            values:
            - dev        #允许env_role=dev的节点
            - test       #允许env_role=test的节点
  containers:
  - name: webdemo
    image: nginx:1.15

部署

kubectl create -f req-affinity.yaml 

 查看

[root@k8s-master01 ~]# kubectl get pod
NAME                 READY   STATUS    RESTARTS   AGE
with-node-affinity   0/1     Pending   0          20s

#可以看到状态为Pending模式,表示改容器没有被调度成功

硬亲和,要求节点必须有key=value的值,如果没有则不会被调度。我们给他添加一个标签

kubectl label nodes 192.168.1.21 env_role=dev

 再次查看

[root@k8s-master01 ~]# kubectl get pod -o wide
NAME                 READY   STATUS    RESTARTS   AGE     IP           NODE           NOMINATED NODE   READINESS GATES
with-node-affinity   1/1     Running   0          7m53s   10.244.2.2   192.168.1.21   <none>           <none>

#可以看到pod运行在添加了标签的节点192.168.1.21上

 

案例2 软亲和

cat > pre-affinity.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity-pre
spec:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
                      #软亲和
      - weight: 1
        preference:
          matchExpressions:
          - key: group
            operator: In 
            values:
            - otherprod
  containers:
  - name: webdemo
    image: nginx:1.15
EOF

部署

kubectl create -f pre-affinity.yaml 

查看

[root@k8s-master01 ~]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES
with-node-affinity-pre   1/1     Running   0          55s   10.244.2.3   192.168.1.21   <none>           <none>


#可以看到,使用软亲和时如果没有设置标签,那么会随机找个节点去运行(不强求)

 打标签

kubectl label nodes 192.168.1.22 group=otherprod

重建pod

#删除
kubectl delete -f pre-affinity.yaml 

#新建
kubectl create -f pre-affinity.yaml 

查看

[root@k8s-master01 ~]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE           NOMINATED NODE   READINESS GATES
with-node-affinity-pre   1/1     Running   0          46s   10.244.1.2   192.168.1.22   <none>           <none>

#可以看到运行在192.168.1.22节点上

小结:

      硬亲和,必须要求运行在指定标签的节点上

      软亲和,如果有对应标签则优先运行到该节点,如果没有则随机

 

到这里大家发现软、硬亲和的配置都差不多。 无非都是有没有key=value

但是需要注意一个参数 "operator" 即匹配的操作符

#突然想看看有那些参数了,怎么整? 还记得explain吗
kubectl explain pod.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.matchExpressions.operator

返回

DESCRIPTION:
     Represents a key's relationship to a set of values. Valid operators are In,
     NotIn, Exists, DoesNotExist. Gt, and Lt.

常用操作符

1. In        #包含自, 比如上面的硬亲和就包含env_role=dev、env_role=test两种标签

2. NotIn     #和上面相反,凡是包含该标签的节点都不会匹配到

3. Exists    #存在里面和In比较类似,凡是有某个标签的机器都会被选择出来。使用Exists的operator的话,values里面就不能写东西了。

4. Gt        #greater than的意思,表示凡是某个value大于设定的值的机器则会被选择出来。

5. Lt        #less than的意思,表示凡是某个value小于设定的值的机器则会被选择出来。

6. DoesNotExists  #不存在该标签的节点

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值