Kubernetes亲和性学习笔记
欢迎访问我的GitHub
这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
- 本文是欣宸在学习Kubernetes调度器的过程中,对亲和性相关知识点的整理和总结,这是一篇笔记性质的博客
kubernetes默认调度器的调度过程:
- 调度过程如下:
- 预选(Predicates)
- 优选(Priorities)
- 选定(Select)
亲和性一览
- 这里将亲和性先分类,便于理解
节点亲和性和pod亲和性的区别
- 举个例子,假设给小明分配班级(小明是pod,班级是节点)
节点亲和性:直接告诉小明,你去一年级
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的亲和关系,需要通过举例来说明
- 创建一个deployment,这个pod有标签app=tomcat:
kubectl run tomcat -l app=tomcat --image tomcat:alpine
- 创建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
- 调度逻辑:
- 表面上看,最终只是根据hostname去调度的,但如果topologyKey的值是多个节点所拥有的,就更有通用性了,如下图,topologyKey等于filure-domain.beta.kubernetes.io/zone:
- 硬亲和:requiredDuringSchedulingIgnoredDuringExecution
- 软亲和:preferredDuringSchedulingIgnoredDuringExecution
Pod反亲和(podAntiAffinity)
- 与亲和性相反,将当前pod调度到满足匹配条件之外的节点上
- 适用场景:
- 分散同一类应用
- 将不同安全级别的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亲和性学习笔记相关推荐
- kubernetes完整学习笔记
markdown文档笔记下载地址:https://install-data.oss-cn-hongkong.aliyuncs.com/%E7%AC%94%E8%AE%B0/kubernetes%E5% ...
- Kubernetes的学习笔记总结之k8s集群安装部署
kubernets 集群安装部署. 安装 Docker 所有节点都需要安装 Docker. apt-get update && apt-get install docker.io 安装 ...
- 【删】【Kubernetes视频学习笔记】Kubernetes集群YAML文件详解
文章目录 概述 YAML文件介绍 YAML概述 YAML 基本语法 YAML 支持的数据结构 对象 数组 YAML文件组成部分 控制器的定义 被控制的对象 属性说明 如何快速编写YAML文件 使用ku ...
- Kubernetes 1.18学习笔记
文章目录 一.Kubernetes 概述和架构 1.kubernetes 基本介绍 2.Kubernetes 功能 3.Kubernetes 架构组件 4.Kubernetes 核心概念 5.Kube ...
- Kubernetes学习笔记(一)
2019独角兽企业重金招聘Python工程师标准>>> Kubernetes学习笔记(一) 博客分类: Kubernetes 导语 2015年4月,传闻已久的Borg论文伴随Kube ...
- kubernetes学习笔记 (二):k8s初体验
本文采用本地k8s v1.10.3版本开发,如果还没有搭建可参照 kubernetes学习笔记 (一):搭建本地k8s开发环境进行搭建 搭建本地Docker镜像仓库 docker pull docke ...
- Kubernetes学习笔记之Calico CNI Plugin源码解析(二)
女主宣言 今天小编继续为大家分享Kubernetes Calico CNI Plugin学习笔记,希望能对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算" ...
- Kubernetes学习笔记之Calico CNI Plugin源码解析(一)
女主宣言 今天小编为大家分享Kubernets Calico CNI Plugin的源码学习笔记,希望对正在学习k8s相关部分的同学有所帮助: PS:丰富的一线技术.多元化的表现形式,尽在" ...
- Contour 学习笔记(一):使用 Contour 接管 Kubernetes 的南北流量
原文链接:Contour 学习笔记(一):使用 Contour 接管 Kubernetes 的南北流量 在 Kubernetes 中运行大规模以 Web 为中心的工作负载,最关键的需求之一就是在 L7 ...
最新文章
- Oracle表与索引的分析及索引重建
- sigprocmask和sigsuspend转
- android studio 模拟器中文乱码
- 推荐:机器学习实战项目练手的平台
- 在用visio作图形界面设计,控件对齐的工具按钮
- 关于优酷开放SDK相应的mediaplayer的监听器的设置之setOnBufferingUpdateListener
- 【图文详解】JAVA字面量和变量
- oracle 存储过程挂起,library cache pin与PROCEDURE的重建
- 使用LAMP创建基于wordpress的个从博客网站
- JS+HTML画图的几种方法
- 初识Mysql(part13)--我需要知道的7条Mysql语句之更新和删除数据
- css动画-模拟正余弦曲线
- 洛谷P1080 国王游戏
- Tensorflow安装错误ERROR: Cannot uninstall ‘wrapt‘.
- C++算法学习(栈)
- npm shrinkwrap的用途
- 西湖论剑2020writeup
- C# 设计模式:创建型
- 今天14:00 | NeurIPS 专场三 青年科学家专场
- C# 获取IP地址、主机信息(Host)、浏览器信息
热门文章
- 自己的家用电脑怎么架设传奇私服??
- [Python爬虫]爬取新浪理财师股票问答
- 中职计算机技术教学计划,中职计算机应用基础教学计划.doc
- Linux Shell 内建命令 : sh命令详解
- 计算机词汇店名,电脑店名字200例
- HTML模仿静态京东登陆界面
- 算法:CLH锁的原理及实现
- c语言程序实现进程的管道通信,C 进程间通信--命名管道通信代码实现及其原理图示...
- 模糊查询银行卡号mysql_mysql模糊查询
- 基于vue技术栈制作自己的简历网站问题总结篇(入门vue基础项目)