验证[Kubernetes]水平Pod自动缩放器的操作
首先
这里我们想确认一下Horizontal Pod Autoscaler的运作情况。Horizontal Pod Autoscaler是一种根据CPU负载等情况自动扩展(增加)replication controller/deployment/replica set /stateful set的副本数量的功能。
(仅供参考)大规模扩展和增加规模
当要提高服务器性能时,主要有两种方式:横向扩展(Scale-out)和纵向扩展(Scale-up)。
规模扩大
扩展规模常被称为“横向扩展”。通常通过增加服务器数量来分散负载,从而提高系统的“吞吐量”。
吞吐量是指在一定时间内能够处理多少个进程。
水平Pod自动缩放器是一种能够扩展的功能。
扩大规模
在汉语中,「扩大规模」也可以称为「纵向扩展」。通常情况下,通过将CPU升级为更高性能(频率更高)的版本,可以提高系统的「响应速度」。
所谓的「响应速度」是指系统能够多快地处理一个进程。
前提条件 ( tí
要使用Horizontal Pod Autoscaler,必须预先部署metrics-server。
在集群中部署指标服务器监控以通过资源指标 API 提供指标,因为水平 Pod 自动伸缩器使用该 API 收集指标。
开始之前
以下是如何构建 metrics-server 的指南,请参考。
创建部署/服务
首先,我们将创建一个Deployment以及一个用于与外部连接的Service,这里我们将创建一个LoadBalancer。
请应用以下清单。
apiVersion: v1
kind: Service
metadata:
name: load-balancer
spec:
ports:
- name: load-balancer
port: 8080
protocol: TCP
targetPort: 80
nodePort: 30002
selector:
app: nginx-dep
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx-dep
template:
metadata:
labels:
app: nginx-dep
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
limits:
cpu: 300m
$ kubectl apply -f nginx-hpa.yaml
service/load-balancer created
deployment.apps/nginx created
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 93d
load-balancer LoadBalancer 10.97.254.155 10.20.30.150 8080:30002/TCP 26s
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-65585fc7c9-fb92v 1/1 Running 0 31s
创建水平Pod自动缩放器
对于上述创建的Deployment,我们将创建以下的水平Pod自动化缩放器。为了方便缩放,这次我们将阈值设得比较低(25%)。
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 25
$ kubectl apply -f hpa.yaml
horizontalpodautoscaler.autoscaling/nginx-hpa created
$ kubectl get horizontalpodautoscalers.autoscaling
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-hpa Deployment/nginx 0%/25% 1 10 1 59s
顺便说一下,Deployment需要设置limits/requests。如果未进行设置,则TARGETS的值将变为,即使负载增加也无法进行扩展,请注意。
$ kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-hpa Deployment/nginx <unknown>/25% 2 10 2 12m
$ kubectl describe horizontalpodautoscalers.autoscaling nginx-hpa
Name: nginx-hpa
・・・
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedComputeMetricsReplicas 18m (x12 over 21m) horizontal-pod-autoscaler invalid metrics (1 invalid out of 1), first error is: failed to get cpu utilization: missing request for cpu
Warning FailedGetResourceMetric 72s (x81 over 21m) horizontal-pod-autoscaler missing request for cpu
确认动作
那么,我们将实际进行负载测试来验证其可扩展性。
通过负载均衡器从外部无限发送HTTP请求到容器。这就是拒绝服务攻击。
[client]$ while true; do curl -s http://10.20.30.150:8080 > /dev/null ;done
我們會在另一個終端中確認當時的負載狀況和相應的縮放情況。
$ kubectl get horizontalpodautoscalers.autoscaling -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-hpa Deployment/nginx 0%/25% 1 10 1 2m52s
nginx-hpa Deployment/nginx 44%/25% 1 10 1 3m33s
nginx-hpa Deployment/nginx 44%/25% 1 10 2 3m48s
nginx-hpa Deployment/nginx 40%/25% 1 10 2 4m34s
nginx-hpa Deployment/nginx 40%/25% 1 10 4 4m49s
nginx-hpa Deployment/nginx 19%/25% 1 10 4 5m34s
nginx-hpa Deployment/nginx 18%/25% 1 10 4 6m35s
nginx-hpa Deployment/nginx 0%/25% 1 10 4 7m36s
nginx-hpa Deployment/nginx 0%/25% 1 10 4 11m
nginx-hpa Deployment/nginx 0%/25% 1 10 3 11m
nginx-hpa Deployment/nginx 0%/25% 1 10 3 12m
nginx-hpa Deployment/nginx 0%/25% 1 10 1 12m
当CPU负载超过阈值的25%时,我们可以看到它增加了副本以分散负载。
由于负载源的资源不足,因此它只能扩展到4个。
如果有多个容器,这次是一个Pod/一个容器,那么将以Pod内所有容器的平均值作为对象。
停止负载,副本也减少,最终恢复到1个。
我在另一个终端中确认了Pod的增减情况。虽然有些难以理解,但可以看出Pod根据负载进行部署,并在停止负载时被删除。
$ kubectl get pod -w
NAME READY STATUS RESTARTS AGE
nginx-65585fc7c9-w8p92 1/1 Running 1 7h7m
nginx-65585fc7c9-fh6vm 0/1 Pending 0 0s
nginx-65585fc7c9-fh6vm 0/1 Pending 0 0s
nginx-65585fc7c9-fh6vm 0/1 ContainerCreating 0 0s
nginx-65585fc7c9-fh6vm 0/1 ContainerCreating 0 1s
nginx-65585fc7c9-fh6vm 1/1 Running 0 6s
nginx-65585fc7c9-xbb9n 0/1 Pending 0 0s
nginx-65585fc7c9-xbb9n 0/1 Pending 0 0s
nginx-65585fc7c9-c56nb 0/1 Pending 0 0s
nginx-65585fc7c9-c56nb 0/1 Pending 0 0s
nginx-65585fc7c9-xbb9n 0/1 ContainerCreating 0 0s
nginx-65585fc7c9-c56nb 0/1 ContainerCreating 0 0s
nginx-65585fc7c9-c56nb 0/1 ContainerCreating 0 1s
nginx-65585fc7c9-xbb9n 0/1 ContainerCreating 0 1s
nginx-65585fc7c9-xbb9n 1/1 Running 0 5s
nginx-65585fc7c9-c56nb 1/1 Running 0 6s
nginx-65585fc7c9-c56nb 1/1 Terminating 0 6m50s
nginx-65585fc7c9-c56nb 0/1 Terminating 0 6m51s
nginx-65585fc7c9-c56nb 0/1 Terminating 0 6m52s
nginx-65585fc7c9-c56nb 0/1 Terminating 0 6m52s
nginx-65585fc7c9-fh6vm 1/1 Terminating 0 8m52s
nginx-65585fc7c9-xbb9n 1/1 Terminating 0 7m51s
nginx-65585fc7c9-fh6vm 0/1 Terminating 0 8m53s
nginx-65585fc7c9-xbb9n 0/1 Terminating 0 7m52s
nginx-65585fc7c9-xbb9n 0/1 Terminating 0 7m53s
nginx-65585fc7c9-xbb9n 0/1 Terminating 0 7m53s
nginx-65585fc7c9-fh6vm 0/1 Terminating 0 8m54s
nginx-65585fc7c9-fh6vm 0/1 Terminating 0 8m54s
关于Horizontal Pod Autoscaler的运行机制
我已经查阅了手册,并整理如下。由于是英文手册,如果有错误,请谅解。
水平Pod自动扩展器
监视间隔
根据水平 Pod 自动缩放同步周期,默认每15秒进行监视。
副本数量的确定
必要な复制品数量根据设定值和当前度量值的比例,由以下公式决定。
必要的复制品数量=ceil(当前的复制品数量 *(当前的度量值 / 设置值))
※ceil:向上取整
扩展的对象
如果使用的是当前稳定版本的API(autoscaling/v1),仅支持CPU。如果使用的是测试版的API(autoscaling/v2beta2),还支持内存和自定义度量。
总结
本次我們確認了水平Pod自動調整器。
擴展操作對於處理相對輕量級業務,如Web服務等的系統非常適合。這是一種與Kubernetes微服務相融合的擴展方法。
根據手冊的內容,API版本從autoscaling/v2beta2變為autoscaling/v1後,功能和操作方式似乎有所不同。甚至配置清單的撰寫方式也稍有不同。由於開源項目的變化非常快速,所以必須經常檢查最新資訊。