在实际的业务场景中,我们经常会遇到某个服务需要扩容的场景(例如:测试压测、电商秒杀、大促、或由于资源紧张、工作负载降低等等都需要对服务实例数进行扩缩容操作)。在Kubernetes中,可以对Deployment/RC的Scale机制来方便的进行自动化扩缩容操作。
Kubernetes扩缩容
Kubernetes对Pod的扩缩容分为:手动和自动两种
1.手动模式
手动模式通过kubectl scale命令对一个Deployment/RC进行Pod副本数量的设置。即可一键完成。
示例:
cat scale.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: ops-nginx
namespace: ops
spec:
selector:
matchLabels:
app: ops-nginx
replicas: 1
template:
metadata:
labels:
app: ops-nginx
spec:
imagePullSecrets:
- name: cd-registry
containers:
- image: harbor.ttsingops.com/nginx/nginx:1.16.0
name: ops-nginx
kubectl apply -f scale.yaml
kubectl get po -n ops
#进行扩容
kubectl scale deployment ops-nginx -n ops --replicas 5
#缩容操作
kubectl scale deployment ops-nginx -n ops --replicas 2
kubectl get po -n ops
2.自动模式
需要通过用户根据某个性能指标或者基于Prometheus自定义指标来进行扩缩容,系统会自动在这个范围内根据性能指标进行变化调整。
HAP简介
HPA(Horizontal Pod Autoscaler,Pod水平自动伸缩) 是从Kubernetes V1.1版本引入。用于实现基于CPU使用率进行自动Pod扩缩容的功能。 HPA控制器基于Master的kube-controller-manager服务启动参数 --horizontal-pod-autoscaler-sync-period定义的时长,周期性的检测目标Pod的CPU使用率,并在满足条件时对RC或Deployment中的Pod副本数量进行调整,以符合用户定义的平均Pod CPU使用率。
HPA的版本演进:
目前HPA已经支持三大版本:autoscaling/v1、autoscaling/v2beta1和autuscaling/v2beta2 三个大版本。
哪这个三个版本有何区别呢?
autoscaling/v1版本,只支持CPU一个指标的Pod水平伸缩。
而autoscaling/v2beta1增加了支持自定义指标,除了cadvisor暴露的指标外,还支持自定义指标,比如像第三方提供的QPS,或者基于其他的一些资源进行扩容,就是支持一些第三方的一些组件了。
autoscaling/v2beta2又额外增加了外部指标支持
HPA自动扩缩容原理?
Kubernetes中的Metrics Server持续采集所有Pod副本的指标数据。HPA控制器通过Metrics Server的API(Heapster的API或聚合API,已经慢慢废弃了,使用metrice Server)获取这些数据,基于用于定义的扩缩容规则进行计算,得到目标Pod副本数量。当目标Pod副本数量与当前副本数量不同时,HPA控制器向Pod的副本控制器(RC/Deployment)发起scale操作,调整Pod的副本数量,完成扩缩容操作。
思考:
若某个Pod的CPU使用率在在一定时间内,突然升高其后立马降低,这样Pod岂不是频繁的扩缩容。也即是副本的数量不断的调整。这里就会有冷却周期。每次在扩缩容后,冷却时间是多少。
在HPA中,默认的扩容冷却周期是3min,缩容冷却周期是5min。
可以通过调整kube-controller-manager组件启动参数设置冷却时间:
--horizontal-pod-autoscaler-downscale-delay 扩容冷却
--horizontal-pod-autoscaler-upscale-delay 缩容冷却
示例:
下面通过一个示例,然后对pod进行施压,进行自动扩缩容。
cat auto_scale.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: auto-nginx
namespace: ops
spec:
selector:
matchLabels:
app: auto-nginx
replicas: 1
template:
metadata:
labels:
app: auto-nginx
spec:
imagePullSecrets:
- name: cd-registry
containers:
- image: harbor.ttsingops.com/nginx/nginx:1.16.0
name: auto-nginx
resources:
requests:
cpu: 200m
ports:
- containerPort: 80
---
#Service
apiVersion: v1
kind: Service
metadata:
name: auto-nginx
namespace: ops
spec:
type: NodePort
ports:
- port: 8088
protocol: TCP
targetPort: 80
nodePort: 38088
selector:
app: auto-nginx
kubectl apply -f auto_scale.yaml
kubectl get svc,pod -n ops -o wide
cat auto_nginx_hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: auto-nginx-hpa
namespace: ops
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: auto-nginx
minReplicas: 1
maxReplicas: 8
targetCPUUtilizationPercentage: 50
kubectl apply -f auto_nginx_hpa.yaml
kubectl get hpa -n ops
使用apache的ab压测工具进行施压
可以在node任意节点安装ab工具
yum install -y httpd-tools
ab -n 10000000 -c 10000 http://192.168.1.211:38088/index.html
#因为我把Service映射到NodePort
#查看hpa情况
kubectl get hpa -n ops
#查看Pod情况
kubectl get pods -n ops
#查看events信息
kubectl get events -n ops
#等待几分钟后,再次查看Pod缩容情况
kubectl get po -n ops
思考:
Kubernetes是如何对Pod的副本数量进行扩缩容的呢?
官网已经有详细解释:就是根据当前CPU指标和所需CPU指标进行相除。
例如:当前CPU指标为200m,所需指标值为100m,则副本数量将增加一倍,因为200.0/100.0=2。
如果当前值为50m,会将副本数量减半,因50.0/100.0 = 0.5。
具体可参见官网解释:
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
问题:
1.在进行HPA自动伸缩Pod,无法进行自动伸缩
需要安装metrics-server组件
可参见<<Ansbile部署Kubernetes 1.16.10 集群>>中的5.安装metrics-server
配置步骤
【参考资料】
https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
网友评论