欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos

本篇概览

  • 本文是欣宸在学习Kubernetes调度器的过程中,对亲和性相关知识点的整理和总结,这是一篇笔记性质的博客

kubernetes默认调度器的调度过程:

  • 调度过程如下:
  1. 预选(Predicates)
  2. 优选(Priorities)
  3. 选定(Select)

亲和性一览

  • 这里将亲和性先分类,便于理解
#mermaid-svg-PKDr5f4juUSoiDD3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PKDr5f4juUSoiDD3 .error-icon{fill:#552222;}#mermaid-svg-PKDr5f4juUSoiDD3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-PKDr5f4juUSoiDD3 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-PKDr5f4juUSoiDD3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-PKDr5f4juUSoiDD3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-PKDr5f4juUSoiDD3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-PKDr5f4juUSoiDD3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-PKDr5f4juUSoiDD3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-PKDr5f4juUSoiDD3 .marker.cross{stroke:#333333;}#mermaid-svg-PKDr5f4juUSoiDD3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-PKDr5f4juUSoiDD3 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-PKDr5f4juUSoiDD3 .cluster-label text{fill:#333;}#mermaid-svg-PKDr5f4juUSoiDD3 .cluster-label span{color:#333;}#mermaid-svg-PKDr5f4juUSoiDD3 .label text,#mermaid-svg-PKDr5f4juUSoiDD3 span{fill:#333;color:#333;}#mermaid-svg-PKDr5f4juUSoiDD3 .node rect,#mermaid-svg-PKDr5f4juUSoiDD3 .node circle,#mermaid-svg-PKDr5f4juUSoiDD3 .node ellipse,#mermaid-svg-PKDr5f4juUSoiDD3 .node polygon,#mermaid-svg-PKDr5f4juUSoiDD3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-PKDr5f4juUSoiDD3 .node .label{text-align:center;}#mermaid-svg-PKDr5f4juUSoiDD3 .node.clickable{cursor:pointer;}#mermaid-svg-PKDr5f4juUSoiDD3 .arrowheadPath{fill:#333333;}#mermaid-svg-PKDr5f4juUSoiDD3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-PKDr5f4juUSoiDD3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-PKDr5f4juUSoiDD3 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-PKDr5f4juUSoiDD3 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-PKDr5f4juUSoiDD3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-PKDr5f4juUSoiDD3 .cluster text{fill:#333;}#mermaid-svg-PKDr5f4juUSoiDD3 .cluster span{color:#333;}#mermaid-svg-PKDr5f4juUSoiDD3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-PKDr5f4juUSoiDD3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

亲和性
节点亲和性
Pod亲和性
硬亲和性-required
软亲和性-preferred
硬亲和性-required
软亲和性-preferred
反亲和性

节点亲和性和pod亲和性的区别

  • 举个例子,假设给小明分配班级(小明是pod,班级是节点)
  1. 节点亲和性:直接告诉小明,你去一年级

  2. pod亲和性:从小朋友中找出和小明同年的,找到了小张,发现小张是一年级的,于是让小明去一年级

节点亲和性:硬亲和性

  • requiredDuringSchedulinglgnoredDuringExecution:用于定义节点硬亲和性

  • nodeSelectorTerm:节点选择器,可以有多个,之间的关系是逻辑或,即一个nodeSelectorTerm满足即可

  • matchExpressions:匹配规则定义,多个之间的关系是逻辑与,即同一个nodeSelectorTerm下所有matchExpressions定义的规则都匹配,才算匹配成功

  • 示例:

apiVersion: v1
kind: Pod
metadata:name: with-required-nodeaffinity
spec:affinity:nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- {key: zone, operator: In, values: ["foo"]}containers:- name: nginximage: nginx
  • 功能与nodeSelector类似,用的是匹配表达式,可以被理解为新一代节点选择器
  • 不满足硬亲和性条件时,pod为Pending状态
  • 在预选阶段,节点硬亲和性被用于预选策略MatchNodeSelector

节点亲和性:软亲和性

  • 特点:条件不满足时也能被调度

  • 示例:

apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-deploy-with-node-affinity
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:name: nginxlabels:app: nginxspec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 60preference:matchExpressions:- {key: zone, operator: In, values: ["foo"]}- weight: 30preference:matchExpressions:- {key: ssd, operator: Exists, values: []}containers:- name: nginximage: nginx
  • 集群中的节点,由于标签不同,导致的优先级结果如下:

  • 在优选阶段,节点软亲和性被用于优选函数NodeAffinityPriority

  • 注意:NodeAffinityPriority并非决定性因素,因为优选阶段还会调用其他优选函数,例如SelectorSpreadPriority(将pod分散到不同节点以分散节点故障导致的风险)

  • pod副本数增加时,分布的比率会参考节点亲和性的权重

