kubernetes 弹性伸缩布局
有三种弹性伸缩:
(1) CA(Cluster Autoscaler): Node级别自动扩/缩容cluster-autoscaler组件。
(2) HPA(Horizontal Pod Autoscaler): Pod个数自动扩/缩容,自动增加Pod副本数量
(3) VPA(Vertical Pod Autoscaler): Pod配置自动扩/缩容,主要是CPU、内存。addon-resizer组件
为什么要自动扩缩容?
在实际的业务场景中,我们经常会遇到某个服务需要扩容的场景(例如:测试对服务压测、电商平台秒杀、大促活动、或由于资源紧张、工作负载降低等都需要对服务实例数进行扩缩容操作)。
我们一般会使用 Deployment 中的 replicas 参数,设置多个副本集来保证服务的高可用,但是这是一个固定的值,比如我们设置 10 个副本,就会启 10 个 pod 同时 running 来提供服务。如果这个服务平时流量很少的时候,也是 10 个 pod 同时在 running,而流量突然暴增时,又可能出现 10 个 pod 不够用的情况。
HPA冷却周期
在弹性伸缩中,冷却周期是不能逃避的一个话题, 由于评估的度量标准是动态特性,副本的数量可能会不断波动。有时被称为颠簸, 所以在每次做出扩容缩容后,冷却时间是多少。在 HPA 中,默认的扩容冷却周期是 3 分钟,缩容冷却周期是 5 分钟。
可以通过调整 kube-controller-manager 组件启动参数设置冷却时间。
–horizontal-pod-autoscaler-downscale-delay // 扩容冷却
–horizontal-pod-autoscaler-upscale-delay // 缩容冷却
apiVersion: autoscaling/v1 #只支持CPU一个指标的弹性伸缩。
kind: HorizontalPodAutoscaler
metadata:
name: horse-oss #表示 deploy 服务名称
namespace: yanxuan
spec:
maxReplicas: 10 #最多 10 个 pod
minReplicas: 1 #最少一个 pod
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: horse-oss
targetCPUUtilizationPercentage: 80 #当整体的资源利用率超过80%的时候,会进行扩容。
或者
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: horse-oss
spec:
# 指定缩放的对象是horse-oss Deployment
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: horse-oss
minReplicas: 1
maxReplicas: 10
metrics:
# 每个 Pod 的 CPU 利用率在 50% 以内
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
# 每个 Pod 的内存利用率在 60% 以内
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 60
# 每个 Pod 每秒能够服务 1000 个数据包请求
- type: Pods
pods:
metric:
name: packets-per-second
target:
type: AverageValue
averageValue: 1k
# Ingress 后的 Pod 每秒能够服务的请求总数达到 10000 个
- type: Object
object:
metric:
name: requests-per-second
describedObject:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
name: main-route
target:
type: Value
value: 10k
或者
kubectl autoscale deployment horse-oss -n yanxuan \
--min=1 --max=10 --cpu-percent=80 --dry-run=client \
-o yaml > hpa.yaml
kubectl autoscale deployment horse-oss --cpu-percent=50 --min=1 --max=10
#上面命令解释说明
--cpu-percent=50(表示 cpu 使用率不超过 50%)
-min=1(最少一个 pod)
--max=10(最多 10 个 pod)
[root@node1 ~]# kubectl get hpa -n yanxuan
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
horse-oss Deployment/horse-oss 13%/80% 1 10 1 170m