文章目录

  • 一、前言
    • 1. 概述
    • 2. 亲和性和反亲和性的类型
    • 3.硬亲和与软亲和
    • 4.亲和性支持的运算符
  • 二、nodeAffinity(节点亲和)
    • 1. 测试环境准备
    • 2. 节点硬亲和
    • 3. 节点软亲和
  • 三、podAffinity(pod亲和)podAntiAffinity(pod反亲和)
    • 1. 测试环境准备
    • 2. pod亲和性
    • 3. pod反亲和性

一、前言

以下概述比较啰嗦,可直接跳过看例子

1. 概述

在k8s集群中,pod的调度是通过Scheduler组件来完成的。如果我们想要把pod调度到我们指定的节点,就需要管理员手动的进行操作。
nodeSelector 提供了一种将pod限制在节点的标签上。从而实现pod的固定调度,但是这种方式比较死板。
亲和性和反亲和性不同于nodeSelector的是可以极大的扩展了表达的约束类型,语言更具表达性,提供多种匹配规则,可以指定规则是优选项而不是硬要求,调度器不满足,pod仍然会被调度,可以不依赖与节点之间的标签,还可以针对pod之间的标签来做亲和与反亲和

2. 亲和性和反亲和性的类型

nodeAffinity(节点亲和)
节点亲和针对的是节点的标签,和nodeSelector相似,都是通过节点标签来约束pod的调度
podAffinity(pod亲和)podAntiAffinity(pod反亲和)
pod亲和针与反亲和针对的是pod的标签,虽然是针对pod的标签来约束,但是也不能够少一个条件,就是topologkey(拓扑域 多个node节点具有相同的标标签,键值键名相同),pod标签辅助topologkey来选择pod调度的节点。
简而言之,pod的亲和性和反亲和性调度是根据拓扑域来调度的,而不是根据node节点

3.硬亲和与软亲和

不管是节点亲和还是pod亲和都具有硬亲和与软亲和两种类型
requiredDuringSchedulingIgnoredDuringExecution(硬 必须满足条件)
pod调度到节点必须满足规则条件,不满足则不会调度,pod会一致处于pending状态
preferredDuringSchedulingIgnoredDuringExecution(软 优先满足符合条件的节点)
表示优先调度到满足规则条件的节点,如果不能满足在调度到其他节点

4.亲和性支持的运算符

IN :label的值在某个列表中
Notln:label 的值不在某个列表中
Exists:某个label存在
DoesNotExist:某个label不存在
Gt:label的值大于某个值
Lt:label的值小于某个值

二、nodeAffinity(节点亲和)

1. 测试环境准备

为节点打标签
[root@master ~]# kubectl label node node1 type=test1
node/node1 labeled
[root@master ~]# kubectl label node node2 type=test2
node/node2 labeled
[root@master ~]# kubectl label node node1 num=1
node/node1 labeled
[root@master ~]# kubectl label node node2 num=3
node/node2 labeled[root@master ~]# kubectl get node --show-labels
NAME     STATUS   ROLES    AGE   VERSION   LABELS
master   Ready    master   12d   v1.18.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node1    Ready    <none>   12d   v1.18.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,num=1,type=test1
node2    Ready    <none>   12d   v1.18.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux,num=3,type=test2node1的标签为type=test1 num=1
node2的标签为type=test2 num=3

2. 节点硬亲和

[root@master ~]# vi affinity_node.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploylabels:app: nginx
spec:replicas: 3 selector:matchLabels:app: nginxtemplate:metadata:name: nginx-podlabels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80affinity:nodeAffinity: #节点亲和requiredDuringSchedulingIgnoredDuringExecution: #节点硬亲和nodeSelectorTerms:  #node标签选择对象- matchExpressions: - key: typeoperator: In  #运算符values: #存在多个值满足一个即可- test1- test2 - key: numoperator: Gt  #大于符号values:- "2"综上所写我们最终可以知道pod会被调度到node2节点注:
1.当存在多个nodeSelectorTerms的时候,只有最后一个会生效,因为不能够包含多个对象
2.当存在多个matchExpressions列表,只需要满足其中一个即可将pod调度
3.当存在多个key值时,必须所有key值都要满足,否则会显示pending状态
4.当pod已经通过亲和性规则调度到指定的节点了,删除节点的标签,pod是不会被驱逐的

