k8s中的集群调度

文章目录

  • k8s中的集群调度
      • Pod 创建流程
    • 通过指定节点来创建pod所在的node节点
    • 通过标签来指定pod创建在哪个节点上
    • pod 的亲和性
    • Pod的亲和性和反亲和性
      • 亲和性(Affinity)
      • 反亲和性(Anti-Affinity)
    • 污点与容忍
      • 污点(Taint)
      • 容忍(Tolerations)

k8s中的集群调度

Kubernetes 是通过 List-Watch 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦

在 Kubernetes 集群中,Pod 是最小的部署单元,它包含一个或多个容器。Pod 的创建和调度是由 Kubernetes 的多个组件共同完成的,包括 API Server、Controller Manager、Scheduler 和 kubelet。本文将带您深入了解这一过程。

Pod 创建流程

  1. 用户请求:用户通过 kubectl 或其他 API 客户端向 API Server 发送创建 Pod 的请求。
  2. 存储请求:API Server 将 Pod 的元数据存储到 etcd 中。一旦存储成功,API Server 向客户端确认请求完成。
  3. 事件通知:etcd 在存储操作完成后,会向 API Server 发送一个创建事件。
  4. Controller Manager 监听:Controller Manager 通过 List-Watch 机制监听 API Server 的事件。当它接收到 Pod 创建事件时,会检查是否有对应的 Replication Controller (RC) 或其他控制器来确保所需的 Pod 副本数量。
  5. 调度准备:如果 Pod 副本数量不足,Controller Manager 会创建新的 Pod 副本,并在 API Server 中记录详细信息。
  6. Scheduler 监听:Scheduler 也通过 List-Watch 机制监听 API Server 的事件。当它接收到新的 Pod 创建事件时,它将决定将该 Pod 调度到哪个 Node 上。
  7. 调度决策:Scheduler 根据一系列的调度算法和策略(如资源需求、节点亲和性等)来选择最佳的 Node。
  8. 绑定 Pod:Scheduler 更新 Pod 的信息,包括其被调度到的 Node,并将这些信息写回 API Server,由 API Server 更新到 etcd。
  9. kubelet 监听:在每个 Node 上运行的 kubelet 通过 List-Watch 机制监听 API Server,等待被调度到该 Node 上的 Pod 事件。
  10. 容器启动:当 kubelet 发现有一个新的 Pod 被调度到它所在的 Node 时,它会调用 Docker(或其他容器运行时)来启动 Pod 中的容器。
  11. 状态反馈:kubelet 将 Pod 及其容器的状态反馈给 API Server,API Server 再将这些状态信息存储到 etcd 中。

通过指定节点来创建pod所在的node节点

没有设置指定节点时会通过调度器来进行pod创建的调度

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 4selector:matchLabels:app: web1template:metadata:labels:app: web1spec:containers:- name: nginximage: nginx:1.16ports:- containerPort: 80

在这里插入图片描述

可以看到pod节点会平均创建在node01 和 node02 上

通过指定节点来指定创建在node01节点上

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 4selector:matchLabels:app: web1template:metadata:labels:app: web1spec:nodeName: node01                           # 添加nodeName: node01 containers:- name: nginximage: nginx:1.16ports:- containerPort: 80

在这里插入图片描述

不通过调度器,直接通过指定节点将所有pod节点都部署在了node01节点上了

通过标签来指定pod创建在哪个节点上

给node节点添标签

kubectl label nodes node02 pji=a
kubectl label nodes node01 pji=b

在这里插入图片描述

可以看见node02 的标签为 pji=a ,node01 的标签为pji=b

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 4selector:matchLabels:app: web1template:metadata:labels:app: web1spec:nodeSelector:         #添加标签pji: a              #标签值pji: acontainers:- name: nginximage: nginx:1.16ports:- containerPort: 80

以上配置可以将pod节点部署到node02节点上

在这里插入图片描述

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 4selector:matchLabels:app: web1template:metadata:labels:app: web1spec:nodeSelector:       pji: bcontainers:- name: nginximage: nginx:1.16ports:- containerPort: 80

以上配置可以将pod部署到node01上

在这里插入图片描述

pod 的亲和性

