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 ...
随机推荐
- [PHP] 浅谈 Laravel auth:api 不同驱动 token 和 passport 的区别
token 驱动使用 TokenGuard 用传递的值去用户表中查询 member_token 字段的值,看是否有匹配的. 服务端需要在用户表 member_token 字段中存储 access_to ...
- LVGL SCROLL循环滚动
一.案例测试 这里我使用LVGL的版本是8.3.3 运行案例 lvgl_examples\scroll\lv_example_scroll_6 效果如下所示 二.现象 这里先描述一下现象,当我们使用 ...
- 使用 Docker 自建一款怀旧游戏之 - 扫雷
1)扫雷 简介 扫雷 是一种经典的单人电脑游戏,最初由微软公司在 1990 年代开发并内置在 Windows 操作系统中.游戏的目标是在一个由方块组成的网格上揭开所有非地雷的方块,而不触发地雷.每个方 ...
- Linux 开启防火墙端口策略
1. 安装防火墙 yum install firewalld systemd -y 2. 手动开放防火墙端口 查看防火墙全部设置 firewall-cmd --list-all 若防火墙服务未启动可执 ...
- fastposter v2.8.0 发布 电商海报编辑器
fastposter v2.8.0 发布 电商海报编辑器 fastposter海报生成器,电商海报编辑器,电商海报设计器,fast快速生成海报 海报制作 海报开发.二维码海报,图片海报,分享海报,二维 ...
- 使用DP-Modeler、ModelFun模方软件修复实景三维模型教程
P-Modeler DP-Modeler是武汉天际航自主研发的一款集精细化单体建模与Mesh网格模型修饰于一体的软件.支持三维模型一键水面修复.道路置平.建筑局部修饰.删除底部碎片.植被处理.桥隧 ...
- MATLAB txt文件抽稀并分为多个txt文件
chouxi.m a = load("file.txt"); % len = length(a); interval = 9;%间隔+1 b = a(1:interval:end, ...
- uniapp video组件全屏导致页面横竖错乱问题
uniapp video组件全屏导致页面横竖错乱问题 背景介绍 使用 video组件做一个视频播放功能,不全屏的情况正常.在苹果手机上全屏后,点击左上角退出全屏,页面出现问题如下图问题,主要系统iOS ...
- 构建自定义镜像并优化dockerfile文件
目录 一.系统环境 二.前言 三.镜像构建步骤 四.dockerfile文件常用指令 4.1 dockerfile文件常用指令 4.2 RUN.CMD.ENTRYPOINT的区别 五.构建centos ...
- redis 的下载与安装
下载地址:https://github.com/MicrosoftArchive/redis/releases 选择免安装包: 解压到路径 D:\Redis-x64-3.0.504 用管理员权限打开 ...