一、目标
学习掌握什么是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)硬亲和性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)软亲和性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)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。
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是主机名的意思)
4.执行生成pod亲和性配置文件,并验证pod亲和性
kubectl create -f b2-podAffinity.yaml
kubectl get pod -owide
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
4.执行生成反亲和性,并验证反亲和性
kubectl create -f b3-podAntiAffinity.yaml
kubectl get pod -owide
八、亲和性/反亲和性调度策略对比
------------------------------------END----2020年3月8日23:11:23----------------------------------------------------
老铁随意支持一把,3q
不支持的话,如果对你有帮助老铁你也双击666