Pod亲和性(podAffinity)

  • 如果需求是:新增的pod要和已经存在pod(假设是A)在同一node上,此时用节点亲和性是无法完成的,因为A可能和节点没啥关系(可能是随机调度的),此时只能用pod亲和性来实现

  • pod亲和性:一个pod与已经存在的某个pod的亲和关系,需要通过举例来说明

  1. 创建一个deployment,这个pod有标签app=tomcat:
kubectl run tomcat -l app=tomcat --image tomcat:alpine
  1. 创建pod,需求是和前面的pod在一起,使用pod亲和性来实现:
apiVersion: v1
kind: Pod
metadata:name: with-pod-affinity-1
spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- {key: app, operator: In, values: ["tomcat"]}topologyKey: kubernetes.io/hostnamecontainers:- name: nginximage: nginx
  1. 调度逻辑:
#mermaid-svg-qk5IfYD9CL4GkKJy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qk5IfYD9CL4GkKJy .error-icon{fill:#552222;}#mermaid-svg-qk5IfYD9CL4GkKJy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qk5IfYD9CL4GkKJy .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-qk5IfYD9CL4GkKJy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qk5IfYD9CL4GkKJy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qk5IfYD9CL4GkKJy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qk5IfYD9CL4GkKJy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qk5IfYD9CL4GkKJy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qk5IfYD9CL4GkKJy .marker.cross{stroke:#333333;}#mermaid-svg-qk5IfYD9CL4GkKJy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qk5IfYD9CL4GkKJy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-qk5IfYD9CL4GkKJy .cluster-label text{fill:#333;}#mermaid-svg-qk5IfYD9CL4GkKJy .cluster-label span{color:#333;}#mermaid-svg-qk5IfYD9CL4GkKJy .label text,#mermaid-svg-qk5IfYD9CL4GkKJy span{fill:#333;color:#333;}#mermaid-svg-qk5IfYD9CL4GkKJy .node rect,#mermaid-svg-qk5IfYD9CL4GkKJy .node circle,#mermaid-svg-qk5IfYD9CL4GkKJy .node ellipse,#mermaid-svg-qk5IfYD9CL4GkKJy .node polygon,#mermaid-svg-qk5IfYD9CL4GkKJy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qk5IfYD9CL4GkKJy .node .label{text-align:center;}#mermaid-svg-qk5IfYD9CL4GkKJy .node.clickable{cursor:pointer;}#mermaid-svg-qk5IfYD9CL4GkKJy .arrowheadPath{fill:#333333;}#mermaid-svg-qk5IfYD9CL4GkKJy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qk5IfYD9CL4GkKJy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qk5IfYD9CL4GkKJy .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-qk5IfYD9CL4GkKJy .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-qk5IfYD9CL4GkKJy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qk5IfYD9CL4GkKJy .cluster text{fill:#333;}#mermaid-svg-qk5IfYD9CL4GkKJy .cluster span{color:#333;}#mermaid-svg-qk5IfYD9CL4GkKJy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qk5IfYD9CL4GkKJy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

1. 用matchExpressions的规则app=tomcat搜索
2. 找到tomcat的pod,也就确定了该pod的节点,假设是A节点
3. topologyKey是kubernetes.io/hostname,所以去找A节点kubernetes.io/hostname标签的值,假设是xxx
4. 将新的pod调度到kubernetes.io/hostname=xxx的节点
  1. 表面上看,最终只是根据hostname去调度的,但如果topologyKey的值是多个节点所拥有的,就更有通用性了,如下图,topologyKey等于filure-domain.beta.kubernetes.io/zone:

  • 硬亲和:requiredDuringSchedulingIgnoredDuringExecution
  • 软亲和:preferredDuringSchedulingIgnoredDuringExecution

Pod反亲和(podAntiAffinity)

  • 与亲和性相反,将当前pod调度到满足匹配条件之外的节点上
  • 适用场景:
  1. 分散同一类应用
  2. 将不同安全级别的pod调度至不同节点
  • 示例如下,匹配表达式和自身标签一致,作用是分散同一类应用,让相同pod不要调度到同一个节点:
apiVersion: apps/v1
kind: Deployment
metadata:name: myapp-with-pod-anti-affinity
spec:replicas: 4selector:matchLabels:app: myapptemplate:metadata:name: myapplabels:app: myappspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- {key: app, operator: In, values: ["myapp"]}topologyKey: kubernetes.io/hostnamecontainers:- name: nginximage: nginx
  • 如果集群中只有三个节点,那么执行上述yaml的结果就是最多创建三个pod,另一个始终处于pending状态

