本文章并未经过严格实践,如有错误,辛苦指出。

背景

服务需要多副本,来保证高可靠、多活。
那么问题来了,假如这些副本都在同一个宿主机上,或者同一个交换机下…宿主机、交换机其中一项坏掉了,那多副本还有什么意义?
怎么解决呢?需要用到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中的亲和性、污点与容忍(调度到不同的宿主机)的更多相关文章

  1. Kubernetes 的亲和性污点与容忍

    写在前面 我们在使用k8s过程中经常有这样的需求:我的k8s集群有多台服务器,配置不尽相同.我想把数据库部署到CPU.内存比较好的这几台机:我想把静态承载服务部署到有固态硬盘的机器等:而这些需求,就是 ...

  2. VMware虚拟机中centos6.5网络配置(桥接方式)与宿主机之间通信

    1.修改网络适配器 2.选择桥接所用的网卡 3.设置网络 3.1在系统终端中输入 setup ,进行图形网络配置(此命令只有redhat系列才有作用) 上下左右键选择,enter键确定 将光标移动到U ...

  3. Kubernetes的污点和容忍(上篇)

    背景 搭建了一个k8s(Kubernetes)的事件监听服务,监听事件之后对数据做处理.有天报了一个问题经调查是新版本的k8s集群添加会把unschedule等信息通过污点的方式反映.而这些污点是只有 ...

  4. K8S中pod和container的资源管理:CPU和Memory

    K8S中创建pod时,可以显示地指明包含的container的资源需求(resouce request和resource limit),通常是CPU和Memory(RAM). kube-schedul ...

  5. 如何配置 VirtualBox 中的客户机与宿主机之间的网络连接

    如何配置 VirtualBox 中的客户机与宿主机之间的网络连接 作者: Aaron Kili 译者: LCTT rusking | 2017-03-01 13:40   评论: 3 收藏: 3 当你 ...

  6. 009.kubernets的调度系统之污点和容忍

    Taints和Tolerations(污点和容忍) Taint需要与Toleration配合使用,让pod避开那些不合适的node.在node上设置一个或多个Taint后,除非pod明确声明能够容忍这 ...

  7. Kubernetes 调度 - 污点和容忍度详解

    当我们使用节点亲和力(Pod 的一个属性)时,它会将Pod吸引到一组节点(作为偏好或硬性要求).污点的行为完全相反,它们允许一个节点排斥一组 Pod. 在 Kubernetes 中,您可以标记(污染) ...

  8. kubernetes(k8s)Pod污点与容忍

    污点(taints)与容忍(tolerations) 对于nodeAffinity无论是硬策略还是软策略方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taint ...

  9. kubernetes (k8s) CKA认证之第二课:亲和性与 Pod 的调度

    手动调度一个 pod // cat manual-schedule.yaml apiVersion: v1 kind: Pod metadata: labels: run: pod-manual-sc ...

  10. Kubernetes K8S之固定节点nodeName和nodeSelector调度详解

    Kubernetes K8S之固定节点nodeName和nodeSelector调度详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-mas ...

随机推荐

  1. dotnet 5 的 bin 文件夹下的 ref 文件夹是做什么用的

    本文来和大家聊聊在 dotnet 5 和 dotnet 6 或更高版本的 dotnet 构建完成,在 bin 文件夹下,输出的 ref 文件夹.在此文件夹里面,将会包含项目程序集同名的 dll 文件, ...

  2. pnpm的基本原理及快速使用

    基本原理 前置知识:软件链接与硬链接 软链接(符号链接Symbolic link):是一类特殊的文件, 其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用.在window快捷方式上和其 ...

  3. 2.docker-compose安装prometheus

    一.docker-compose安装 前期准备 # docker配置文件 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json < ...

  4. 设计模式之装饰器-AOP

    HelloWorld简单例子如下:此例子好好体会下继承 is a和组合 has a的异同. using System; using System.Runtime.InteropServices; na ...

  5. 羽夏壳世界—— PE 结构(下)

    写在前面   此系列是本人一个字一个字码出来的,包括代码实现和效果截图. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后 ...

  6. WEB服务与NGINX(10)-NGINX访问控制功能

    目录 1.NGINX访问控制功能 1.1 基于ip地址的访问控制 1.2 基于用户名密码的认证 1.NGINX访问控制功能 nginx的访问控制有两种方式: 基于ip进行限制,由ngx_http_ac ...

  7. JSON字符串数据转换指定实体对象数据

    一.引入需要的maven依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId> ...

  8. pyqt5 子线程如何操作主线程GUI

    一.简介 在使用pyqt5编写gui时遇到两个问题,会导致界面崩溃,今天就围绕这两个问题来简单说明和改进. 1.在主线程中使用while无限循环会导致界面崩溃 2.在子线程中操作主线程gui会导致界面 ...

  9. .net core DataTable.Load()方法,返回的行缺少,少于reader读出的行

    我分析的原因是,datatable模式的schema默认是根据查询的sql来的.起因是我写的sql中带有主键的列,查出来有很多重复值, 然后dt.load会默认把主键重复的行给合并掉,所以最终查询出来 ...

  10. Python RabbitMQ Demo

    fanout消息订阅模式 生产者 # 生产者代码 import pika credentials = pika.PlainCredentials('guest', 'guest') # mq用户名和密 ...