DEVOPS: 集群伸缩原理

概述

  • 阿里云 K8S 集群的一个重要特性,是集群的节点可以动态的增加或减少
  • 有了这个特性,集群才能在计算资源不足的情况下扩容新的节点,同时也可以在资源利用
    率降低的时候,释放节点以节省费用
  • 理解实现原理,在遇到问题的时候,我们就可以高效地排查并定位原因
  • 我们的讨论基于1.12.6 版本

节点增加原理

  • 阿里云 K8S 集群可以给集群增加节点的方式有,添加已有节点,集群扩容,和自动伸缩
  • 其中,添加已有节点又可分为手动添加已有节点和自动添加已有节点
  • 节点的增加涉及到的组件有,节点准备,弹性伸缩(ESS),管控,Cluster Autoscaler 以及调度器

手动添加已有节点

  • 节点准备,其实就是把一个普通的 ECS 实例,安装配置成为一个 K8S 集群节点的过程
  • 这个过程仅靠一条命令就可以完成,这条命令使用 curl 下载 attach_node.sh 脚本
  • 然后以 openapi token 为参数,在 ECS 上运行
  • curl http:///public/pkg/run/attach//attach_node.sh | bash -s – --openapi-token
    • 这里 token 是一个对的 key,而 value 是当前集群的基本信息
    • 阿里云 K8S集群的管控,在接到手动添加已有节点请求的时候
    • 会生成这个对,并把 key 作为token 返回给用户
    • 这个 token(key)存在的价值,是其可以让 attach_node.sh 脚本
    • 以匿名身份在 ECS 上索引到集群的基本信息(value)
    • 而这些基本信息,对节点准备至关重要
  • 总体上来说,节点准备就做两件事情,读和写,读即数据收集,写即节点配置
  • 这里的读写过程,绝大部分都很基础,大家可以通过阅读脚本来了解细节
  • 唯一需要特别说明的是,kubeadm join 把节点注册到 Master 的过程
  • 此过程需要新加节点和集群 Master 之间建立互信
  • 一边,新加节点从管控处获取的 bootstrap token
    • 与 openapi token 不同,此token 是 value 的一部分内容
    • 实际上是管控通过可信的途径从集群 Master 上获取的
    • 新加节点使用这个 bootstrap token 连接 Master
    • Master 则可通过验证这个 bootstrap token 来建立对新加节点的信任
  • 另一边,新加节点以匿名身份从 Master kube-public 命名空间中获取集群cluster-info
    • cluster-info 包括集群 CA 证书,和使用集群 bootstrap token 对这个 CA 做的签名
    • 新加节点使用从管控处获取的 bootstrap token
    • 对 CA 生成 b 新的签名,然后将此签名与 cluster-info 内签名做对比
    • 如果两个签名一致,则说明cluster-info 和 bootstrap token 来自同一集群
    • 新加节点因为信任管控,所以建立对 Master 的信任

自动添加已有节点

  • 自动添加已有节点,不需要人为拷贝黏贴脚本到 ECS 命令行来完成节点准备的过程
  • 管控使用了 ECS userdata 的特性,把类似以上节点准备的脚本,写入ECS userdata
  • 然后重启 ECS 并更换系统盘。当 ECS 重启之后,会自动执行 Userdata 里边的脚本
  • 来完成节点添加的过程。这部分内容,大家其实可以通过查看节点 userdata 来确认

!/bin/bash

mkdir -p /var/log/acs
curl http:///public/pkg/run/attach/1.12.6-aliyun.1/attach_node.sh | bash
-s -- --docker-version --token --endpoint --cluster-dns > /var/log/acs/init.log
  • 这里我们看到,attach_node.sh 的参数,与前一节的参数有很大的不同
  • 其实这里的参数,都是前一节 value 的内容,即管控创建并维护的集群基本信息
  • 自动添加已有节点省略了通过 key 获取 value 的过程

集群扩容

  • 集群扩容与以上添加已有节点不同,此功能针对需要新购节点的情形
  • 集群扩容的实现,在添加已有节点的基础上,引入了弹性伸缩 ESS 组件
  • ESS 组件负责从无到有的过程,而剩下的过程与添加已有节点类似
  • 即依靠 ECS userdata 脚本来完成节点准备
  • 下图是管控通过 ESS 从无到有创建 ECS 的过程

自动伸缩

  • 前边三种方式是需要人为干预的伸缩方式,而自动伸缩的本质不同
  • 是它可以在业务需求量增加的时候,自动创建 ECS 实例并加入集群
  • 为了实现自动化,这里引入了另外一个组件 Cluster Autoscaler
  • 集群自动伸缩包括两个独立的过程
  • 其中第一个过程,主要用来配置节点的规格属性,包括设置节点的用户数据
  • 这个用户数据和手动添加已有节点的脚本类似,不同的地方在于,其针对自动伸缩这种场景,增加了一些专门的标记
  • attach_node.sh 脚本会根据这些标记,来设置节点的属性