在 Kubernetes 中,Pod 亲和性(Pod Affinity)是一种调度策略,用于确保 Pod 调度到特定的节点上。这种策略可以通过标签选择器(Label Selector)来实现,使得具有特定标签的 Pod 倾向于调度到具有相同标签的节点上。
Pod 亲和性可以分为以下几种类型:

  1. 软亲和性(Soft Affinity)
    • podAffinityTerm:指定 Pod 应该调度的节点集合。
    • preferredDuringSchedulingIgnoredDuringExecution:定义 Pod 应该优先调度到哪些节点上。
  2. 硬亲和性(Hard Affinity)
    • podAffinityTerm:指定 Pod 必须调度的节点集合。
    • requiredDuringSchedulingIgnoredDuringExecution:定义 Pod 必须调度到哪些节点上。
      例如,如果您有一个包含两个节点的集群,并且希望将特定的 Pod 调度到具有标签 node-role.kubernetes.io/master: "" 的节点上,

硬策略 匹配标签pji=a的node的节点配置如下

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 4selector:matchLabels:app: web1template:metadata:labels:app: web1spec:containers:- name: nginximage: nginx:1.16ports:- containerPort: 80affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: pjioperator: Invalues:- a

在这里插入图片描述

若是配置一个不存在的标签这会如下

在这里插入图片描述

出现Pending状态

软策略

设置标签为bcde但是此集群没有标签bcde的主机

apiVersion: apps/v1
kind: Deployment
metadata:name: web1labels:app: web1
spec:replicas: 20selector:matchLabels:app: web1template:metadata:labels:app: web1spec:containers:- name: nginximage: nginx:1.16ports:- containerPort: 80affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1preference:matchExpressions:- key: pjioperator: Invalues:- bcde

在这里插入图片描述

则会调度在node01 (b)和 node02©上

Pod的亲和性和反亲和性

在 Kubernetes 中,亲和性(Affinity)和反亲和性(Anti-Affinity)是调度策略的一部分,用于影响 Kubernetes 调度器如何将 Pod 调度到集群中的节点上。这些特性可以帮助您确保 Pod 之间或 Pod 与节点之间保持特定的关系。

亲和性(Affinity)

亲和性是指调度器倾向于将 Pod 调度到满足特定条件的节点上。它包括以下几种类型:

  1. 节点亲和性(Node Affinity)
    • 软亲和性(Soft Affinity):如果节点不满足条件,调度器可以忽略亲和性。
    • 硬亲和性(Hard Affinity):如果节点不满足条件,调度器将不会调度 Pod。
  2. Pod 亲和性(Pod Affinity)
    • 软亲和性:如果其他 Pod 不满足条件,调度器可以忽略亲和性。
    • 硬亲和性:如果其他 Pod 不满足条件,调度器将不会调度 Pod。
  3. Pod 反亲和性(Pod Anti-Affinity)
    • 软反亲和性:如果其他 Pod 不满足条件,调度器可以忽略反亲和性。
    • 硬反亲和性:如果其他 Pod 不满足条件,调度器将不会调度 Pod。

反亲和性(Anti-Affinity)

反亲和性是亲和性的对立面。与亲和性不同,反亲和性用于防止 Pod 调度到某些节点上,或者避免与某些 Pod 一起调度。反亲和性通常用于避免资源争用或实现高可用性。

亲和性配置

apiVersion: v1
kind: Pod
metadata:name: web5labels:app: web2
spec:containers:- name: nginximage: nginx:1.16ports:- containerPort: 80affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- web2                      # 在有pod标签app=web2的标签上创建topologyKey: pji                #在拥有pji标签的节点上创建

在这里插入图片描述

反亲和性

apiVersion: v1
kind: Pod
metadata:name: web5labels:app: web1
spec:containers:- name: nginximage: nginx:1.14ports:- containerPort: 80affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: "app"operator: Invalues:- web2topologyKey: "kubernetes.io/hostname"

之前的pod标签为web2 ,设置非亲缘性后 web5创建会避开node02

在这里插入图片描述

当然可以。

污点与容忍

污点(Taint)

