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: web1
  labels:
    app: web1
spec:
  replicas: 4
  selector:
    matchLabels:
      app: web1
  template:
    metadata:
      labels:
        app: web1
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
          - containerPort: 80

在这里插入图片描述

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web1
  labels:
    app: web1
spec:
  replicas: 4
  selector:
    matchLabels:
      app: web1
  template:
    metadata:
      labels:
        app: web1
    spec:
      nodeName: node01                           # 添加nodeName: node01 
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
          - 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: web1
  labels:
    app: web1
spec:
  replicas: 4
  selector:
    matchLabels:
      app: web1
  template:
    metadata:
      labels:
        app: web1
    spec:
      nodeSelector:         #添加标签
        pji: a              #标签值pji: a
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
          - containerPort: 80

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

在这里插入图片描述

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web1
  labels:
    app: web1
spec:
  replicas: 4
  selector:
    matchLabels:
      app: web1
  template:
    metadata:
      labels:
        app: web1
    spec:
      nodeSelector:       
        pji: b
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
          - 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: web1
  labels:
    app: web1
spec:
  replicas: 4
  selector:
    matchLabels:
      app: web1
  template:
    metadata:
      labels:
        app: web1
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
          - containerPort: 80
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: pji
                operator: In
                values:
                - a

在这里插入图片描述

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

在这里插入图片描述

出现Pending状态

软策略

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

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web1
  labels:
    app: web1
spec:
  replicas: 20
  selector:
    matchLabels:
      app: web1
  template:
    metadata:
      labels:
        app: web1
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
        - containerPort: 80
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: pji
                operator: In
                values:
                - 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: web5
  labels:
    app: web2
spec:
  containers:
  - name: nginx
    image: nginx:1.16
    ports:
    - containerPort: 80
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - web2                      # 在有pod标签app=web2的标签上创建
        topologyKey: pji                #在拥有pji标签的节点上创建

在这里插入图片描述

反亲和性

apiVersion: v1
kind: Pod
metadata:
  name: web5
  labels:
    app: web1
spec:
  containers:
  - name: nginx
    image: nginx:1.14
    ports:
    - containerPort: 80
  affinity:
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: "app"
              operator: In
              values:
              - web2
          topologyKey: "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: nginx4
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

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

在这里插入图片描述

容忍(Tolerations)

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

设置容忍

apiVersion: v1
kind: Pod
metadata:
  name: nginx4
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
  tolerations:
  - key: "ry"
    operator: "Equal"
    value: "87"
    effect: "NoSchedule"


在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年,史上最强的数据库资料集合

💨🏹🌀 2024年,史上最强的数据库资料集合 N种数据库的全方位整理: mysql,mariaDB,Percona Server,Redis,RocksDB,Cassandra,CouchDB&#xff0c…

【LeeCode算法】第67题:二进制求和

目录 一、题目描述 二、初次解答 三、官方解法 四、总结 一、题目描述 二、初次解答 1. 思路:将a和b两个字符串转换成十进制,然后将相加的结果转换回文本的二进制。 2. 代码: char* addBinary(char* a, char* b) {int a_len strlen(a);i…

保障餐饮场所安全:可燃气体报警器专业检测的必要性

在餐饮行业,火灾隐患一直是备受关注的问题。为了有效预防和及时发现可燃气体泄漏,可燃气体报警器的专业检测周期显得尤为重要。 今天,佰德和大家一起来深入了解一下可燃气体报警器的专业检测周期,若您对此有不同的观点或其他的问…

鸿蒙ArkUI-X跨语言调用说明:【平台桥接开发指南(Android)BridgePlugin】

BridgePlugin (平台桥接) 本模块提供ArkUI端和Android平台端消息通信的功能,包括数据传输、方法调用和事件调用。需配套ArkUI端API使用,ArkUI侧具体用法请参考[Bridge API]。 说明: 开发前请熟悉鸿蒙开发指导文档: gitee.com/li-…

OSPF优化——OSPF减少LSA更新量2

二、特殊区域——优化非骨干区域的LSA数量 不是骨干区域、不能存在虚链路 1、不能存在 ASBR 1)末梢区域 该区域将拒绝 4、5LSA的进人,同时由该区域连接骨干0区域的ABR 向该区域,发布一条3类的缺省路由; 该区域内每台路由器均需配置&#xf…

1---Linux下进程的概念(逻辑推导,全干货无废话)