!/bin/sh

curl http:///public/pkg/run/attach/1.12.6-aliyun.1/attach_node.sh | bash -s -- --openapi-token --ess true --labels k8s.io/cluster-autoscaler=true,workload_type=cpu,k8s.aliyun.com=true
  • 而第二个过程,是实现自动增加节点的关键
  • 这里引入了一个新的组件 Autoscaler,它以 Pod 的形式运行在 K8S 集群中
  • 理论上来说,我们可以把这个组件当做一个控制器
  • 因为它的作用与控制器类似,基本上还是监听 Pod 状态
  • 以便在 Pod 因为节点资源不足而不能被调度的时,去修改 ESS 的伸缩规则来增加新的节点
  • 这里有一个知识点,集群调度器衡量资源是否充足的标准,是“预订率”,而不是“使用率”
  • 这两者的差别,类似酒店房价预订率和实际入住率:
    • 完全有可能有人预订了酒店
    • 但是并没有实际入住
  • 在开启自动伸缩功能的时候,我们需要设置缩容阈值,就是“预订率”的下线
  • 之所以不需要设置扩容阈值。是因为 Autoscaler 扩容集群
  • 依靠的是 Pod 的调度状态:当 Pod 因为节点资源“预订率”太高无法被调度的时候 Autoscaler 就会扩容集群

节点减少原理

  • 与增加节点不同,集群减少节点的操作只有一个移除节点的入口
  • 但对于用不同方法加入的节点,其各自移除方式略有不同
  • 首先,通过添加已有节点加入的节点,需要三步去移除:
    • 管控通过 ECS API 清楚 ECS userdata;
    • 管控通过 K8S API 从集群中删除节点;
    • 管控通过 ECS Invoke-Command 在 ECS 上执行 kubeadm reset 命令清理节点
  • 其次,通过集群扩容加入的节点,则在上边的基础上,增加了断开 ESS 和 ECS 关系的操作,此操作由管控调用 ESS API 完成
  • 最后,经过 Cluster Autoscaler 动态增加的节点,则在集群 CPU 资源“预订率”降低的时候,由 Cluster Autoscaler 自动移除释放
  • 其触发点是 CPU“预订率”,即上图写 Metrics 的原因

总结

  • 总体上来说,K8S 集群节点的增加与减少,主要涉及四个组件,分别是 Cluster
    Autoscaler,ESS,管控以及节点本身(准备或清理)
  • 根据场景不同,我们需要排查不同的组件
    • 其中 Cluster Autoscaler 是一个普通的 Pod,其日志的获取和其他Pod 无异
    • ESS 弹性伸缩有其专门的控制台
    • 我们可以在控制台排查其伸缩配置、伸缩规则等相关子实例日志和状态
    • 而管控的日志,可以通过查看日志功能来查看
  • 最后,对于节点的准备与清理,其实就是排查对应的脚本的执行过程

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

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

相关文章

Linux系统解压分卷压缩文件的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【CUDA代码实践03】m维网格n维线程块对二维矩阵的索引

文章目录 一、数据存储方式二、二维网格二维线程块三、二维网格一维线程块四、一维网格一维线程块 为了方便下次找到文章,也方便联系我给大家提供帮助,欢迎大家点赞👍、收藏📂和关注🔔!一起讨论技术问题&am…

低功耗4G模组:FTP应用示例

一、FTP 概述 FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。 FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。 其中FTP服务器用来存储文件,用户可以使用FTP客户…

鸿蒙UI开发——基于组件安全区方案实现沉浸式界面

1、概 述 本文是接着上篇文章 鸿蒙UI开发——基于全屏方案实现沉浸式界面 的继续讨论。除了全屏方案实现沉浸式界面外,我们还可以使用组件安全区的方案。 当我们没有使用setWindowLayoutFullScreen()接口设置窗口为全屏布局时,默认使用的策略就是组件安…

智慧税务管理:金融企业报税效率与合规性提升

前言 在数字化浪潮席卷全球的今天,金融行业正面临前所未有的挑战与机遇。如何在复杂的税务环境中保持合规并提高效率,已成为每个金融企业的重中之重。今天小编就为大家介绍一下如何通过借助智能税务平台,实现税务管理的智能化革新&#xff0…

Docker 常用命令全解析:提升对雷池社区版的使用经验

Docker 常用命令解析 Docker 是一个开源的容器化平台,允许开发者将应用及其依赖打包到一个可移植的容器中。以下是一些常用的 Docker 命令及其解析,帮助您更好地使用 Docker。 1. Docker 基础命令 查看 Docker 版本 docker --version查看 Docker 运行…

