欢迎访问我的GitHub

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

本篇概览

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

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

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

亲和性一览

  • 这里将亲和性先分类,便于理解
graph LR

A(亲和性)-->B1(节点亲和性);
A-->B2(Pod亲和性);
B1-->C1(硬亲和性-required);
B1-->C2(软亲和性-preferred);
B2-->C3(硬亲和性-required);
B2-->C4(软亲和性-preferred);
B2-->C5(反亲和性);

节点亲和性和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: nginx
image: nginx
  • 功能与nodeSelector类似,用的是匹配表达式,可以被理解为新一代节点选择器
  • 不满足硬亲和性条件时,pod为Pending状态
  • 在预选阶段,节点硬亲和性被用于预选策略MatchNodeSelector

节点亲和性:软亲和性

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

  • 示例:

apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy-with-node-affinity
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx
labels:
app: nginx
spec:
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 60
preference:
matchExpressions:
- {key: zone, operator: In, values: ["foo"]}
- weight: 30
preference:
matchExpressions:
- {key: ssd, operator: Exists, values: []}
containers:
- name: nginx
image: 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/hostname
containers:
- name: nginx
image: nginx
  1. 调度逻辑:
graph TD

A[1. 用matchExpressions的规则app=tomcat搜索] -->B(2. 找到tomcat的pod,也就确定了该pod的节点,假设是A节点)
B --> C(3. topologyKey是kubernetes.io/hostname,所以去找A节点kubernetes.io/hostname标签的值,假设是xxx)
C --> D(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: 4
selector:
matchLabels:
app: myapp
template:
metadata:
name: myapp
labels:
app: myapp
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- {key: app, operator: In, values: ["myapp"]}
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx
  • 如果集群中只有三个节点,那么执行上述yaml的结果就是最多创建三个pod,另一个始终处于pending状态

参考

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

Kubernetes亲和性学习笔记的更多相关文章

  1. 【转】Kubernetes scheduler学习笔记

    简介 Kubernetes是一个强大的编排工具,可以用来很方便的管理许多台机器,为了使机器的资源利用率提高,同时也尽可能的把压力分摊到各个机器上,这个职责就是由scheduler来完成的. Kuber ...

  2. kubernetes CRD学习笔记

    前言 最近在极客时间订阅了kubernetes的专栏,这篇文章是想记录一下自己学习CRD(custom resource definition)的过程,加深一下记忆. 准备工作 首先安装一下我们用的g ...

  3. Kubernetes学习笔记(四):服务

    服务介绍 服务是一种为一组相同功能的pod提供单一不变接入点的资源.当服务存在时,他的IP和端口不会改变.客户端通过IP和端口建立连接,这些连接会被路由到任何一个pod上.如此,客户端不需要知道每个单 ...

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

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

  5. Kubernetes 学习笔记(一):基础概念

    个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...

  6. Kubernetes学习笔记(八):Deployment--声明式的升级应用

    概述 本文核心问题是:如何升级应用. 对于Pod的更新有两种策略: 一是删除全部旧Pod之后再创建新Pod.好处是,同一时间只会有一个版本的应用存在:缺点是,应用有一段时间不可用. 二是先创建新Pod ...

  7. Kubernetes学习笔记之认识Kubernetes组件

    前言:笔记知识点来源于Kubernetes官方文档说明,链接:https://kubernetes.io/docs/concepts/overview/components/ ,本记录仅仅是学习笔记记 ...

  8. KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)

    目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...

  9. KPROCESS IDT PEB Ldr 《寒江独钓》内核学习笔记(3)

    继续上一篇(2)未完成的研究,我们接下来学习 KPROCESS这个数据结构. 1. 相关阅读材料 <深入理解计算机系统(原书第2版)> 二. KPROCESS KPROCESS,也叫内核进 ...

  10. Flink学习笔记-新一代Flink计算引擎

    说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...

随机推荐

  1. 【能力提升】SQL Server常见问题介绍及快速解决建议

    前言 本文旨在帮助SQL Server数据库的使用人员了解常见的问题,及快速解决这些问题.这些问题是数据库的常规管理问题,对于很多对数据库没有深入了解的朋友提供一个大概的常见问题框架. 下面一些问题是 ...

  2. Job for nginx.service failed because the control process exited with error code.

    1. nginx启动报错: Job for nginx.service failed because the control process exited with error code. See & ...

  3. Python网页应用开发神器fac 0.2.6版本重要新功能一览

    fac项目地址:https://github.com/CNFeffery/feffery-antd-components ,欢迎star支持 大家好我是费老师,距离我的开源Python网页应用通用组件 ...

  4. SignalR服务端及客户端实现

    服务器端: 引用nuget: 1.Microsoft.AspNet.SignalR.SelfHost 2.Microsoft.Owin.Cors internal class Program { st ...

  5. Java设计模式【单例模式】

    Java设计模式[单例模式] 单例模式 单例模式(Singleton Pattern)是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供对该实例的唯一访问点. 优缺点 优点: 提供了对唯 ...

  6. 6R机械臂运动规划及仿真

    博客地址:https://www.cnblogs.com/zylyehuo/ 参考链接 Moveit!机械臂控制 文件下载-古月ROS教程视频配套资料 解决Could not find a packa ...

  7. 配置pip源

    1.使用配置文件配置文件[global]trusted-host=pypi.doubanio.comindex-url=https://pypi.doubanio.com/simple配置文件放置位置 ...

  8. ET介绍——组件式设计(优化版的ECS)

    组件式设计 在代码复用和组织数据方面,面向对象可能是大家第一反应.面向对象三大特性继承,封装,多态,在一定程度上能解决不少代码复用,数据复用的问题.不过面向对象不是万能的,它也有极大的缺陷: 1. 数 ...

  9. ENVI手动地理配准栅格图像的方法

      本文介绍在ENVI软件中,手动划定地面控制点从而实现栅格图像相互间地理配准的方法:其中,所用软件版本为ENVI Classic 5.3 (64-bit).   首先,在软件中同时打开两景需要进行地 ...

  10. R 语言绘制环状热图

    作者:佳名来源:简书 - R 语言文集 1. 读取并处理基因表达数据 这是我的基因表达量数据: 图 Fig 1 > myfiles <- list.files(pattern = &quo ...