3. 节点软亲和

[root@master ~]# vi affinity_node.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploylabels:app: nginx
spec:replicas: 3 selector:matchLabels:app: nginxtemplate:metadata:name: nginx-podlabels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution: #节点软亲和- weight: 20 #权重 范围为1-100preference:matchExpressions:- key: typeoperator: Invalues:- test1- test2 - key: numoperator: Gtvalues:- "2"- weight: 30preference:matchExpressions:- key: typeoperator: Invalues:- test1- test2- key: numoperator: Ltvalues:- "2"     综上所写pod最终会被调度到node1节点,优先调度到node1节点,因为配置的权重较高注:权重值高的优先调用,如果不满足在使用其他 然后在进行权重之间进行比对

三、podAffinity(pod亲和)podAntiAffinity(pod反亲和)

1. 测试环境准备

为节点打标签,在上面打标签不变,增加如下标签
[root@master ~]# kubectl label node master key=a
[root@master ~]# kubectl label node node2 key=a[root@master ~]# kubectl get node --show-labels
NAME     STATUS   ROLES    AGE   VERSION   LABELS
master   Ready    master   12d   v1.18.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,key=a,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
node1    Ready    <none>   12d   v1.18.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,num=c,type=test1
node2    Ready    <none>   12d   v1.18.2   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,key=a,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux,num=3,type=test2master的标签有 key=a
node1的标签有 type=test1 num=1
node2的标签有 key=a type=test2 num=3根据具有相同键名键值标签的节点处于同一个拓扑域,我们就可以晓得
master和node2为同一个拓扑域
然后在使用系统默认的beta.kubernetes.io/arch标签,这样三个节点也为同一个拓扑域

2. pod亲和性

在写pod亲和性之前我们先运行如下的pod用于测试
[root@master ~]# kubectl get pods --show-labels
NAME    READY   STATUS    RESTARTS   AGE    LABELS
myapp   1/1     Running   0          19s    app=myapp[root@master ~]# vi affinity_pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploylabels:app: nginx
spec:replicas: 2selector:matchLabels:app: nginxtemplate:metadata:name: nginx-podlabels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:#硬亲和- labelSelector:matchExpressions:- key: app #已经运行pod的标签operator: Invalues:- myapptopologyKey: key #拓扑域标签的键名综上所写最终pod将会在node2和master节点之间进行调用,node1节点不会进行调度
上述yaml文件的意思是在key标签拓扑域中,如果存在标签为app=nginx的主机,那么就将该pod调度到该拓扑域的范围,没有则显示pending

3. pod反亲和性

[root@master ~]# vi affinity_pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploylabels:app: nginx
spec:replicas: 6 selector:matchLabels:app: nginxtemplate:metadata:name: nginx-podlabels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution: #软亲和- weight: 100  #权重podAffinityTerm:labelSelector:matchExpressions: - key: appoperator: Invalues:- myapptopologyKey: key #拓扑域综上所写pod最终会优先调度到node1节点上,因为node2和master在同一个拓扑域中,且运行了标签为app=myapp的pod
pod的反亲和就是针对拓扑域来约束的,如果判断的pod在指定的拓扑域当中,那么就不优先调度该拓扑域中的pod,而会优先选择其他pod来进行调度简而言之,反亲和就是调度到除了本身定义的拓扑域之外的节点

