kubernetes(k8s)-31之节点亲和性affinity

一、目标

学习掌握什么是kubernetes(k8s)的亲和性(硬性亲和性、软性亲和性)
注意:节点亲和性的功能在较低版本的k8s是不支持的,我也不清楚是哪个版本开始的。
preferredDuringSchedulingIgnoredDuringExecution:亲和性软策略
requiredDuringSchedulingIgnoredDuringExecution:亲和性硬策略

二、平台

[[email protected] ~]# uname -r
3.10.0-957.el7.x86_64
[[email protected] ~]# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
[root@master qinhe]# rpm -qa |grep kube
kubeadm-1.17.3-0.x86_64
kubernetes-cni-0.7.5-0.x86_64
kubelet-1.17.3-0.x86_64
kubectl-1.17.3-0.x86_64

各主机规划:
主机名          IP                       角色                       端口
master  192.168.73.150    master,node        
node1   192.168.73.151    node                      
node2   192.168.73.152    node 
harbor   192.168.73.160   harbor私服

三、kubernetes(k8s)硬亲和性NotIn

1.在master节点上创建硬亲和性NotIn的yaml文件(requiredDuringSchedulingIgnoredDuringExecution)

[root@master qinhe]# cat a1-affinity-pod.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity
    image: harbor.hiibm.com/public/xnginx:v1.5.20200306
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: NotIn
            values:
            - node2.hiibm.com

 

2.注释

apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity
    image: harbor.hiibm.com/public/xnginx:v1.5.20200306       #===>事先随便准备个镜像,也可以不用私有仓库
  affinity:             #===>亲和性参数
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname        #===>参数:取pod的主机名
            operator: NotIn                    #===>条件:不包含
            values:
            - node2.hiibm.com                  #===>值:node2.hiibm.com
#####===>其实这个脚本就是告诉k8s,生成pod的时候不要生成到node2.hiibm.com这台主机上。
#####===>至于参数kubeernetes.io/hostname是什么意思?可以通过命令kubectl get node --show-labels看到

3.生成pod,看看容器在哪个节点上
经多次测试,pod实在生成到了node1节点上,死活不在node2上生成,说明节点亲和性的NotIn起了作用。

kubectl create -f a1-affinity-pod.yaml
kubectl get pod -owide

kubernetes(k8s)-31之节点亲和性affinity_第1张图片

四、kubernetes(k8s)硬亲和性In

1.在master节点上创建硬亲和性In的yaml文件
注释:这里和上面的NotIn不同的地方只有参数operator这里改成了In。最终意思是让本pod必须生成在node2上,如果node2.hiibm.com不存在,那pod根本就不会在任何节点上生成,这就是硬策略,必须满足条件。

[root@master qinhe]# cat a2-affinity-pod-in.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity
    image: harbor.hiibm.com/public/xnginx:v1.5.20200306
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - node2.hiibm.com

2.使用配置文件生成pod,检验亲和性In是否生效
(啰嗦:因为我们是拷贝上面的配置文件,生成本pod前,请把上一个pod给删掉kubectl delete pod affinity)

kubectl create -f a2-affinity-pod-in.yaml
kubectl get pod -owide

kubernetes(k8s)-31之节点亲和性affinity_第2张图片

五、kubernetes(k8s)软亲和性In

1.在master节点上创建软亲和性的in配置yaml

[root@master qinhe]# vi a4-affinity-pod-preferred-in.yaml
apiVersion: v1
kind: Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity
    image: harbor.hiibm.com/public/xnginx:v1.5.20200306
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - node3.hiibm.com

2.注释

apiVersion: v1
kind: Pod                       #==>类型Pod
metadata:
  name: affinity
  labels:
    app: node-affinity-pod
spec:
  containers:
  - name: with-node-affinity                     #==>容器名
    image: harbor.hiibm.com/public/xnginx:v1.5.20200306           #==>镜像
  affinity:                                      #==>亲和性
    nodeAffinity:                                #==>node类型的亲和性
      preferredDuringSchedulingIgnoredDuringExecution:            #==>软亲和性
      - weight: 1                                #==>亲和性权重1,(可以有多个亲和性条件,权重越大的就越优先)
        preference:
          matchExpressions:
          - key: kubernetes.io/hostname          #==>亲和性匹配主机名
            operator: In                         #==>亲和性条件In包含
            values:
            - node3.hiibm.com                    #==>亲和性条件是主机名需是node3.hiibm.com
#==>prefrred是软亲和性( required是硬亲和性),本例的意思是,期望pod建立在node3节点服务器上,注意是“期望”字眼,不是必须哈,即如果node3故障了或者不存在,那么可以将pod建在其他任意可用节点上。(而上面第四个例子的硬亲和性in是必须满足,否则就不创建)

