k8s中的亲和性、污点与容忍(调度到不同的宿主机)
本文章并未经过严格实践,如有错误,辛苦指出。
背景
服务需要多副本,来保证高可靠、多活。
那么问题来了,假如这些副本都在同一个宿主机上,或者同一个交换机下…宿主机、交换机其中一项坏掉了,那多副本还有什么意义?
怎么解决呢?需要用到k8s中的亲和性和反亲和性。将容器调度到不同的宿主机即可。
nodeSelector标签实践:Pod只能调度到某些node上
背景:如某些服务对磁盘读写要求很高,则需要调度到SSD或nvme硬盘的宿主机上。
示例:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd
解释:
- 通过nodeSelector指定label标签,pod将会只调度到具有该标签的node之上。
affinity标签:软要求和硬要求
可以把亲和性分成软要求和硬要求。
硬要求的意思是:必须满足这些要求,否则就会调度失败。Pod无法启动。
软要求的意思是:应当优先满足这些要求,如果满足不了,不作强求,Pod可以正常启动。比如前面说的固态硬盘要求。
| 标签 | 解释 |
|---|---|
| podAffinity | Pod亲和性 |
| podAntiAffinity | Pod反亲和性 |
| nodeAffinity | Node亲和性 |
| requiredDuringSchedulingIgnoredDuringExecution | 硬要求 |
| preferredDuringSchedulingIgnoredDuringExecution | 软要求 |
示例:
作用:Pod的3个副本不能再同一个宿主机上
apiVersion: apps/v1beta1 # for versions before 1.6.0 use extensions/v1beta1
kind: Deployment
metadata:
name: redis-cache
spec:
replicas: 3
template:
metadata:
labels:
app: store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- store
topologyKey: "kubernetes.io/hostname"
containers:
- name: redis-server
image: redis:3.2-alpine
解释:
- podAntiAffinity表示Pod反亲和性
- requiredDuringSchedulingIgnoredDuringExecution是硬要求。
- 标签选择器匹配了key:value为app:store的宿主机,同时该Pod存在一个标签就是app:store。所以,该Pod的3个副本不能在同一个宿主机上。
污点taint与容忍tolerations
前面提到的nodeAffinity是Node亲和性,表示希望调度都某些宿主机上。
相反,污点和容忍可以让Pod不调度到某些有污点的宿主机上,但Pod可以容忍这些污点宿主。
官方文档:https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
污点taint
给Node设置污点:
kubectl taint nodes node1 key1=value1:NoSchedule #给宿主机node1设置了key1=value1的污点,策略是NoSchedule
| 关键词 | 作用 |
|---|---|
| NoSchedule | Pod不会被调度到此宿主机,除非该Pod容忍 |
| PreferNoSchedule | NoSchedule 的软策略版本,表示尽量不调度到污点节点上去 |
| NoExecute | 一旦设置NoExecute,不容忍NoExecute的Pod将会被驱逐到其他宿主机上去 |
NoExecute和NoSchedule的区别:
- NoSchedule只是不调度,但并不影响已经调度好的容器,即使给宿主机新增了污点,这些Pod依然会正常运行。同样PreferNoSchedule也是。
- NoExecute就不一样了,会将Pod驱逐到其他宿主,除非该Pod容忍。
其他关于污点的操作:
#删除污点:
kubectl taint nodes node1 key1=value1:NoSchedule- #在后面加一个减号表示删除
#查询污点:
kubectl describe nodes server1 |grep Taints
容忍tolerations
表示该Pod可以容忍某些污点宿主机。
示例:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
解释:
- 上述示例的意思是:可以调度到key1=value1的宿主机上。
- operator可以设置为Equal、Exists。其中Equal需要设置value,Exists省略value(官网是这样的)。
- operator可以省略,默认值是Equal。
- key和value可以同时省略,表示匹配所有污点。这样就能调度到所有有污点的宿主了。
- effect可以省略,表示匹配所有,包括NoSchedule、PreferNoSchedule等。
- 如果effect容忍的是NoExecute,可以设置容忍时间
tolerationSeconds: 3600。超过了容忍时间还是会被驱逐。
参考文档:
https://blog.csdn.net/BIGmustang/article/details/109391323
https://www.cnblogs.com/sxgaofeng/p/13188723.html
https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/
https://blog.csdn.net/zwqjoy/article/details/90669857
“京城郭少”
k8s中的亲和性、污点与容忍(调度到不同的宿主机)的更多相关文章
- Kubernetes 的亲和性污点与容忍
写在前面 我们在使用k8s过程中经常有这样的需求:我的k8s集群有多台服务器,配置不尽相同.我想把数据库部署到CPU.内存比较好的这几台机:我想把静态承载服务部署到有固态硬盘的机器等:而这些需求,就是 ...
- VMware虚拟机中centos6.5网络配置(桥接方式)与宿主机之间通信
1.修改网络适配器 2.选择桥接所用的网卡 3.设置网络 3.1在系统终端中输入 setup ,进行图形网络配置(此命令只有redhat系列才有作用) 上下左右键选择,enter键确定 将光标移动到U ...
- Kubernetes的污点和容忍(上篇)
背景 搭建了一个k8s(Kubernetes)的事件监听服务,监听事件之后对数据做处理.有天报了一个问题经调查是新版本的k8s集群添加会把unschedule等信息通过污点的方式反映.而这些污点是只有 ...
- K8S中pod和container的资源管理:CPU和Memory
K8S中创建pod时,可以显示地指明包含的container的资源需求(resouce request和resource limit),通常是CPU和Memory(RAM). kube-schedul ...
- 如何配置 VirtualBox 中的客户机与宿主机之间的网络连接
如何配置 VirtualBox 中的客户机与宿主机之间的网络连接 作者: Aaron Kili 译者: LCTT rusking | 2017-03-01 13:40 评论: 3 收藏: 3 当你 ...
- 009.kubernets的调度系统之污点和容忍
Taints和Tolerations(污点和容忍) Taint需要与Toleration配合使用,让pod避开那些不合适的node.在node上设置一个或多个Taint后,除非pod明确声明能够容忍这 ...
- Kubernetes 调度 - 污点和容忍度详解
当我们使用节点亲和力(Pod 的一个属性)时,它会将Pod吸引到一组节点(作为偏好或硬性要求).污点的行为完全相反,它们允许一个节点排斥一组 Pod. 在 Kubernetes 中,您可以标记(污染) ...
- kubernetes(k8s)Pod污点与容忍
污点(taints)与容忍(tolerations) 对于nodeAffinity无论是硬策略还是软策略方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taint ...
- kubernetes (k8s) CKA认证之第二课:亲和性与 Pod 的调度
手动调度一个 pod // cat manual-schedule.yaml apiVersion: v1 kind: Pod metadata: labels: run: pod-manual-sc ...
- Kubernetes K8S之固定节点nodeName和nodeSelector调度详解
Kubernetes K8S之固定节点nodeName和nodeSelector调度详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-mas ...
随机推荐
- WPF 修复引用库报错 所使用的 PresentationFramework 6
本文记录一个 WPF 构建的坑,这是 WPF 仓库的运维管理大意挖的坑.将会在大家使用低版本的 dotnet 6 如 6.0.1 版本时,引用其他人使用高 dotnet 6 版本,如 dotnet 6 ...
- WPF 点击按钮时更改按钮样式界面效果的 XAML 实现方法
在 WPF 中按钮 Button 将会吃掉路由事件,此时的 EventTrigger 如果通过 RoutedEvent 是 MouseLeftButtonDown 那么将会拿不到路由事件,也就触发不了 ...
- 通过 KoP 将 Kafka 应用迁移到 Pulsar
通过 KoP 将 Kafka 应用迁移到 Pulsar 版权声明:原文出自 https://github.com/streamnative/kop ,由 Redisant 进行整理和翻译 目录 通过 ...
- 让 KEPServer 变成一款 Web 组态软件
KEPServerEX是行业领先的连接平台,用于向您的所有应用程序提供单一来源的工业自动化数据.该平台的设计使用户能够通过一个直观的用户界面来连接.管理.监视和控制不同的自动化设备和软件应用程序. ...
- SAP集成技术(十三)SAP Cloud Integration
异构应用环境给IT带来了各种问题.在这种情况下,混合集成环境尤其受到影响.同时,对于建立在混合IT环境上的数字化转型项目,数据集成和跨系统访问已经开始发挥核心作用.为了满足不断增长的需求,SAP Bu ...
- Solution Set - 矩阵加速
A[HDU2604]求不含子串010和000的,长为\(n\)的01序列数. B[HDU6470]数列\(\{a_n\}:a_1=1,a_2=2,a_n=a_{n-1}+2a_{n-2}+n^3\), ...
- 如何使用Tushare+ Backtrader进行股票量化策略回测
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 典型股票量化回测流程 典型的股票量化策略回测流程包括以下几个步骤: 数据获取:首先需要获取所需的股票市场 ...
- uni-app移动端开发中ios/安卓--坑和经验总结
1. ios new时间对象,需要用逗号隔开传日期的方式, 不支持 new Date('2019-03-01 08:00:00') 格式: 支持以下两种方式: 2. ios个别版本对fixed的属性的 ...
- Vue的Vue-ls使用
Vue插件,用于从Vue上下文中使用本地Storage,会话Storage和内存Storage 1. 安装 NPM npm install vue-ls --save YARN yarn add vu ...
- C#实现多线程的几种方式
前言 多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制.多线程适用于需要提高系统并发性.吞吐量和响应速度的场景,可以充分利用多核处理器和系统资源,提高应用程序的性能和效率. ...