Kubernetes 亲和性与反亲和性相关推荐

  1. Kubernetes调度之亲和性和反亲和性

    背景 Kubernetes中的调度策略可以大致分为两种,一种是全局的调度策略,要在启动调度器时配置,包括kubernetes调度器自带的各种predicates和priorities算法:另一种是运行 ...

  2. k8s中亲和性与反亲和性

    k8s中亲和性与反亲和性 Kubernetes的默认调度器以预选.优选.选定机制完成将每个新的Pod资源绑定至为其选出的目标节点上,不过,它只是Pod对象的默认调度器,默认情况下调度器考虑的是资源足够 ...

  3. k8s之亲和性、反亲和性

    k8s中亲和性与反亲和性 Kubernetes的默认调度器以预选.优选.选定机制完成将每个新的Pod资源绑定至为其选出的目标节点上,不过,它只是Pod对象的默认调度器,默认情况下调度器考虑的是资源足够 ...

  4. 【云原生 | 从零开始学Kubernetes】十、k8sPod节点亲和性和反亲和性

    该篇文章已经被专栏<从零开始学k8s>收录 Pod节点亲和性和常见的状态 Pod 节点亲和性 pod 节点反亲和性 写在最后 Pod 节点亲和性 pod 自身的亲和性调度有两种表示形式 p ...

  5. pod 的亲和性,反亲和性 实验

    文章目录 1 ,环境准备 2 亲和性+ In 测试 3 亲和性+NotIn 测试 4 非亲和性+In 测试 5 非亲和性 + NotIn 测试 1 ,环境准备 node01. node02 都有标签 ...

  6. k8s调度之node的亲和性以及pod的亲和性/反亲和性

    k8s调度之node的亲和性以及pod的亲和性/反亲和性 通常情况下,使用的都是k8s默认的调度调度方式,但是在有些情况下,我们需要将pod运行在具有特定的标签的node上才能都运行,这个时候,pod ...

  7. kubernetes 亲和、反亲和、污点、容忍

    目录 一.K8s调度 二.亲和与反亲和 1.Pod和Node 2.硬亲和和软亲和 三.污点与容忍 3.1  污点(Taint) 3.1.1 污点的组成 3.1.2 污点的设置和去除 3.2  容忍(T ...

  8. OpenShift 4 - Pod的亲和性/反亲和性

    <OpenShift 4.x HOL教程汇总> 文章目录 Pod的亲和性/反亲和性 方法1:直接指定Pod运行Node 方法2:通过设置Pod的nodeselector实现 方法3:通过设 ...

  9. linux多核编程系列之调度亲和性,关于CPU亲和性,这篇讲得最全面

    何为CPU的亲和性 CPU的亲和性,进程要在某个给定的 CPU 上尽量长时间地运行而不被迁移到其他处理器的倾向性,进程迁移的频率小就意味着产生的负载小.亲和性一词是从affinity翻译来的,实际可以 ...

最新文章

  1. 自己动手写C语言编译器(4)
  2. rxjs 里的map operator
  3. Linux找最大最小值的命令,Linux中awk命令正确的求最大值、最小值、平均值、总和...
  4. LeetCode 948. 令牌放置(贪心)
  5. java showinputdialog_java - JOptionPane.showInputDialog中的多个输入
  6. Ubuntu16.04安装MySQL5.7
  7. window下Jekyll+github搭建自己的博客
  8. 我们都在努力做自己,我的编程之路开篇
  9. mysql在故障切换时的事件调度器注意事项
  10. Android Hook框架adbi的分析(3)---编译和inline Hook实践
  11. ipad学计算机二级,‎App Store 上的“计算机等级考试一级最新题库”
  12. php微信jsapi支付案例,PHP实现微信支付(jsapi支付)流程
  13. 打印CSDN网页内容
  14. 淘宝订单API接口获取订单
  15. [cesium] | 城市警情模拟
  16. 【DevOps实战|基于Jenkins与Gitlab构建企业级持续集成环境系统】(Jenkins+Gitlab+Keepalived+Haproxy+Sonarqube+Http+灰度自动部署)
  17. 实战 .Net 数据访问层 - 19
  18. python判断一个数是奇数还是偶数_在python中检查一个数字是奇数还是偶数
  19. Hexo个人博客NexT主题添加Local Search本地搜索
  20. Android ubuntu 设置手机驱动

热门文章

  1. DSB matlab仿真
  2. 又一款数据分析神器:Polars 真的很强大
  3. 叮咚,您有一封告白信件待查收(原生HTML+CSS+JS绘制表白信件,代码+链接+步骤详解)
  4. a boo peek_|音译|171120*歌词ΓRed Velvet - Peek-A-Boo
  5. note-PythonCookbook-第十一章 网络与WEB编程
  6. 标准柯西分布_柯西分布没有数学期望
  7. H5页面调用微信支付
  8. Python高级全栈开发实战 老男孩课程S16+路飞学城项目+女神串讲 Python全栈直通车课程
  9. 五分钟GO、KEGG和COG注释和富集分析
  10. php 获取用户是否关注微信公众号