k8s 亲和 反亲和介绍
k8s 亲和 & 反亲和介绍
文章内容来自k8s文档翻译以及个人理解和实际使用过程中的实践内容
参考:https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
目录
文章目录
- k8s 亲和 & 反亲和介绍
- 目录
- pod调度到node(nodeSelector)
- 亲和与反亲和(Affinity and anti-affinity)
- 节点亲和
- Pod间亲和 & 反亲和
- 其他需要注意的点:
pod调度到node(nodeSelector)
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentnodeSelector: # 匹配节点的label,多个label之间为‘与’关系disktype: ssd
节点内置label: Well-Known Labels, Annotations and
亲和与反亲和(Affinity and anti-affinity)
节点亲和
节点亲和在概念上和nodeSelector
类似–根据node的label来约束pod可以调度到哪些节点。
有两种类型的节点亲和
硬亲和 requiredDuringSchedulingIgnoredDuringExecution
软亲和 preferredDuringSchedulingIgnoredDuringExecution
硬亲和指定将pod调度到节点上必须满足的规则(类似于nodeelector,但语法更形象)
软亲和指定首选项,调度器将尝试执行但没有保证。
名称中IgnoredDuringExecution
的部分表示:如果pod根据亲和规则被调度到某节点运行之后,此时node上的labels发生变化(不再符合pod上的亲和性规则)不会对在该节点上运行的pod造成影响。
在未来,k8s计划提供requireduringschedulingrequireduringexecution
,除了从不再符合pod亲和规则的节点上会自动驱逐pod,其他功能和requireduringschedulingignoredduringexecution
一致。
apiVersion: v1
kind: Pod
metadata:name: with-node-affinity
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/e2e-az-nameoperator: Invalues:- e2e-az1- e2e-az2preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: another-node-label-keyoperator: Invalues:- another-node-label-valuecontainers:- name: with-node-affinityimage: k8s.gcr.io/pause:2.0
查询表达式中可以使用的操作符有:In
, NotIn
, Exists
, DoesNotExist
, Gt
, Lt
等。操作符为In
, NotIn
时可以有多个值,Gt
, Lt
只能有且必须有一个值,Exists
, DoesNotExist
值必须为空。
可以使用NotIn
和DoesNotExist
来实现节点反亲和行为,或使用node taints
驱逐特定节点上的Pod。
如果同时指定了nodeSelector
和nodeAffinity
,则必须同时满足这两个条件,才能将pod调度到候选节点上
requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms
数组的多个元素之间为或
的关系
requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms[i].matchExpressions
数组的多个元素之间为与
的关系
preferredDuringSchedulingIgnoredDuringExecution
数组的多个元素之间为或
的关系
preferredDuringSchedulingIgnoredDuringExecution
中的weight
字段的范围是1-100。对于每个满足所有调度要求的节点(资源需求, requireduringscheduling
亲和表达式等等),调度程序就计算preferredDuringSchedulingIgnoredDuringExecution
下所有匹配MatchExpressions
的条目的weight的总和,然后将此分数与该节点的其他优先级函数的分数合并,优先选择总得分最高的节点。
Node affinity per scheduling profile
FEATURE STATE: Kubernetes v1.20 [beta]
另外可以通过kube-scheduler的multiple-profiles特性来实现不同的亲和策略。即在KubeSchedulerConfiguration的profiles中配置不同调度器的亲和规则
apiVersion: kubescheduler.config.k8s.io/v1beta1
kind: KubeSchedulerConfigurationprofiles:- schedulerName: default-scheduler- schedulerName: foo-schedulerpluginConfig:- name: NodeAffinityargs:addedAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: scheduler-profileoperator: Invalues:- foo
Pod间亲和 & 反亲和
pod间亲和与反亲和调度算法计算量较大,集群规模越大、节点越调度降速越明显,呈指数级增长。需要在使用此特性时考虑对调度速度的影响。
与节点不同,因为Pod是命名空间(因此Pod上的标签是隐式命名空间),所以Pod标签上的标签选择器必须指定选择器应用于哪些命名空间。若namespaces
为空,则默认是和pod的namespace相同。
apiVersion: v1
kind: Pod
metadata:name: with-pod-affinity
spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: securityoperator: Invalues:- S1namespaces:- ns-1- ns-2topologyKey: topology.kubernetes.io/zonepodAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: securityoperator: Invalues:- S2topologyKey: topology.kubernetes.io/zonecontainers:- name: with-pod-affinityimage: k8s.gcr.io/pause:2.0
查询表达式中可以使用的操作符只有:In
, NotIn
, Exists
, DoesNotExist
pod间亲和与反亲和的调度尺度不一定是以节点区分的,还可能是机架、机房、云服务提供商等拓扑域。
其拓扑域是通过topologyKey
字段定义的,这个字段的值是node的一个label的key,针对这个label,拥有相同value的节点属于同一拓扑域,pod亲和调度的时候会以拓扑域为基础,即根据该拓扑域(可能是一个节点、也可能是多个节点)中已存在的pod,判断新的pod应该(或不应该)调度到该拓扑域中的节点上。
原则上,topologyKey
可以是任何合法的标签的key。然而,出于性能和安全方面的原因,对topologyKey
有一些限制:
- pod亲和与反亲和的
requiredDuringSchedulingIgnoredDuringExecution
和preferredDuringSchedulingIgnoredDuringExecution
都不允许topologyKey
为空。 - pod反亲和的
requiredDuringSchedulingIgnoredDuringExecution
被引入的admission controllerLimitPodHardAntiAffinityTopology
限制,只能是kubernetes.io/hostname
,如果想使用自定义的topologyKey
您可以修改或禁用掉admission controller。
其他需要注意的点:
节点亲和与pod间亲和为&的关系,即需要同时满足两者或三者。
应当避免多个同时部署的的k8s负载资源pod间亲和配置存在相互依赖关系,如果形成死锁会导致无法成功调度。
k8s 亲和 反亲和介绍相关推荐
- k8s调度之亲和/反亲和
Pod的调度流程 在k8s集群中kube-scheduler组件负责为Pod选择运行节点,并由对应节点上的kubelet创建Pod.对于每个未绑定至任何节点的Pod对象,无论是新建.被驱逐等,kube ...
- Kubernetes-调度、节点亲和反亲和、pod亲和反亲和、Taints污点的处理
目录: 一.kubernetes调度介绍 二.nodename节点选择约束 三.nodeSelector 亲和 1.节点亲和 2.节点反亲和 1. pod亲和 2.pod反亲和 四.Taints(污点 ...
- k8s调度(nodeName、nodeSelect、节点、pod的亲和和反亲和、Taints)
k8s调度 nodeName nodeSelector 亲和与反亲和 节点亲和 pod 亲和性和反亲和性 Taints(污点) 调度器通过 kubernetes 的 watch 机制来发现集群中新创建 ...
- 容器亲和、反亲和、污点、容忍以及驱逐的介绍
nodeSelector简介: 官方文档: https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/ 可用于干预pod的调度结果,例 ...
- 图解 K8S(07):调度利器之亲和与反亲和(服务容灾)
本系列教程目录(已发布): 图解 K8S(01):基于ubuntu 部署最新版 k8s 集群 图解 K8S(02):认识 K8S 中的资源对象 图解 K8S(03):从 Pause 容器理解 Pod ...
- k8s 亲和、反亲和、污点、容忍
目录 一.K8s调度 二.亲和与反亲和 2.1.Pod和Node 2.2.硬亲和和软亲和 三.污点与容忍 3.1 污点(Taint) 3.1.1 污点的组成 3.1.2 污点的设置和去除 3.2 ...
- K8S node亲和与反亲和:affinity应用
简介: affinity是K8S 1.2版本后引入的新特性,类似于nodeSelector,允许使用者指定一些pod在Node间调度的约束,目前支持两种形式: 1. requireDuringSche ...
- k8s(八)—调度因素(nodeName、nodeSelector、亲和与反亲和、Taints 污点)、影响pod调度的指令
1 调度简介 [root@server2 ~]# kubectl get pod -n kube-system 2 影响kubernetes调度的因素 2.1 nodeName(针对节点) [root ...
- kubernetes 亲和、反亲和、污点、容忍
目录 一.K8s调度 二.亲和与反亲和 1.Pod和Node 2.硬亲和和软亲和 三.污点与容忍 3.1 污点(Taint) 3.1.1 污点的组成 3.1.2 污点的设置和去除 3.2 容忍(T ...
最新文章
- Java虚拟机 —— 类的加载机制
- Java浮点值拒绝服务漏洞危害分析
- Spring Boot 2.2.0 正式发布,大幅性能提升 + Java 13 支持
- Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/data/vm10-0-0-19
- OpenGL相机控制之二
- 集成学习之sklearn中的xgboost基本用法 (转载)
- bootstraptable获得所有行_2020广汽本田安全中国行·首届道路安全创新大赛成功举办...
- Linux 杀掉所有Java进程
- GAT GAX 简介
- Golang面试问题汇总
- Java开发基础面试知识点
- TiCDC同步延迟问题处理
- 肖sir__面试就业课___数据库
- pica8公司和picOS
- 10个超赞的jQuery图片滑块动画
- -Xms -Xmx等jvm参数的含义
- Binary XML file line #2 in com.example.helloworld:layout/activity_main: Binary XML file line #2 in c
- 对未来的打算和本专业的认识
- 一个骨灰级玩家的游戏加速器使用心得分享
- 【笔记】29元microbit套装如何玩——套装硬件简介
热门文章
- Invalid prop: custom validator check failed for prop “pagination“.
- python交互编程模式_进入python交互模式的方法
- 华硕无双+2022款笔记本重装系统笔记
- oa项目经验描述_(完整版)简历中的项目经验范文
- Incorrect string value: ‘\xF0\x9F\x91\x82‘ for column ‘address‘ at row 1
- Android-第十三节04Room框架详解
- 互联网金融热浪下丨看看美国的互联网金融怎么玩?
- 【仿真】后仿真中的notifier是奏啥滴!
- 2020蚂蚁集团招股说明书.pdf
- 天蝎座2019年4月运势