参考

  • 本篇笔记参考了以下文章,两张图片也来自该文章,致敬作者山山仙人博客
  • https://www.ssgeek.com/post/kubernetes-pod-diao-du-zhi-qin-he-xing-diao-du/

Kubernetes亲和性学习笔记相关推荐

  1. kubernetes完整学习笔记

    markdown文档笔记下载地址:https://install-data.oss-cn-hongkong.aliyuncs.com/%E7%AC%94%E8%AE%B0/kubernetes%E5% ...

  2. Kubernetes的学习笔记总结之k8s集群安装部署

    kubernets 集群安装部署. 安装 Docker 所有节点都需要安装 Docker. apt-get update && apt-get install docker.io 安装 ...

  3. 【删】【Kubernetes视频学习笔记】Kubernetes集群YAML文件详解

    文章目录 概述 YAML文件介绍 YAML概述 YAML 基本语法 YAML 支持的数据结构 对象 数组 YAML文件组成部分 控制器的定义 被控制的对象 属性说明 如何快速编写YAML文件 使用ku ...

  4. Kubernetes 1.18学习笔记

    文章目录 一.Kubernetes 概述和架构 1.kubernetes 基本介绍 2.Kubernetes 功能 3.Kubernetes 架构组件 4.Kubernetes 核心概念 5.Kube ...

  5. Kubernetes学习笔记(一)

    2019独角兽企业重金招聘Python工程师标准>>> Kubernetes学习笔记(一) 博客分类: Kubernetes 导语 2015年4月,传闻已久的Borg论文伴随Kube ...

  6. kubernetes学习笔记 (二):k8s初体验

    本文采用本地k8s v1.10.3版本开发,如果还没有搭建可参照 kubernetes学习笔记 (一):搭建本地k8s开发环境进行搭建 搭建本地Docker镜像仓库 docker pull docke ...

  7. Kubernetes学习笔记之Calico CNI Plugin源码解析(二)

    女主宣言 今天小编继续为大家分享Kubernetes Calico CNI Plugin学习笔记,希望能对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算" ...

  8. Kubernetes学习笔记之Calico CNI Plugin源码解析(一)

    女主宣言 今天小编为大家分享Kubernets Calico CNI Plugin的源码学习笔记,希望对正在学习k8s相关部分的同学有所帮助: PS:丰富的一线技术.多元化的表现形式,尽在" ...

  9. Contour 学习笔记(一):使用 Contour 接管 Kubernetes 的南北流量

    原文链接:Contour 学习笔记(一):使用 Contour 接管 Kubernetes 的南北流量 在 Kubernetes 中运行大规模以 Web 为中心的工作负载,最关键的需求之一就是在 L7 ...

最新文章

  1. Oracle表与索引的分析及索引重建
  2. sigprocmask和sigsuspend转
  3. android studio 模拟器中文乱码
  4. 推荐:机器学习实战项目练手的平台
  5. 在用visio作图形界面设计,控件对齐的工具按钮
  6. 关于优酷开放SDK相应的mediaplayer的监听器的设置之setOnBufferingUpdateListener
  7. 【图文详解】JAVA字面量和变量
  8. oracle 存储过程挂起,library cache pin与PROCEDURE的重建
  9. 使用LAMP创建基于wordpress的个从博客网站
  10. JS+HTML画图的几种方法
  11. 初识Mysql(part13)--我需要知道的7条Mysql语句之更新和删除数据
  12. css动画-模拟正余弦曲线
  13. 洛谷P1080 国王游戏
  14. Tensorflow安装错误ERROR: Cannot uninstall ‘wrapt‘.
  15. C++算法学习(栈)
  16. npm shrinkwrap的用途
  17. 西湖论剑2020writeup
  18. C# 设计模式:创建型
  19. 今天14:00 | NeurIPS 专场三 青年科学家专场
  20. C# 获取IP地址、主机信息(Host)、浏览器信息

热门文章

  1. 自己的家用电脑怎么架设传奇私服??
  2. [Python爬虫]爬取新浪理财师股票问答
  3. 中职计算机技术教学计划,中职计算机应用基础教学计划.doc
  4. Linux Shell 内建命令 : sh命令详解
  5. 计算机词汇店名,电脑店名字200例
  6. HTML模仿静态京东登陆界面
  7. 算法:CLH锁的原理及实现
  8. c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...
  9. 模糊查询银行卡号mysql_mysql模糊查询
  10. 基于vue技术栈制作自己的简历网站问题总结篇(入门vue基础项目)