首发:https://mp.weixin.qq.com/s/eWwT1xBvnqvmHMXTVZ7KUA 公众号:程序员架构进阶 一 前言 直到现在,都还停留在动态扩容的门口,本篇将开始正式尝试动态扩容实现 kubectl 本身提供了 scale 和 autoscale 命令用于扩容和自动扩容,下面就重点介绍这两种方式。 二 扩容方法-kubectl scale kubectl scale 命令可以支持动态扩容。 请求数;-c:并发数 本地压测命令: ab -n 200000 -c 20 "http://localhost:30029/" 执行过程中可以通过 kubectl logs web-569c7c8cb6 在压测过程中,通过 top 命令查看实时 cpu 和内存使用情况,以及 pod 扩容进度。至此,两种 kubectl 提供的扩容和自动扩容方法介绍完毕。
手动扩容的过程中花费了较长的时间. 但是在K8S上, 有状态应用的扩容就很简单, YAML里改一下replicas副本数, 等不到1min就扩容完毕. 那么, 还有哪些因素, 让有状态应用可以在k8s上快速扩容甚至自动扩容呢? , 一一梳理下: Eureka Nacos Redis RabbitMQ Kafka TiDB K8S上有状态应用扩容 在Kubernetes上, 有状态应用快速扩容甚至自动扩容很容易. Eureka 扩容 备注: 有状态扩容第一层: StatefulSet + Headless Service eureka的扩容在K8S有状态应用中是最简单的, 就是: headless service 总结 通过6个有状态软件, 我们见识到了层层递进的K8S上有状态应用的快速扩容甚至是自动扩容: 最简单实现: StatefulSet + Headless Service -- Eureka 脚本/Init
overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } 扩容 // 用计算出来的数组长度,往下传继续处理 elementData = Arrays.copyOf(elementData, newCapacity); } 这就是数组的扩容 ,一般是oldCapacity + (oldCapacity >> 1),相当于扩容1.5倍 跟进到Arrays这个工具类,很简单 再看copyOf()方法 System.arraycopy()方法用了一个
mqj5sb.yaohqcn37t88t02z --discovery-token-ca-cert-hash sha256:80982a370ef22ba5a8555f52e965733a6a4bc95f5b8c5ee291a56370ce98dddb2 mqj5sb.yaohqcn37t88t02z --discovery-token-ca-cert-hash sha256:80982a370ef22ba5a8555f52e965733a6a4bc95f5b8c5ee291a56370ce98dddb
因此,如果在正常情况下pod只需要2个CPU核,则requests参数可以设置为2,limits参数可以设置为8(或更多)。 在正常情况下,只使用2个核,但是如果有一个工作负载峰值,pod将被允许使用超过请求的2个核,直到配置的限制值,在本例中为8(或更多)。 在高水平上,用HPA自动缩放将经过3个步骤 检测-HPA检测到超过目标阈值 扩容-通过HPA发出扩容请求作出回应 容器就绪-新的副本开始接收流量 虽然这个过程的第3步——容器准备就绪——不是由HPA负责的
介绍 在之前的文章我介绍了下 Custom Metric 怎么实现自动扩容的。 k8s基于自定义指标实现自动扩容 实际上Kubernetes定义了三种不同的监控数据接口,分别是Resource Metric,Custom Metric以及External Metric。 External Metric就是针对云场景的了,比方说通过获取slb最大连接数来实现自动扩容。 下面我来说下具体怎么实现的。 简单说下各个指标的含义,方便之后去选择哪个指标去自动扩容。 内存使用情况 k8s_workload_memory_rss rss ❞ 扩容例子 根据slb_l4_active_connection这个指标,实现自动扩容 apiVersion: apps/v1beta2
ArrayList 扩容详解,扩容原理 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长。 ArrayList不是线程安全的,只能用在单线程环境下。 看如果需要扩容,则扩容。 ②是将要添加的元素放置到相应的数组中。 下面具体看 ensureCapacityInternal(size + 1); // ① 是如何判断和扩容的。 newCapacity = minCapacity; //jdk1.7这里增加了对元素个数的最大个数判断,jdk1.7以前是没有最大值判断的,MAX_ARRAY_SIZE 为int最大值减去8( 也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15(如下图二);当添加第16个数据时,继续扩容变为15 * 1.5 =22个(如下图四)。 在JKD1.6中实现是,如果通过无参构造的话,初始数组容量为10,每次通过copeOf的方式扩容后容量为原来的1.5倍,以上就是动态扩容的原理。
pc_blog_bottom_relevance_base6&spm=1001.2101.3001.4242.1&utm_relevant_index=3 其实有些地方他也写的不是太清楚,这儿补充一下 这儿快照删掉之后就可以扩容了
笔者在面试美团时曾被面试官问到HashMap扩容机制的原理。这个问题倒不难,但是有些细节仍需注意。 JDK1.8对HashMap进行的较大的改动,其中对HashMap的扩容机制进行了优化。 这是因为多次执行put操作会引发HashMap的扩容机制,HashMap的扩容机制采用头插法的方式移动元素,这样会造成链表闭环,形成死循环。 JDK1.8中HashMap使用高低位来平移元素,这样保证效率的同时避免了多线程情况下扩容造成死循环的问题。这篇博客重点介绍扩容时使用到的高地低平移算法。 在扩容机制下数组两倍扩容,数组的长度发生了变化,同时我们也必须要严格遵守计算数组下标index的算法,否则在新数组调用get()无法获取到相应的Node结点。 当数组扩容时,链表所有的结点必须根据新数组的长度重新计算下标位,此时即使链表中每个结点的Hash值不尽相同,但是由于&运算和数组两倍扩容的特殊性,可以根据高低位算法将链表分为高位链表和低位链表,并将这两个链表迁移到新数组不同的下标位
resources:通过 seriesQuery 查询到的只是指标,如果需要查询某个 Pod 的指标,肯定要将它的名称和所在的命名空间作为指标的标签进行查询,resources 就是将指标的标签和 k8s overrides:它会将指标中的标签和 k8s 资源关联起来。 现在,让我们检查该指标的当前值: [root@prometheus]# kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces SuccessfulRescale 3m4s horizontal-pod-autoscaler New size: 2; reason: All metrics below target 发现触发扩容动作了 参考链接 https://github.com/directxman12/k8s-prometheus-adapter
为了方便后人快速扩容,特此记录。 就是说假如我们有3块4T的硬盘,我们可以用LVM组成一个12T的硬盘来用,后期也可以非常安全的在线扩容。ps:现在Linux安装的时候其实默认就采用了LVM的形式。 开始扩容 那么了解了基本概念后,我们就要开始扩容了,我们先使用df -h看看我的服务器的可用空间: 太惨了吧! 这个时候再看我们的操作室LV就已经扩容啦! 咦~但我们的文件系统为啥还是这么小呢? 这个时候操作系统还没法识别到这个新的空间,所以我们要更新一下让操作系统知道我们已经扩容啦!不同格式的分区更新文件系统的方式也不一样。需要查看一下你的文件系统是ext4还是xfs。
resources:通过 seriesQuery 查询到的只是指标,如果需要查询某个 Pod 的指标,肯定要将它的名称和所在的命名空间作为指标的标签进行查询,resources 就是将指标的标签和 k8s overrides:它会将指标中的标签和 k8s 资源关联起来。 现在,让我们检查该指标的当前值: [root@prometheus]# kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces SuccessfulRescale 3m4s horizontal-pod-autoscaler New size: 2; reason: All metrics below target 发现触发扩容动作了 参考链接: https://github.com/directxman12/k8s-prometheus-adapter
image.png image.png DOCKER在线扩容 DOCKER搭建私有仓库
继推出k8s集群一键升级脚本之后有不少小伙伴还有k8s在线扩容节点的需求,所以本次波哥就又写了一个扩充节点的脚本。 明天有时间我再整理一下k8s部署集群脚本,目前是固定版本的,转化成部署任意版本的脚本或许更灵活一些。这样我们部署,升级,扩容三套脚本基本就能搞定k8s日常基础需求了。波哥也可以安心的写小程序后台了。 同样只要是你使用波哥的脚本部署的k8s集群都支持一键扩容哦! 脚本介绍: 跟以往一下我们有个base.config文件,修改上面的参数。这里我写好了自己的例子还有相关注释。
CloudProvider:前面介绍过,主要用于操作 IaaS 云资源Estimator:评估扩容节点Expander:从多个符合扩容条件的 NodeGroup 中选择最终 Node 的策略func initializeDefaultOptions (unschedulablePodsToHelp, currentTime) {// Node 扩容过程中,pod 新创建,等待一定冷却周期再尝试扩容} else { // 启动扩容ScaleUp a.processors.NodeInfoProcessor.Process(autoscalingContext, nodeInfosForGroups) // 获取未注册的 node(在 CA node group 中,但是未注册到 k8s computeScaleUpResourcesDelta(context, processors, nodeInfo, nodeGroup, resourceLimiter) // 校验是否超过限额,对比可扩容量和待扩容量 = nil && bestOption.NodeCount > 0 { // 得到需要扩容的节点数 newNodes := bestOption.NodeCount // 判断是否达到扩容上限
一、概述上一篇文章介绍了 k8s 自动扩缩容的三种方式:HPA、VPA、CA,以及各自的使用场景和架构。本文针对 CA 做源码分析。 1.1 CA架构回顾参考CA由一下几个模块组成:autoscaler:核心模块,负责整体扩缩容功能Estimator:负责评估计算扩容节点Simulator:负责模拟调度,计算缩容节点Cloud Provider 图片1.2 仓库代码结构源码地址CA 代码在 k8s 官方的 autoscaler 仓库下,该仓库存放自动扩缩容相关组件,包括前文介绍的 VPA、今天的主角CA、还有一个VPA修改pod资源的插件 Addon // 返回当前目标数量,必须实现该方法 // 有可能 k8s 节点数量和这个值不相等,但是一旦一切稳定(node完成启动和注册、节点彻底删除)就应该等于 Size()TargetSize() (int 的那些节点Nodes() ([]Instance, error)// 可选实现 // 返回包含空 node 新的的调度结构体,将被用于扩容仿真,以预测一个新的扩容节点是什么样的 // 返回的 NodeInfo
HashMap扩容死循环问题源码分析问题(jdk1.7) 一、首先hashmap单线程正常扩容 遍历每个数组,依次遍历每个数组的链表,根据头插法由原来的1,2,3 变为了3,2,1 二、hashmap 多线程扩容死循环问题 两个线程 e1 ,e2 此时 线程一先执行,但线程二的指向发生改变,改为线程变换后的具体存储;初始的e2指向0号位的1,但经过线程一的变换指向了2号位的1了,next也发生改变
它在业务繁忙的时候可以有效的对 Pod 进行横线扩展,但是最近发现明明使用率已经超过了定义的目标值,但是为何没有扩容呢? 一、HPA 的整体架构与核心组件 HPA 的实现位于 Kubernetes 的 k8s.io/kubernetes/pkg/controller/podautoscaler 目录下,主要由以下几个组件构成 ) scaleUpLimitMinimum = 4.0 (最小扩容限制) 其计算逻辑是: 扩容限制 = max(当前副本数 × 2, 4) 例如:当前2个副本,扩容限制为max(2×2, 4) = 4 8 :返回8(在范围内),条件"DesiredWithinRange" 期望副本数为15 : 扩容限制 = max(5×2, 4) = 10 返回10(扩容限制),条件"ScaleUpLimit" 期望副本数为 25 : 扩容限制 = max(5×2, 4) = 10 返回10(扩容限制),条件"ScaleUpLimit" 这个函数是HPA安全扩缩容机制的重要组成部分,确保扩缩容操作既满足业务需求又不会造成系统不稳定
HashMap扩容机制分析 在说HashMap扩容机制之前,有必要简述下HashMap的基本结构。以便各位更加清除的理解HashMap的底层是如何扩容的。 HashMap自JDK1.8之后结构采用数组+单链表【单链表长度达到8后结构转化为红黑树】。所以从结构上进行分析,HashMap的最基本结构只有两种。 下面就着重叙述HashMap底层的扩容了。 了解HashMap的读者都知道HashMap的初始化大小是16,至于为什么是16,可以参看我之前的博客。 这里不在叙述。 HashMap如何扩容呢? 在这里扩容不是直接原来的结构上进行顺序性的增加,而是先计算扩容之后的容量。然后重新建一个容量大小数组,在将原数组的元素按照指定的方式加入到新的数组当中去! ArrayList扩容机制 和这个差不过。扩容的大体思想都是一样的,但是比HashMap简单的多。不过是ArrayList的初始容量为10.
C盘能不能扩容?怎么扩容?