污点是向节点添加的一个标签,它告诉 Kubernetes 调度器不要将 Pod 调度到具有该污点的节点上。这通常用于防止 Pod 调度到不希望它们运行的节点上,例如,当节点正在进行维护或出现问题时。
污点可以具有以下三个属性:

  • 键(Key):污点的键,用于标识污点。
  • 值(Value):与键关联的值。
  • 效果(Effect):当污点匹配时,Pod 应该受到的影响。有效果包括 NoSchedulePreferNoScheduleNoExecute

污点的创建

给node01创建一个键值对为ry=87的污点,使用NoSchedule策略

kubectl taint node node01 ry=87:NoSchedule

在这里插入图片描述

apiVersion: v1
kind: Pod
metadata:name: nginx4labels:app: nginx
spec:containers:- name: nginximage: nginx:latestports:- containerPort: 80

创建新的Pod都创建在node02下,而不会创建在node01上

在这里插入图片描述

容忍(Tolerations)

容忍是 Pod 上的一个标签,它告诉 Kubernetes 调度器,尽管节点具有某个污点,但该 Pod 应该被调度到该节点上。容忍可以有多个键值对,并且可以设置不同的效果和时间范围。

设置容忍

apiVersion: v1
kind: Pod
metadata:name: nginx4labels:app: nginx
spec:containers:- name: nginximage: nginx:latestports:- containerPort: 80tolerations:- key: "ry"operator: "Equal"value: "87"effect: "NoSchedule"

在这里插入图片描述

可以看见,node01的污点被无视了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/19379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cache入门详解

一、概述 1.1缓存介绍 Spring提供了一套cache缓存抽象(注解/接口),使基于spring缓存的使用与实现解耦 默认实现,Spring JDK ConcurrentMap-based Cache第三方实现,caffeine/Ehcache/Redis等 https://docs.spring.io/spring-framework/do…

Postman快捷功能-快速填写请求头

大家好,之前给大家分享关于 Postman 工具的基础使用,今天给大家介绍一个快捷功能,可以一定程度提高我们使用 Postman 工具的效率,在我们进行接口测试时,几乎每个接口都需要填写 Headers,且 Headers 中的参数…

【ai】livekit服务本地开发模式2:模拟1个发布者

是一个会议用软件:LiveKit is an open source project that provides scalable, multi-user conferencing based on WebRTC. It’s designed to provide everything you need to build real-time video audio data capabilities in your applications.LiveKit’s server is wr…

【Python】 Django 框架如何支持百万级日访问量

基本原理 Django 是一个高级的 Python Web 框架,它鼓励快速开发和干净、实用的设计。Django 遵循 MVC(模型-视图-控制器)设计模式,允许开发者通过编写更少的代码来构建高质量的 Web 应用程序。Django 自带了许多内置功能&#xf…

发现没:随便搞个B端页面,就想在客户那里过关,难啦。

客户对B端界面要求越来越高的原因可以有以下几点: 用户体验要求提升:随着用户对移动应用和网页的使用经验增加,他们对于界面的交互、流畅性和易用性要求也越来越高。他们希望能够在使用B端应用时,能够快速、方便地完成任务&#…

设计模式详解(六):适配器模式——Adapter

目录导航 适配器模式及其作用现实生活举例 适配器模式的好处适配器模式的实现关系图实现步骤 适配器模式的适用场景适配器模式示例 适配器模式及其作用 适配器模式是一种结构型设计模式。所谓结构型是指在代码结构方面的设计模式。适配器模式作为中间层,可以让交互…

Vue3 图片或视频下载跨域或文件损坏的解决方法

Vue3 图片或视频下载跨域或文件损坏的解决方法 修改跨域配置文件下载方法 修改跨域配置文件 修改vite.config.ts文件proxy里面写跨域地址,如下图,图片地址就是我们要跨域的目标地址: 下载方法 如下就是我取消上面那句后的报错 然后调用两…

【Java】Sping Boot中使用Javax Bean Validation

目录 Javax Bean Validation在Spring Boot中集成Javax Bean Validation使用案例功能测试配置全局异常处理器重新测试返回特定形式的信息方式一方式二 附:常用的注解 Javax Bean Validation Javax Bean Validation是Java平台的一项规范,旨在提供一种简单…

想知道股指期货和期权有什么不同吗?

市场上目前有中金所的沪深300ETF,中证500和中证1000股指期货,期权市场有上证50ETF,沪深300etf和中证500ETF期权,股指期货和期权在买卖双方的权利义务、风险收益特征、保证金制度、上市合约数量等方面均有较大区别,下文…

