在实际的业务场景中,咱们常常会遇到某个服务须要扩容的场景(例如:测试压测、电商秒杀、大促、或因为资源紧张、工做负载下降等等都须要对服务实例数进行扩缩容操做)。在Kubernetes中,能够对Deployment/RC的Scale机制来方便的进行自动化扩缩容操做。html
Kubernetes扩缩容node
Kubernetes对Pod的扩缩容分为:手动和自动两种nginx
1.手动模式apache
手动模式经过kubectl scale命令对一个Deployment/RC进行Pod副本数量的设置。便可一键完成。api
示例:app
cat scale.yamlide
---工具 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/v一、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/