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

背景

服务需要多副本,来保证高可靠、多活。
那么问题来了,假如这些副本都在同一个宿主机上,或者同一个交换机下…宿主机、交换机其中一项坏掉了,那多副本还有什么意义?
怎么解决呢?需要用到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 使用 Newtonsoft.Json 输出枚举首字符小写

    本文告诉大家如何使用 Newtonsoft.Json 输出枚举首字符小写 实现方法是加上 JsonConverterAttribute 特性,传入 StringEnumConverter 转换器,再加 ...

  2. WPF 用到的触摸的 COM 接口

    本文记录 WPF 用到的触摸的 COM 接口 消息 用到了 WM_TABLET_ADDED 和 WM_TABLET_DELETED 消息 使用的代码是 src\Microsoft.DotNet.Wpf ...

  3. Oracle、达梦:☆获取数据库对象、获取对象的DDL定义语句(达梦)

    一.获取数据库对象(Oracle.达梦) 以下方式在达梦DM数据库中都能跑通,Oracle未测试所有的方式. 1.获取所有对象--所有模式下的 数据库所有对象表:包括表.视图.物化视图.函数.存储过程 ...

  4. PageOffice在线打开编辑Word文件获取指定区域的数据并且保存整篇文件

    一.首先在word文件中给需要在后台获取数据的区域设置以PO_开头的书签. 二.通过pageoffice在线打开文件并编辑保存.有两种打开文件的模式 1.普通编辑模式(docNormalEdit) 普 ...

  5. 记录freeswitch的一个2833问题

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 运营商内部新老系统混用,互联互通的问题较多,其中以DTMF码的问题最多,花样也多. 环境 CentOS 7.9 freeswitch ...

  6. gpu机器没有开启ipv6

    参考: https://blog.csdn.net/asdfaa/article/details/137884414 检查系统是否支持 IPv6,查看被禁用了 在启用 IPv6 之前,首先要确保您的系 ...

  7. Python提取文本文件(.txt)数据的方法

      本文介绍基于Python语言,遍历文件夹并从中找到文件名称符合我们需求的多个.txt格式文本文件,并从上述每一个文本文件中,找到我们需要的指定数据,最后得到所有文本文件中我们需要的数据的合集的方法 ...

  8. 【U8】bom全阶 点击展开按钮,无法获得叶子子阶

    经查看 是因为 子件的失效日期与生效日期是相同一天,延后子件的失效日期就可以在点击展开按钮后,看到子阶bom了.

  9. IceRPC之多路复用传输>快乐的RPC

    作者引言 很高兴啊,我们来到了IceRPC之多路复用传输>快乐的RPC,基础引导,打好基础,才能让自已不在迷茫,快乐的畅游世界. icerpc 和多路复用传输 了解 icerpc 协议和多路复用 ...

  10. VMware Workstation解锁Mac系统

    VMware workstation在安装虚拟机的时候,如果是安装Windows.CentOS.Ubuntu等相关系统的话,仅仅需要一个系统镜像就可以顺利安装了. 但是如果想要安装苹果系统Mac的话, ...