每天学点小知识:Windows终端Powershell美化

前言 本章的旨在教会你美化自己的终端,powershell需要以管理员运行 经过我的测试,不同的电脑可能会有不同的报错,具体操作根据官方为主https://ohmyposh.dev/docs 效果展示 Oh My Posh:提供美观的 PowerShell 提示符主题 1.安装…

揭秘CISA:你不知道的信息安全认证,轻松掌握职场先机!

在当今的信息化时代,信息系统的安全和稳定是企业和组织的重要资产。信息系统审计是一项专业的工作,需要具备丰富的知识和经验,以及敏锐的洞察力和判断力。信息系统审计师是信息系统审计领域的专业人士,他们负责对信息系统的设计、…

【OpenGL实践12】关于缓存区Framebuffer的运用

文章目录 一、说明二、帧缓冲区三、创建新的帧缓冲区四、附属装饰4.1 纹理图像4.2 渲染缓冲区对象图像 五、使用帧缓冲区5.1 后期处理5.2 更改代码 六、后期处理效果6.1 色彩处理6.2 模糊6.3 Sobel算子 七、结论练习 一、说明 关于FrameBuffer的使用,是OpenGL的高级…

横截面分位数回归

一、分位数回归简介 分位数回归(英语:Quantile regression)是回归分析的方法之一。最早由Roger Koenker和Gilbert Bassett于1978年提出。一般地,传统的回归分析研究自变量与因变量的条件期望之间的关系,相应得到的回归…

AI时代的服装设计师--AIGC

AI时代的服装设计师--AIGC AIGCAIGC设计能替代真正的设计师吗森马T恤设计AIGC优势、优化 本文记录于去年参加的一次森马T恤设计活动的感受。 AIGC 可以说,近期以来,随着ChatGPT的不断发展,从ChatGPT-3到ChatGPT-4的飞速发展,AIGC…

Windows和Linux系统部署Docker(2)

目录 一、Linux系统部署docker 前置环境: 1.安装需要的软件包, yum-util 提供yum-config-manager功能 2.添加阿里云 docker-ce 仓库 3.安装docker软件包 4.启动 docker并设置开机自启 5.查看版本: 二、windows系统部署docker 1.查看…

Type ‘null‘ is not assignable to type ‘T‘. - ArkTSCheck

设置泛型将参数配置为 null 时抛出了如下异常: Type null is not assignable to type T. T could be instantiated with an arbitrary type which could be unrelated to null. <ArkTSCheck> 解决办法 在 null 后面添加 ! 即可,以表示该值不会为 null data: T null! 以…

Qt 基于FFmpeg的视频转换器 - 转GIF动图

Qt 基于FFmpeg的视频转换器 - 转GIF动图 引言一、设计思路二、核心源码三、参考链接 引言 gif格式的动图可以通过连续播放一系列图像或视频片段来展示动态效果&#xff0c;使信息更加生动形象&#xff0c;可以很方便的嵌入到网页或者ppt中。上图展示了视频的前几帧转为gif动图的…

基于Paraformer的alpha-token强制对齐

1. 基本原理 CIF 作为Parafoemr的核心模块&#xff0c;用于预测字数和生成声学向量&#xff0c;从而实现了单轮非自回归解码。其中字数的预测主要通过encoder输出系数alpha的累计得分&#xff0c;满足通关阈值β1.0即可产生一个token&#xff0c;其中alpha曲线在一定程度上呈现…

CSS:浮动

▐ 文档流&#xff1a; 由于网页默认是一个二维平面&#xff0c;当我们在网页中一行行摆放标签时&#xff0c;块标签会独占一行&#xff0c;行标签则只占自身大小&#xff0c;这种情况下要实现网页布局就很麻烦了&#xff0c;所以我们就需要通过一些方法来改变这种默认的布局方…

centos7离线安装pthon3.8

centos7离线安装pthon3.8 因服务器无外网环境&#xff0c;所以事先需要把所有离线的依赖都准备好。 安装前的准备 先在有外网环境的机器上准备依赖 安装 centos-release-scl 第三方yum源 yum install centos-release-scl安装 yum 依赖下载插件 yum install yum-plugin-do…