目录:

  • 一.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污点的处理相关推荐

  1. Kubernetes K8S之Taints污点与Tolerations容忍详解

    Kubernetes K8S之Taints污点与Tolerations容忍详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master C ...

  2. k8s(八)—调度因素(nodeName、nodeSelector、亲和与反亲和、Taints 污点)、影响pod调度的指令

    1 调度简介 [root@server2 ~]# kubectl get pod -n kube-system 2 影响kubernetes调度的因素 2.1 nodeName(针对节点) [root ...

  3. Kubernetes调度器-Pod分配给节点(node-pod亲和性、固定节点)

    1.需求 约束一个Pod只能在特定的 Node(s)上运行,或者优先运行在特定的节点上.有几种方法可以实现这点,推荐的方法都是用标签选择器来进行选择.通常这样的约束不是必须的,因为调度器将自动进行合理 ...

  4. CC00212.CloudKubernetes——|KuberNetes高级调度.V15|——|Pod亲和力反亲和力.v03|pod反亲和力|

    一.Pod的反亲和力: ### --- 编辑yaml文件:编写pod的反亲和力的参数 ~~~ # 编辑yaml文件 ~~~ 就是尽量不和namespace下的kube-system,key:k8s-a ...

  5. Kubernetes调度器-Pod分配给节点(Taint污点和Toleration容忍)

    Taint和Toleration 节点亲和性是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点.Taint则相反,它使节点能够排斥一类特定的pod. Taint和toleratio ...

  6. Kubernetes调度之亲和性和反亲和性

    背景 Kubernetes中的调度策略可以大致分为两种,一种是全局的调度策略,要在启动调度器时配置,包括kubernetes调度器自带的各种predicates和priorities算法:另一种是运行 ...

  7. Kubernetes Pod调度进阶:Taints(污点)和Tolerations(容忍)

    [注意]最后更新于 2 years ago,文中内容可能已过时,请谨慎使用. 污点(Taint)和容忍(Toleration)是从Kubernetes 1.6开始提供的高级调度功能. 在Kuberne ...

  8. Kubernetes 调度器nodeSelector,nodeName 固定节点

    前面已经说了调度的亲和性,其实都比较含蓄,比如软硬亲和性,污点和容忍. 固定节点就比较粗暴了,可以通过节点名称去选择,也可以通过节点的标签去选择,固定在某个节点上运行.这就是所谓固定节点的调度. 固定 ...

  9. 从零开始入门 K8s | Kubernetes 调度和资源管理

    作者 | 子誉  蚂蚁金服高级技术专家 关注"阿里巴巴云原生"公众号,回复关键词**"入门"**,即可下载从零入门 K8s 系列文章 PPT. Kubernet ...

最新文章

  1. Element-ui表格选中回显
  2. 互联网与大数据将成为智能制造的基石
  3. git add多个文件_Git之旅② - 子命令与设计哲学
  4. 学习使用bilstm_crf_model出现的bug
  5. 高可用Eureka注册中心配置说明(双机部署)
  6. Linux安装JDK1.6 rpm.bin格式的安装配置
  7. Visual FoxPro权威指南pdf
  8. 安装及使用RSSHub
  9. 【精品软件】WeGo(微博PPC客户端) Release Note (更新至v1.05 Build20110117)
  10. CIKM2022推荐系统论文集锦
  11. 常见专业术语名词解释(持续更新)
  12. 相干解调与非相干解调
  13. “操作必须使用一个可更新的查询”故障解决
  14. 如何规划好自己的读博生涯
  15. Yii2的Gii应用
  16. ftp服务器怎么用,3步完成ftp的安装与使用
  17. MVC+EF+LayUI框架的应用-徐新帅-专题视频课程
  18. spring boot集成javacv + websocket实现实时视频推流回放(延时1-2秒)
  19. 服务器被入侵网页后门,谨防“网页后门”,浅谈Webshell入侵网站的原理和预防措施...
  20. 中国医科大学2021年9月《肿瘤护理学》作业考核试题

热门文章

  1. latex如何使文字不空格_latex 段开头不空格
  2. PMP——第3章 项目经理的角色
  3. STL--C++中 destory() 和deallocate()以及delete函数的相关性和区别性,destorydeallocate
  4. Linux进程间通信编程
  5. 内容推荐场景中自监督学习的应用
  6. 收藏一个快要消亡的技术古董
  7. 自动复制吱口令html,js随机复制多吱口令代码
  8. 【广告架构day2】新浪广告系统架构的演进之路:服务化改造
  9. HashMap为什么用红黑树而不用跳表?redis的zset为什么用跳表而不用红黑树?
  10. 静态路由的配置 简单实验图解