【摘要】
原生的K8S集群系统架构优化——弹性能力优化,针对集群无法自动伸缩问题,进行梳理优化。
【案例正文】
【背景】
K8S云原生系统架构优化_xuyijing0103的博客-CSDN博客https://blog.csdn.net/weixin_53439529/article/details/132565188
【问题】
【过程与结果】
【初步解决思路】
弹性伸缩能力非常简单,在达到可观测的基础上,设置弹性伸缩策略即可。
【解决方案】
我们常说的K8S弹性伸缩,其实包含两个维度:
kind: HorizontalPodAutoscaler
apiVersion: autoscaling/v2beta1
metadata:
name: hpa
namespace: default
annotations:
extendedhpa.metrics: '[{"type":"Resource","name":"cpu","targetType":"Utilization","targetRange":{"low":"20","high":"50"}},{"type":"Resource","name":"memory","targetType":"Utilization","targetRange":{"low":"20","high":"50"}}]'
extendedhpa.option: '{"downscaleWindow":"5m","upscaleWindow":"3m"}'
spec:
scaleTargetRef:
kind: Deployment
name: wordpress
apiVersion: apps/v1
minReplicas: 1
maxReplicas: 4
metrics:
- type: Resource
resource:
name: memory
targetAverageUtilization: 30
- type: Resource
resource:
name: cpu
targetAverageUtilization: 30
实现的目标是给wordpress这个deployment负载设置了基于内存和CPU的弹性伸缩,目标CPU和内存使用率都是 30%,上限是4,下限是1个。K8S会在负载的容器CPU和内存使用率达到这个值时自动弹性伸缩,但不会超过4个副本。
要实现弹性伸缩,还需要一个重要的前提,那就是该负载有资源申请,否则metrics会报错:invalid metrics (1 invalid out of 1), first error is: failed to get cpu utilization: missing request for cpu
意思是说负载没有申请CPU资源,都没有申请资源怎么判断是否超过资源上限呢?
在yaml的spec.resources字段配置,limits 表示上限值,requests表示申请值。CPU和内存的计量单位分别是:
1)Kubernetes 中,0.5 代表请求半个 CPU 资源。表达式 0.1 等价于 表达式 100m。CPU 的计量代表的是绝对值,而非相对值,例如,您请求了 0.1 个 CPU,无论您的节点是单核、双核、48核,您得到的 CPU 资源都是 0.1 核。
2)内存的计量单位是 byte 字节。可以使用一个整数来表达内存的大小,也可以使用后缀来表示(E、P、T、G、M、K)。也可以使用 2 的幂数来表示内存大小,其后缀为(Ei、Pi、Ti、Gi、Mi、Ki)。单位写错会导致容器启动不起来。
另外,不是所有的负载都需要做弹性伸缩,某些CPU使用量很低的服务会探测不到:invalid metrics (1 invalid out of 1), first error is: failed to get cpu utilization: unable to get metrics for resource cpu: no metrics returned from resource metrics API。意思是使用量太低了,该服务可能没有在用。可以用top pod指令找到所有的高资源消耗负载,然后有针对性地给这些负载设置资源申请和弹性伸缩策略。
测试小tip:进入要弹性的负载容器,用以下命令加压:i=0 ;while true ; do i=i+1 ; done 这个循环会很快升高CPU使用率,看到副本弹到设定值停止即可。
【总结】
当前还有一个遗留问题,那就是HorizontalPodAutoscaler(简称hpa)的版本,Kuboard的版本原因,只能显示autoscaling/v1版本的hpa,但是该版本只能扩容不能缩容,当停止加压CPU使用率降低下来,应该缩容到1个副本的,但是hpa状态是:
status: 'False'
lastTransitionTime: '2023-07-26T08:26:11Z'
reason: DesiredWithinRange
message: the desired count is within the acceptable range
意思是当前副本数满足期望数,因此hpa不会变更副本数了。使用很多办法尝试修改过很多次hpa版本,但是因为Kuboard限制始终无法生效。
实测华为云CCE用的是autoscaling/v2beta1 版本的hpa,CPU使用率可以设置期望范围,比如50%-80%之间,低于50%的时候会自动缩容到1个。