K8S 使用的 Kubeasz 发行版,Allinone + 添加 Node 部署方式。
确认集群安装了 metrics-server
$ kubectl get pods -n kube-system
输出中可见 metrics-server
NAME READY STATUS RESTARTS AGE
metrics-server-57fbbb5957-7hf25 1/1 Running 0 23h
另外,通过 kubectl get apiservice
查看服务状态
$ kubectl get apiservice | grep metrics
输出
v1beta1.metrics.k8s.io kube-system/metrics-server True 23h
最后运行 kubectl top nodes
查看节点状态,如果可以成功获取指标,则证明 metrics-server 已正常集成
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
172.17.157.115 96m 4% 2509Mi 76%
worker-01 70m 3% 2398Mi 72%
配置 Horizontal Pod Autoscaler (HPA)
hpa.yaml
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: hello-world-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hello-world
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 80
AI 给了我一份儿 v1 的配置,v1 版本只支持基于 CPU 的扩缩容,不支持内存,后来无意间发现有 v2 版的配置,如下
hpa-v2.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hello-world-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hello-world
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 80
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
启用控制器
$ kubectl apply -f hpa-v2.yaml
当 Pod 的 CPU 使用率持续超过 80%,HPA 控制器会自动扩容 Deployment 的 Pod 数量,当 CPU 使用率降低时,HPA 会自动缩减 Pod 数量以优化资源,以上配置在 1 到 10 个 Pod 之间调节。
查看创建的 HPA
$ kubectl get hpa
# 详细信息
$ kubectl describe hpa hello-world-hpa
输出
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hello-world-hpa Deployment/hello-world 0%/80% 1 10 5 10m
默认五分钟的观察期,如果 CPU 使用率小于 80%,那么会自动驱逐 Pods 副本,Terminating
即 Pod 正在退出的状态
NAME READY STATUS RESTARTS AGE
hello-world-7f66b5bf9-88pdv 0/1 Terminating 0 5m9s
hello-world-7f66b5bf9-dtgnz 1/1 Running 0 3h
hello-world-7f66b5bf9-f65rp 0/1 Terminating 0 5m9s
hello-world-7f66b5bf9-rr28x 0/1 Terminating 0 5m9s
而后达到一个 Pod 的稳定状态。
压力测试
安装 HTTP 压测工具 wrk
# Ubuntu 系统
$ apt show wrk
使用 6 个线程模拟 200 个请求,持续 300s
$ wrk -t6 -c200 -d300s http://172.17.157.115:31539
结果
NAME CPU(cores) MEMORY(bytes)
hello-world-7f66b5bf9-5c4pt 256m 9Mi
hello-world-7f66b5bf9-jjcf6 1m 1Mi
hello-world-7f66b5bf9-mmvgq 256m 9Mi
自动扩容成功。