3.使用k8s软亲和性yaml文件生成pod,并检验结果
(啰嗦:先将之前测试的pod删掉,以免pod重名。kubectl delete pod affinity)

kubectl create -f a4-affinity-pod-preferred-in.yaml
kubectl get all -owide

kubernetes(k8s)-31之节点亲和性affinity_第3张图片

六、kubernetes(k8s)Pod亲和性(podAffinit)

1.为了测试效果,先做一个普通的pod

[root@master qinhe]# vim b1-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: xnode1
  labels:
    app: xnode1
spec:
  containers:
  - name: with-node-affinity
    image: harbor.hiibm.com/public/xnginx:v1.5.20200306

注释:
注意等会我们要用到标签labels,记住这里标签的key叫app,键值叫xnode1。
kubernetes(k8s)-31之节点亲和性affinity_第4张图片

2.查看刚才创建的普通pod的标签labels

 kubectl get pod --show-labels

3.创建一个pod亲和性配置文件

[root@master qinhe]# vim b2-podAffinity.yaml
apiVersion: v1
kind: Pod
metadata:
  name: xpod7node1
  labels:
    app: xpod7node1
spec:
  containers:
  - name: xpod7node1
    image: harbor.hiibm.com/public/xnginx:v1.5.20200306
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - xnode1
        topologyKey: kubernetes.io/hostname

注释:
podAffinity: ------------>pod亲和性
requiredDuringSchedulingIgnoredDuringExecution:-------------->硬亲和性
- labelSelector:------->亲和条件用标签选择器
- key: app------->亲和性匹配的key是app
operator: In-------->亲和条件是包含
- xnode1------->亲和条件app的值必须是xnode1
topologyKey: kubernetes.io/hostname ------->还有个条件必须和已有的即将匹配的那个pod在一个主机里(kubernetes.io/hostname是主机名的意思)
kubernetes(k8s)-31之节点亲和性affinity_第5张图片

4.执行生成pod亲和性配置文件,并验证pod亲和性

kubectl create -f b2-podAffinity.yaml
kubectl get pod -owide

kubernetes(k8s)-31之节点亲和性affinity_第6张图片

5.关于拓扑域
???纳尼?什么叫拓扑域,拓扑域指的是逻辑上的具有相同属性值的所有K8s节点服务器都叫一个拓扑域。
刚才的例子我们使用了主机名当拓扑域,自然的一个主机名是不可能重复的,所以一个主机即一个拓扑域。
再假定,是假如啊,目前有3个node节点服务器,其中有两个节点服务器的,kubernetes.io/arch=amd64,第三个的,kubernetes.io/arch=amd32,那么此时前两个节点服务器就是同一个拓扑域(但当当前pod亲和性用到这个,kubernetes.io属性当拓扑域条件时)

七、kubernetes(k8s)Pod反亲和性(podAnitAffinit)

1.先删除掉所有多余的pod,以免影响测试。kubectl delete pod xpod7node1或有把握的话就Kubectl delete pod --all

2.(啰嗦和六一样,还启动那个测试的pod) kubectl create -f b1-pod.yaml  (文件在第六条上有,这里不重复了)
可以看到这个普通的pod生成在了node2.hiibm.com服务器上。

3.创建Pod反亲和性podAntiAffinity的配置文件
之前的是podAffinity,现在的是podAntiAffinity。
现在所有条件都必须不能满足才可以。

[root@master qinhe]# vim b3-podAntiAffinity.yaml
apiVersion: v1
kind: Pod
metadata:
  name: xpod7node1
  labels:
    app: xpod7node1
spec:
  containers:
  - name: xpod7node1
    image: harbor.hiibm.com/public/xnginx:v1.5.20200306
  affinity:
    podAntiAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - xnode1
        topologyKey: kubernetes.io/hostname

注释:反亲和性和亲和性相比,参数就多了个Anti
kubernetes(k8s)-31之节点亲和性affinity_第7张图片

4.执行生成反亲和性,并验证反亲和性

kubectl create -f b3-podAntiAffinity.yaml
kubectl get pod -owide

kubernetes(k8s)-31之节点亲和性affinity_第8张图片

八、亲和性/反亲和性调度策略对比

kubernetes(k8s)-31之节点亲和性affinity_第9张图片

------------------------------------END----2020年3月8日23:11:23----------------------------------------------------
老铁随意支持一把,3q
kubernetes(k8s)-31之节点亲和性affinity_第10张图片

不支持的话,如果对你有帮助老铁你也双击666

你可能感兴趣的:(K8S)