Kubernetes-调度、节点亲和反亲和、pod亲和反亲和、Taints污点的处理
目录:
- 一.kubernetes调度介绍
- 二.nodename节点选择约束
- 三.nodeSelector 亲和
- 1.节点亲和
- 2.节点反亲和
- 1. pod亲和
- 2.pod反亲和
- 四.Taints(污点)
- 1 .Nodename可以无视任何污点
- 2. 测试标签能否无视污点
- 3. 添加容忍
- 4. NoSchedule
- 5.NoExecute
- 6. cordon、drain、delete
- 7. 添加新的集群node
一.kubernetes调度介绍
调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。
kube-scheduler 是 Kubernetes 集群的默认调度器,并且是集群控制面的一部分。如果你真的希望或者有这方面的需求,kube-scheduler 在设计上是允许你自己写一个调度组件并替换原有的 kube-scheduler。
在做调度决定时需要考虑的因素包括:单独和整体的资源请求、硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间的干扰等等。
默认策略可以参考:https://kubernetes.io/zh/docs/concepts/scheduling/kube-scheduler/
二.nodename节点选择约束
nodeName 是节点选择约束的最简单方法,但一般不推荐。如果 nodeName 在 PodSpec 中指定了,则它优先于其他的节点选择方法。
使用 nodeName 来选择节点的一些限制:
如果指定的节点不存在。
如果指定的节点没有资源来容纳 pod,则pod 调度失败。
云环境中的节点名称并非总是可预测或稳定的。
三.nodeSelector 亲和
nodeSelector 是节点选择约束的最简单推荐形式。给选择的节点添加标签,通过标签来进行调度。
1.节点亲和
创建目录并,编写资源清单
mdir schedu
cd schedu/
vim pod.yamlapiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentnodeSelector:disktype: ssd
执行pod.yaml清单,查看pod节点:
kubectl apply -f pod.yaml
kubectl get pod
我们发现pod节点处于Pending状态,是因为未给任何node节点添加标签!
添加标签后,查看pod节点状态
kubectl label nodes server3 disktype=ssd
kubectl get pod -o wide
删除标签之后发现pod节点还在运行
为什么?
因为节点已经生效了!
kubectl label nodes server3 disktype-
kubectl get node --show-labels
完成实验后删除节点pod
kubectl delete -f pod.yaml
节点亲和性pod示例
vim pod1.yamlapiVersion: v1
kind: Pod
metadata:name: node-affinity
spec:containers:- name: nginximage: nginxaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution: #必须满足nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- server3- server4preferredDuringSchedulingIgnoredDuringExecution: #倾向满足- weight: 1preference:matchExpressions:- key: disktypeoperator: Invalues:- ssd
执行pod1.yaml清单,查看pod节点的信息:
kubectl apply -f pod1.yaml
kubectl get pod -o wide
发现亲和到server4
然后注释掉倾向满足,再次执行清单,查看节点信息:
vim pod1.yaml#- weight: 1# preference:# matchExpressions:# - key: disktype# operator: In# values:# - ssd
kubectl delete -f pod1.yaml
kubectl apply -f pod1.yaml
kubectl get pod -o wide
发现还在server4上:
为server3添加标签ssd,删除节点重启拉起容器,服务亲和到server3
kubectl delete -f pod1.yaml
kubectl label nodes server3 disktype=ssd
kubectl apply -f pod1.yaml
kubectl get pod -o wide
2.节点反亲和
注意:节点反亲和只需要将参数
operator: NotIn
1. pod亲和
删除前面实验的pod1.yaml
kubectl delete -f pod1.yaml
pod亲和,mysql容器亲和nginx pod
注意使用的mysql镜像版本为 image: mysql:5.7
vim pod2.yamlapiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx---
apiVersion: v1
kind: Pod
metadata:name: mysqllabels:app: mysql
spec:containers:- name: mysqlimage: mysql:5.7env:- name: "MYSQL_ROOT_PASSWORD"value: "westos"affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginxtopologyKey: kubernetes.io/hostname
执行清单pod2.yaml,查看信息
kubectl apply -f pod2.yaml
kubectl get pod -o wide
可以看到mysql与nginx在同一个node节点server4上部署
2.pod反亲和
只需要将参数修改一下即可变为反亲和:
vim pod2.yamlpodAntiAffinity:
删除节点,重新执行pod2.yaml文件,查看信息:
kubectl delete -f pod2.yaml
kubectl apply -f pod2.yaml
kubectl get pod -o wide
我们可以看到mysql节点并不在nginx服务的同个节点上,实现服务与数据分离。
四.Taints(污点)
NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上,而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod。
Taints(污点)是Node的一个属性,设置了Taints后,所以Kubernetes是不会将Pod调度到这个Node上的。
于是Kubernetes就给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去。
可以使用命令 kubectl taint 给节点增加一个 taint:
$ kubectl taint nodes node1 key=value:NoSchedule //创建
$ kubectl describe nodes server1 |grep Taints //查询
$ kubectl taint nodes node1 key:NoSchedule- //删除
其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]
NoSchedule:POD 不会被调度到标记为 taints 节点。
PreferNoSchedule:NoSchedule 的软策略版本。
NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 POD 没有对应 Tolerate 设置,会直接被逐出。
如Kubernetes集群主机,就是被设置了污点,因此一般部署pod时候不选择该节点为部署节点
matser的污点 的信息为:
kubectl describe nodes server2 | grep Taints
Taints: node-role.kubernetes.io/master:NoSchedule
1 .Nodename可以无视任何污点
本来server2是不加入集群的,我们现在设置让他加入集群中!
我们来测试:
vim pod.yamlapiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentnodeName: server2
删除之前实验的pod节点
执行 pod.yaml清单,查看pod节点信息:
kubectl apply -f pod.yaml
kubectl get pod -o wide
可以看到已经部署在server2上,说明nodename可以掩盖污点
2. 测试标签能否无视污点
为server2设置标签,使用标签方式测试污点
kubectl label nodes server2 roles=master
kubectl get nodes --show-labels
编辑资源清单,使用标签方式选择node
vim pod.yamlroles: master
再次运行pod.yaml文件,发现pod节点不能成功running
kubectl apply -f pod.yaml
kubectl get pod -o widekubectl delete -f pod.yaml #测试之后,删掉
测试证明,标签选择无法覆盖污点。只有Nodename可以无视任何污点
3. 添加容忍
vim pod.yamltolerations:- operator: "Exists"effect: "NoSchedule"
再次执行清单,可以看到调度到了server2上,说明容忍生效!
kubectl apply -f pod.yaml
kubectl get pod -o wide
4. NoSchedule
手动给server3添加污点:
NoSchedule:POD 不会被调度到标记为 taints 节点。
kubectl delete -f pod.yamlkubectl taint nodes server3 key=value:NoSchedulekubectl describe nodes server3|grep Taint
然后将清单中的 角色和容忍先注释掉:
# nodeSelector:# roles: master# tolerations:# - operator: "Exists"# effect: "NoSchedule"
重新执行清单,查看pod节点!
kubectl apply -f pod.yaml
kubectl get pod -o wide测试之后删除节点
kubectl delete -f pod.yaml
可以看到只会调度到server4上!
再次将pod.yaml中的容忍和角色取消注释,更改为disktype
vim pod.yamlnodeSelector:disktype: ssdtolerations:- operator: "Exists"effect: "NoSchedule"
可以想象,会调度到server3,因为和server3的标签保持一致!
kubectl apply -f pod.yaml
kubectl get pod
kubectl get pod -o wide
5.NoExecute
去掉server3的NoSchedule的值
添加NoExecute:
该选项意味着一旦 Taint 生效,如该节点内正在运行的 POD 没有对应 Tolerate 设置,会直接被逐出。被驱逐到其他node节点。
kubectl taint node server3 key:NoSchedule-kubectl taint nodes server3 key=value:NoExecute
查看节点pod信息,过一会server3就会自动被驱逐,需要等待一段时间:
kubectl get pod -o wide
可以在server3上查看docker进程,之前拉取得镜像都没了,只剩下k8s集群所必须的镜像了!!!
docker ps
测试完成,取消NoExecute的值
kubectl taint nodes server3 key:NoExecute-
6. cordon、drain、delete
关闭server3的集群调度:
kubectl cordon server3
kubectl get node
可以看到server3状态变化了!
重新调度server3!
kubectl uncordon server3
kubectl get node
关闭server3的调度,但不关闭部分必要pod
kubectl drain server3 --ignore-daemonsets
kubectl get node
直接删除掉节点server3
kubectl delete node server3
那么问题来了?
怎么将server3重新加入调度node节点呢??
只需要在server3上重启kubelet服务即可!
systemctl restart kubelet
可以看到server3又加入集群中了:
kubectl get node
7. 添加新的集群node
因为token只会存在23小时,所以需要重新创建
kubeadm token create
kubeadm token list
还需要token-cert-hash:
这个值不会变化,查出来即可!
openssl x509 -pubky -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubinoutform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
然后用下述指令加入集群即可!!
kubeadm join 172.25.0.2:6443 --token ******** --discovery-token-ca-cert-hash sha256:*******************![请添加图片描述](https://img-blog.csdnimg.cn/69828dc828b148ff973ffa21d2bad116.png)
Kubernetes-调度、节点亲和反亲和、pod亲和反亲和、Taints污点的处理相关推荐
- Kubernetes K8S之Taints污点与Tolerations容忍详解
Kubernetes K8S之Taints污点与Tolerations容忍详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master C ...
- k8s(八)—调度因素(nodeName、nodeSelector、亲和与反亲和、Taints 污点)、影响pod调度的指令
1 调度简介 [root@server2 ~]# kubectl get pod -n kube-system 2 影响kubernetes调度的因素 2.1 nodeName(针对节点) [root ...
- Kubernetes调度器-Pod分配给节点(node-pod亲和性、固定节点)
1.需求 约束一个Pod只能在特定的 Node(s)上运行,或者优先运行在特定的节点上.有几种方法可以实现这点,推荐的方法都是用标签选择器来进行选择.通常这样的约束不是必须的,因为调度器将自动进行合理 ...
- CC00212.CloudKubernetes——|KuberNetes高级调度.V15|——|Pod亲和力反亲和力.v03|pod反亲和力|
一.Pod的反亲和力: ### --- 编辑yaml文件:编写pod的反亲和力的参数 ~~~ # 编辑yaml文件 ~~~ 就是尽量不和namespace下的kube-system,key:k8s-a ...
- Kubernetes调度器-Pod分配给节点(Taint污点和Toleration容忍)
Taint和Toleration 节点亲和性是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点.Taint则相反,它使节点能够排斥一类特定的pod. Taint和toleratio ...
- Kubernetes调度之亲和性和反亲和性
背景 Kubernetes中的调度策略可以大致分为两种,一种是全局的调度策略,要在启动调度器时配置,包括kubernetes调度器自带的各种predicates和priorities算法:另一种是运行 ...
- Kubernetes Pod调度进阶:Taints(污点)和Tolerations(容忍)
[注意]最后更新于 2 years ago,文中内容可能已过时,请谨慎使用. 污点(Taint)和容忍(Toleration)是从Kubernetes 1.6开始提供的高级调度功能. 在Kuberne ...
- Kubernetes 调度器nodeSelector,nodeName 固定节点
前面已经说了调度的亲和性,其实都比较含蓄,比如软硬亲和性,污点和容忍. 固定节点就比较粗暴了,可以通过节点名称去选择,也可以通过节点的标签去选择,固定在某个节点上运行.这就是所谓固定节点的调度. 固定 ...
- 从零开始入门 K8s | Kubernetes 调度和资源管理
作者 | 子誉 蚂蚁金服高级技术专家 关注"阿里巴巴云原生"公众号,回复关键词**"入门"**,即可下载从零入门 K8s 系列文章 PPT. Kubernet ...
最新文章
- Element-ui表格选中回显
- 互联网与大数据将成为智能制造的基石
- git add多个文件_Git之旅② - 子命令与设计哲学
- 学习使用bilstm_crf_model出现的bug
- 高可用Eureka注册中心配置说明(双机部署)
- Linux安装JDK1.6 rpm.bin格式的安装配置
- Visual FoxPro权威指南pdf
- 安装及使用RSSHub
- 【精品软件】WeGo(微博PPC客户端) Release Note (更新至v1.05 Build20110117)
- CIKM2022推荐系统论文集锦
- 常见专业术语名词解释(持续更新)
- 相干解调与非相干解调
- “操作必须使用一个可更新的查询”故障解决
- 如何规划好自己的读博生涯
- Yii2的Gii应用
- ftp服务器怎么用,3步完成ftp的安装与使用
- MVC+EF+LayUI框架的应用-徐新帅-专题视频课程
- spring boot集成javacv + websocket实现实时视频推流回放(延时1-2秒)
- 服务器被入侵网页后门,谨防“网页后门”,浅谈Webshell入侵网站的原理和预防措施...
- 中国医科大学2021年9月《肿瘤护理学》作业考核试题
热门文章
- latex如何使文字不空格_latex 段开头不空格
- PMP——第3章 项目经理的角色
- STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate
- Linux进程间通信编程
- 内容推荐场景中自监督学习的应用
- 收藏一个快要消亡的技术古董
- 自动复制吱口令html,js随机复制多吱口令代码
- 【广告架构day2】新浪广告系统架构的演进之路:服务化改造
- HashMap为什么用红黑树而不用跳表?redis的zset为什么用跳表而不用红黑树?
- 静态路由的配置 简单实验图解