华为OD机试 - 无向图染色(Java 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

Python+pandas读取Excel将表头为键:对应行为值存为字典—再转json

目录 专栏导读1、库的介绍2、库的安装3、核心代码4、方法1:5、方法2总结专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注 👍 该系列文章专栏:请点击——>Python办公自…

摸鱼小工具-窗口隐藏透明

摸鱼小工具-窗口隐藏透明 介绍 就很简单的一个工具,鼠标移上去显示,鼠标离开就透明。具体看图。 源码以及下载地址

vue封装信号强度

图标下载链接: https://pan.baidu.com/s/1828AidkCKU1KTkw1SvBwQg?pwd4k7n 共五格信号 信号5为绿色,信号4为绿色,信号3为黄色,信号2为黄色,信号1为红色,信号0为灰色。 子组件 /components/SignalStrength/index.vu…

使用常数指针作为函数参数

在main.cpp里输入程序如下&#xff1a; #include <iostream> //使能cin(),cout(); #include <iomanip> //使能setbase(),setfill(),setw(),setprecision(),setiosflags()和resetiosflags(); //setbase( char x )是设置输出数字的基数,如输出进制数则用setbas…

简易了解Pytorch中的@ 和 * 运算符(附Demo)

目录 1. 基本知识2. 3. * 1. 基本知识 在 PyTorch 中&#xff0c; 和 * 运算符用于不同类型的数学运算&#xff0c;具体是矩阵乘法和逐元素乘法 基本知识 运算符功能适用场景示例矩阵乘法&#xff08;或点乘&#xff09;用于执行线性代数中的矩阵乘法C A B&#xff0c;其中…

VulkanTutorial(8·Shader modules)

Shader modules 与早期的API不同&#xff0c;Vulkan中的着色器代码必须以字节码格式指定&#xff0c;而不是人类可读的语法&#xff0c;如GLSL和HLSL。这种字节码格式称为SPIR-V它是一种可用于编写图形和计算着色器的格式 使用像SPIR-V这样简单的字节码格式&#xff0c;不会面…

读数据工程之道:设计和构建健壮的数据系统23批量获取的考虑因素

1. 批量获取的考虑因素 1.1. 批量获取&#xff0c;通常是获取数据的一种便捷方式 1.1.1. 通过从源系统中抽取一个数据子集&#xff0c;根据时间间隔或累积数据的大小来获取数据 1.2. 基于时间间隔的批量获取在传统ETL的数据仓库中很普遍 1.2.1. 每天在非工作时间&#xff0…

Cyber​​Panel upgrademysqlstatus 远程命令执行漏洞(QVD-2024-44346)

0x01 产品简介 CyberPanel是一个开源的Web控制面板,它提供了一个用户友好的界面,用于管理网站、电子邮件、数据库、FTP账户等。CyberPanel旨在简化网站管理任务,使非技术用户也能轻松管理自己的在线资源。 0x02 漏洞概述 该漏洞源于upgrademysqlstatus接口未做身份验证和…

【形态学 - 击中-击不中变换(很多都讲得不直观不清楚,甚至是错的,我来个通俗易懂的)】

简单描述过程&#xff1a; 一般的目标匹配是&#xff0c;知道目标长什么样&#xff0c;用这个模板去匹配。这里还知道目标周围环境长什么样。 如何把环境的信息加进来用来帮助匹配呢。这个就是击中-击不中联合匹配了。 就是用亮图去匹配目标。 再用暗图去匹配背景。 两个联合起…

【蓝桥杯选拔赛真题78】python电话号码 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python电话号码 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python电话号码 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…

单细胞数据分析(四):细胞亚型注释

文章目录 介绍加载R包导入数据细胞簇可视化细胞簇标记基因细胞识别输出结果系统信息介绍 单细胞细胞亚型注释是指在单细胞聚类分析后,对每个聚类得到的细胞群体进行生物学意义上的分类和识别的过程。这一步骤的目的是为了确定每个细胞群体对应的具体细胞类型或状态,从而更好…

CI/CD 的原理

一、CI/CD 的概念 CI/CD是一种软件开发流程&#xff0c;旨在通过自动化和持续的集成、测试和交付实现高质量的软件产品。 CI(Continuous Integration)持续集成 目前主流的开发方式是协同开发&#xff0c;即多位开发人员同事处理同意应用不同模块或功能。 如果企业在同一时间将…

常见大气校正模型及6S模型安装部署【20241028】

⛄常见大气校正模型 大气校正是遥感图像标准化处理的重要环节&#xff0c;消除太阳辐射传输过程中大气对于遥感图像的影响&#xff0c;提高影像的清晰度&#xff0c;获取地物真实的光谱信息。由于大气条件较为复杂&#xff0c;且随区域地理分布和观测时间是动态变化的&#xf…