一、进程和程序: 1.1什么是程序? 程序由代码、数据、逻辑、接口和文档组成的一组按特定顺序执行的计算机指令,用于实现特定功能或解决问题。程序存储在磁盘上。 1.2什么是进程? 进程是一个正在执行的程序实例,包含程…

LLM提示工程的技巧

1. 从简单开始(Start Simple) 避免在一开始就增加太多的复杂性。 从简单的提示开始,然后在后续提示中添加更多信息和上下文。 这样,提示就是一个迭代过程,提示在此过程中进一步发展。 从简单的开始,就有足…

Matplotlib绘图指南:从基础绘图到多子图展示

目录 前言 导入模块 第一点:绘制图像 第二点:保存图像 第三点:多图形的绘制 第四点:绘制多子图 总结 前言 在数据可视化中,Matplotlib是一款强大的Python库,提供了丰富的功能来绘制各种类型的图表。…

【Linux】自己实现一个bash进程

bash就是命令行解释器,就是Linux操作系统让我们看到的,与用户进行交互的一种外壳(shell),当然了bash也是一个进程,它有时候就是通过创建子进程来执行我们输入的命令的。这无疑就离不开我们上篇博客所说的进…

Python零基础一天丝滑入门教程(非常详细)

目录 第1章 初识python 第1节 python介绍 1.为什么要学习Python? 2.python排名 3.python起源 4.python 的设计目标 第2节 软件安装 第2章 快速上手:基础知识 第1节 Python3 基础语法 Python 变量 字面量 数据类型转换 Python3 注释 数据类…

《java数据结构》--队列详解

一.认识队列🐱 初识队列😸 队列和栈类似都对数据的存取有着严格的要求,不同的是栈遵循先进后出的原则,而队列遵循先进先出的原则,栈是只有一端可以存取,队列是一端存,一端取。这里我来画一个图…

Java的类路径究竟是什么?

回答 问了chatgpt这个问题,首先类路径的定义是: 是指一组路径,这些路径告诉Java虚拟机(JVM)和类加载器在哪里可以找到应用程序所需的类和资源文件。说白了就是在运行java程序的时候需要先将java源代码编译成class文件…

Layui 项目打开左侧菜单空白解决方案

home/index.html 页面中 替换 navigation 为 menu

网络安全行为可控定义以及表现内容简述

在数字化快速发展的今天,网络安全已成为国家和企业不可或缺的防线。据统计,网络攻击事件频发,给全球经济带来了巨大损失。因此,确保网络安全行为可控显得尤为重要。今天我们来聊聊网络安全行为可控定义以及表现内容。 网络安全行为…

【Rust日报】Rust 中的形式验证

文章 - 未来的愿景:Rust 中的形式验证 这篇文章回顾了形式化验证的基本概念,作者展示了如何使用 Hoare triples 来描述和推理程序的正确性,以及如何使用分离逻辑来解决验证的复杂性。文章还解释了为什么 Rust 适用于形式化验证,以…

Java程序员必备技能之MySQL数据库 图解整理/快速入门

恭喜大家来到全新的篇章——MySQL数据库,这一篇我们将学会MySQL数据库的原理、使用sql对数据库的增删改查操作、以及对MySQL数据库的权限管理和用户管理等内容。请大家耐心看下去,相信大家在看完这篇文章后,一定可以学会MySQL数据库(不会Java也可以学会!)。 ps:想要补充…

Shell脚本基本命令

文件名后缀.sh 编写shell脚本一定要说明一下在#!/bin/bash在进行编写。命令选项空格隔开。Shell脚本是解释的语言,bash 文件名即可打印出编写的脚本。chmod给权限命令。如 chmod 0777 文件名意思是给最高权限。 注意:count赋值不能加空格。取消变量可在变…

菜鸟学dubbo 2.x配置笔记(更新中)

一、标签示例 provider.xml 示例 <beans xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo"http://dubbo.apache.org/schema/dubbo"xmlns"http://www.springframework.org/schema/beans"xsi:schemaLocation"http://w…

树莓派开箱

1.树莓派4B配置 CPU&#xff1a;64位1.5GHZ四核处理器。 GPU:Broadcom VideoCore VI500MHZ 蓝牙5.0 电源Type C(5V 3A),也可以使用排针链接5V锂电池最大放电电流必须达到3A。 还有千兆以太网等以后用到再说。 接下来进入文章重点 2.镜像文件烧录 前期准备&#xff1a;1…

java项目之飘香水果购物网站(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的飘香水果购物网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 飘香水果购物网站的主要…