Kubernetes 弹性伸缩全场景解析

2024-05-13 12:58

本文主要是介绍Kubernetes 弹性伸缩全场景解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在本系列的前三篇中,我们介绍了弹性伸缩的整体布局以及HPA的一些原理,HPA的部分还遗留了一些内容需要进行详细解析。在准备这部分内容的期间,会穿插几篇弹性伸缩组件的最佳实践。今天我们要讲解的是
cluster-proportional-autoscaler 。cluster-proportional-autoscaler是根据集群中节点的数目进行Pod副本数水平伸缩的组件,这个组件的产生主要是为了解决集群的核心组件负载弹性的问题。在一个Kubernetes集群中,除了APIServer等耳熟能详的Control Pannel组件,还有很多系统组件是部署在worker上的,例如CoreDNS、Ingress Controller、Istio等等。这些核心组件大部分和我们的应用接入层息息相关,也就是说每当我们的系统处理了一条外部的请求,可能都会调用这些组件。那么这就有可能由于这些组件的负载过大,造成应用的QPS达到瓶颈。那么一个集群该运行多少个核心组件副本呢?
很遗憾,这个问题是没有统一答案的,因为不同的类型的应用、不同的网络模型、不同的调度分布,都有可能会带来不同的挑战。在本篇文章中,我们不谈具体的指标和数据,只探讨解法。在本系列后面的文章中,会为大家深入解析。
大部分的情况下,核心组件的副本数目和集群的节点数目是成正比的,一个集群的节点数目越多,核心组件所需要的副本数就越多。今天我们以CoreDNS为例,通过cluster-proportional-autoscaler,来实现一个动态的、基于节点数目的核心组件动态伸缩。

cluster-proportional-autoscaler的使用

cluster-proportional-autoscaler和传统的Kubernetes组件设计有所不同,我们已经见惯了各种Controller、CRD或者Operator,而cluster-proportional-autoscaler走了另外一条非常简单的路。使用cluster-proportional-autoscaler只需要部署一个Yaml并选择一个伸缩的监听对象以及伸缩策略即可。如果需要有多个组件进行伸缩,那就部署多个Yaml,每个Yaml包含一个cluster-proportional-autoscaler。一个使用cluster-proportional-autoscaler弹性伸缩coredns的模板如下。

apiVersion: apps/v1kind: Deploymentmetadata:  name: dns-autoscaler  namespace: kube-system  labels:    k8s-app: dns-autoscalerspec:  selector:    matchLabels:       k8s-app: dns-autoscaler  template:    metadata:      labels:        k8s-app: dns-autoscaler        spec:      containers:      - name: autoscaler        image: registry.cn-hangzhou.aliyuncs.com/ringtail/cluster-proportional-autoscaler-amd64:v1.3.0        resources:            requests:                cpu: "200m"                memory: "150Mi"        command:          - /cluster-proportional-autoscaler          - --namespace=kube-system          - --configmap=dns-autoscaler          - --target=Deployment/coredns          - --default-params={"linear":{"coresPerReplica":16,"nodesPerReplica":2,"min":1,"max"100,"preventSinglePointFailure"true}}          - --logtostderr=true          - --v=2        serviceAccountName: admin         

cluster-proportional-autoscaler的伸缩策略主要有两种,一种是线性模型,一种是梯度模型。
简单的理解,线性模型就是 y = rate * x + min,设置最小值,以及伸缩的区间,并根据当前节点的数目,通过线性模型计算所需的核心组件数目。在上面的例子中,我们用的就是线性模型,线性模型支持的配置参数如下:

{      "coresPerReplica"2,      "nodesPerReplica"1,      "min"1,      "max"100,      "preventSinglePointFailure"true}

min、max、以及preventSinglePointFailure都比较好理解,coresPerReplica的意思是按照核心数目来计算副本集,nodesPerReplica是按照节点数目来计算副本集。用一个实际的例子进行举例,例如当前集群有两个节点,每个节点的配置是4C8G,那么如果按照coresPerReplica这个指标计算,则需要弹出4*2/2=4个副本。如果按照nodesPerReplica来计算,则需要弹出2*1 = 2个副本。此时cluster-proportional-autoscaler会取两者之间的大的数值,也就是4作为最后的伸缩数目进行扩容。
梯度模型就是分级的机制,每个梯度对应了一个副本,例如:

{      "coresToReplicas":      [        [ 11 ],        [ 643 ],        [ 5125 ],        [ 10247 ],        [ 204810 ],        [ 409615 ]      ],      "nodesToReplicas":      [        [ 11 ],        [ 22 ]      ]    }

这个配置表示存在coresToReplicas和nodesToReplicas两个梯度,其中coresToReplicas的梯度表示,最小为1个副本;CPU核心数目大于3小于64的时候,为2个副本;依次类推。同样nodesToReplicas表示1个节点的时候为1个副本,2个节点的时候为2个副本。

最后

至此,cluster-proportional-autoscaler的使用就给大家讲解完了,建议优先配置CoreDNS的autoscaler,对于负载不高的场景可以考虑节点副本1:2的比例,如果负载比较高,可以1:1的配置进行配置。

 

这篇关于Kubernetes 弹性伸缩全场景解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/985766

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Python利用ElementTree实现快速解析XML文件

《Python利用ElementTree实现快速解析XML文件》ElementTree是Python标准库的一部分,而且是Python标准库中用于解析和操作XML数据的模块,下面小编就来和大家详细讲讲... 目录一、XML文件解析到底有多重要二、ElementTree快速入门1. 加载XML的两种方式2.

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字