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 弹性伸缩有其专门的控制台
- 我们可以在控制台排查其伸缩配置、伸缩规则等相关子实例日志和状态
- 而管控的日志,可以通过查看日志功能来查看
- 最后,对于节点的准备与清理,其实就是排查对应的脚本的执行过程
相关文章:
DEVOPS: 集群伸缩原理
概述 阿里云 K8S 集群的一个重要特性,是集群的节点可以动态的增加或减少有了这个特性,集群才能在计算资源不足的情况下扩容新的节点,同时也可以在资源利用 率降低的时候,释放节点以节省费用理解实现原理,在遇到问题的…...
什么是SMO算法
SMO算法(Sequential Minimal Optimization) 是一种用于求解 支持向量机(SVM) 二次规划对偶问题的优化算法。它由 John Platt 在 1998 年提出,目的是快速解决 SVM 的优化问题,特别是当数据集较大时ÿ…...
MySQL根据.idb数据恢复脚本,做成了EXE可执行文件
文章目录 1.代码2.Main方法打包3.Jar包打成exe可执行文件4.使用(1.)准备一个表结构一样得数据库(2.)打开软件(3.)输入路径 5.恢复成功 本文档只是为了留档方便以后工作运维,或者给同事分享文档内…...
Spring Boot面试题
1.什么是SpringBoot?它的主要特点是什么? Spring Boot 是一个基于 Spring 框架的开发和构建应用程序的工具,它旨在简化 Spring 应用的初始搭建和开发过程。Spring Boot 提供了一种约定优于配置的方式,通过自动配置和默认值&#…...
原生页面引入Webpack打包JS
Webpack简介 概述: Webpack是一个现代JavaScript应用程序的静态模块打包器。它将应用程序中的每个文件视为一个模块,并通过配置规则来解析这些模块之间的依赖关系,最终将其打包成一个或多个浏览器可以执行的文件。动态加载(Code …...
健康之路押注医药零售:毛利率下滑亏损扩大,医疗咨询人次大幅减少
《港湾商业观察》黄懿 2024年9月13日,健康之路股份有限公司(下称“健康之路”)再次递表港交所,建银国际为独家保荐人。健康之路国内运营主体为健康之路(中国)信息技术有限公司和福建健康之路信息技术有限公…...
【人工智能-初级】第7章 聚类算法K-Means:理论讲解与代码示例
文章目录 一、K-Means聚类简介二、K-Means 聚类的工作原理2.1 初始化簇中心2.2 分配簇标签2.3 更新簇中心2.4 迭代重复2.5 K-Means 算法的目标三、K-Means 聚类的优缺点3.1 优点3.2 缺点四、K 值的选择五、Python 实现 K-Means 聚类5.1 导入必要的库5.2 生成数据集并进行可视化…...
HOT 100 技巧题(136/169/75/31/287)
136. 只出现一次的数字 技巧类型题目,通过异或运算实现 169. 多数元素 三种常见解法:1. 哈希2. 排序3. 投票法 75. 颜色分类 单指针 两次遍历:第一次遍历把所有0都交换到前面,记录最后一个0的位置index,第二次遍…...
什么是时间戳?怎么获取?有什么用?
在 JavaScript 中,时间戳通常表示为自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。我们可以使用 Date 对象来获取当前时间的时间戳,或者将特定的日期转换为时间戳。在JavaScript中,时间戳通常以毫秒为单位表示。 如何获取时间戳 在Java…...
LeetCode:459重复的子字符串
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2: 输入: s "aba" 输出: false示例 3: 输入: s "abcabcabcabc" 输…...
【含开题报告+文档+PPT+源码】基于SSM的旅游与自然保护平台开发与实现
开题报告 围场县拥有丰富的自然景观和野生动植物资源,同时面临着旅游业发展和自然保护之间的平衡问题,通过强调自然保护,这个平台可以教育游客如何尊重和保护当地的生态环境。同时,平台还可以提供关于生态保护的信息,…...
【ANTs】医疗影像工具ANTs多种安装方式教程
介绍ANTs的几种简单的安装教程 基于Releases的安装 Github上选择适配自己操作系统的安装包,链接: link 一般使用最新版本。这里官方操作说明,支持Ubuntu、MacOS、CentOS,但是windows有安装包,不知道怎么用。。。 下载后有两个文件夹,bin和lib,bin里面长这样(图示wind…...
想要音频里的人声,怎么把音频里的人声和音乐分开?
在音频处理领域,将音频中的人声和音乐分开是一个常见需求,尤其对于音乐制作、影视后期以及个人娱乐应用来说,这种分离技术显得尤为重要。随着科技的发展,现在已经有多种方法可以实现这一目的。 一、使用专业音频处理软件 市面上有…...
python代码中通过pymobiledevice3访问iOS沙盒目录获取app日志
【背景】 在进行业务操作过程中,即在app上的一些操作,在日志中会有对应的节点,例如,下面是查看设备实时视频过程对应的一些关键节点: 1、TxDeviceAwakeLogicHelper:wakeStart deviceId CxD2BA11000xxxx …...
Spring AOP 使用方法总结
AOP切面编程的最佳应用场景 记录日志性能监控事务管理处理异常数据验证,验证传入参数的正确性(一般不用这个方法做,而是用拦截器) spring提供了以下注解供开发者使用,编写AOP程序 Aspect 申明切面Pointcut 切点&#…...
LeetCode 每日一题 2024/10/21-2024/10/27
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 10/21 910. 最小差值 II10/22 3184. 构成整天的下标对数目 I10/23 3185. 构成整天的下标对数目 II10/24 3175. 找到连续赢 K 场比赛的第一位玩家10/25 3180. 执行操作可获得…...
不到1500元的I卡可以玩转3A大作吗?撼与科技Intel Arc A750显卡游戏性能实
一、前言 还记得2022年10月的时候,英特尔发布了Arc A750和A770显卡,和此前所发布的DG1、A380不同,这两张显卡可以说是真正意义上的游戏显卡。不知不觉间,两年已经过去了,在这两年期间,英特尔不仅在积极地打…...
STK与MATLAB互联——仿真导航卫星与地面用户间距离和仰角参数
文章目录 构建GPS星座创建单个PRN的GPS卫星创建GPS星座,并为其添加发射机 北斗星座构建搭建低轨铱星星座构建一颗轨道高度为800km/1000km/1200km的低轨卫星构建一颗轨道高度为800km/1000km/1200km的低轨卫星建立地面站,可见性分析确定地面站坐标分析单颗…...
js面试问题笔记(一)
一.热门js面试 1.简述同步和异步的区别? 同步: 浏览器访问服务器请求,用户看到页面刷新 ,重新发请求,等请求完,页面刷新,新内容出现,用户看到新内容,进行下一步操作 异步: 浏览器访问服务器请求,用户正常操作,浏览器后端进行请求,等请求完,页面不刷新,新内容也会出现,用户看到…...
pip 和 pipx 的主要区别?
特性pippipx用途用于安装Python库或命令行应用程序,可以安装带entry points的库专门用于安装和管理Python命令行工具,每个工具都在隔离的虚拟环境中运行虚拟环境不自动创建虚拟环境,需要手动使用 venv 或 virtualenv 创建自动为每个安装的工具…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
ubuntu22.04有线网络无法连接,图标也没了
今天突然无法有线网络无法连接任何设备,并且图标都没了 错误案例 往上一顿搜索,试了很多博客都不行,比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动,重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
LUA+Reids实现库存秒杀预扣减 记录流水 以及自己的思考
目录 lua脚本 记录流水 记录流水的作用 流水什么时候删除 我们在做库存扣减的时候,显示基于Lua脚本和Redis实现的预扣减 这样可以在秒杀扣减的时候保证操作的原子性和高效性 lua脚本 // ... 已有代码 ...Overridepublic InventoryResponse decrease(Inventor…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...
ubuntu中安装conda的后遗症
缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...
