K8s HPA
MetricsServer 和 AB压测工具
安装MetricsServer
Metrics Server 是Kubernetes中一个核心的指标收集器(默认不安装),可以提供资源利用率相关的重要指 标信息。主要用于实时监控和自动化任务。
# 下载yaml清单
curl -o metrics-server.yaml https://gh-proxy.com/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 修改yaml清单
- 将唯一Deployment中的image换成阿里云镜像
image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.4
- args添加如下两行
# 允许使用不安全的TLS连接来与kubelet通信,生产环境谨慎!!!
- --kubelet-insecure-tls
# 与 API Server 通信时首选的IP和端口
- --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname
# 安装metrics-server
kubectl apply -f metrics-server.yaml
# 查看deploy
watch -n 1 kubectl get deploy metrics-server -n kube-system
# 查看节点资源使用情况
kubectl top node
# 查看pod资源使用情况(kube-system命名空间)
kubectl top pod -n kube-system安装AB压测工具
AB压测工具是由Apache提供的一个非常方便的命令行程序,用于测试HTTP服务的性能。
# 安装httpd(Apache服务器)包含AB压测工具 - CentOS
sudo yum update && sudo yum install httpd -y
# 安装httpd(Apache服务器)包含AB压测工具 - Ubuntu
sudo apt update && sudo apt install apache2 -y基本命令格式
# x表示总的请求数; y表示并发发起的请求数;
ab -n x -c y <压测地址>创建测试所用的deployment 和 service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ab-deploy
namespace: hpa-ns
labels:
app: ab
spec:
selector:
matchLabels:
app: ab
replicas: 1
template:
metadata:
labels:
app: ab
spec:
# 定向调度到node1上
nodeName: node1
containers:
- name: container-nginx
image: nginx:1.26.2
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: ab-service
namespace: hpa-ns
labels:
app: ab
spec:
selector:
app: ab
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080实际操作
# 创建命名空间
kubectl create ns hpa-ns
# 创建资源
kubectl apply -f ab.yaml
# 监视node和pod的资源使用情况
watch -n 1 kubectl top node node1
watch -n 1 kubectl top pod -n hpa-ns
# AB压力测试
ab -n 10000 -c 100 http://192.168.7.71:30080/index.htmlHPA 命令参考
hpa控制器要求pod必须设定cpu或memory的资源配额
spec:
containers:
- name: container-nginx
image: nginx:1.26.2
ports:
- containerPort: 80
# 资源配额
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 200m
memory: 200Miab.yaml 文件 已做资源配额
apiVersion: apps/v1
kind: Deployment
metadata:
name: ab-deploy
namespace: hpa-ns
labels:
app: ab
spec:
selector:
matchLabels:
app: ab
replicas: 1
template:
metadata:
labels:
app: ab
spec:
nodeName: node1
containers:
- name: container-nginx
image: nginx:1.26.2
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 200m
memory: 200Mi
---
apiVersion: v1
kind: Service
metadata:
name: ab-service
namespace: hpa-ns
labels:
app: ab
spec:
selector:
app: ab
type: NodePort
ports:
- port: 80
targetPort: 80
nodePort: 30080通过命令管理hpa控制器
# 查看hpa
kubectl get hpa -n hpa-ns
# apply -f ab.yaml
kubectl apply -f ab.yaml
# 创建hpa
# --min代表pod最小数量;--max代表pod最大数量;--cpu-percent代表cpu的使用率阈值
kubectl autoscale deploy ab-deploy --min=1 --max=10 --cpu-percent=20 --name=my-hpa -n hpa-ns
# 删除hpa
kubectl delete hpa my-hpa -n hpa-nsAB压力测试
# 查看hpa(参数-w可观察监控数据的连续变化)
kubectl get hpa -n hpa-ns -w
# 启动压力测试
ab -n 10000 -c 1000 http://192.168.7.71:30080/index.htmlYAML 文件参考(YAML方式)
创建hpa控制器的yaml文件前,先查阅一下该类型的资源版本
# 查看hpa资源
kubectl api-resources | grep hpa
# 查看api版本(v1-仅支持基于CPU指标的自动扩缩;v2-支持基于CPU、内存和自定义指标的自动扩缩)
kubectl api-versions | grep autoscaling自动扩缩容
# api版本
apiVersion: autoscaling/v2
# 资源类型
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
# 所在命名空间
namespace: hpa-ns
spec:
# hpa的目标资源(要求目标资源中的pod必须设定cpu或memory的资源配额)
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ab-deploy
# pod最小值
minReplicas: 3
# pod最大值
maxReplicas: 10
# 度量指标
metrics:
# 指标的类型(Resource、External、Object、Pods、ContainerResource其中之一)
# Resource - CPU和内存利用率指标
# Pods - 网络利用率和流量
# Object - 特定对象的指标,如:Ingress按每秒使用请求数来扩展容器
- type: Resource
resource:
# resource名字
name: cpu
# 目标值
target:
# 度量类型(Utilization-利用率、AverageValue-平均值、Value-值其中之一)
type: Utilization
# 度量的阈值(<50%缩容、>50%扩容)
averageUtilization: 50
- type: Resource
resource:
# resource名字
name: memory
# 目标值
target:
# 度量类型(Utilization-利用率、AverageValue-平均值、Value-值其中之一)
type: AverageValue
# 度量的阈值(<600Mi缩容、>600Mi扩容)
averageValue: 600Mi扩缩容速度
spec:
# 精确控制扩缩容的速度
behavior:
# 扩容速度
scaleUp:
# 稳定窗口期。即增加或减少Pod数量后保持不变的时间(单位:秒),默认0s
stabilizationWindowSeconds: 0
policies:
# 策略类型(相对数)
- type: Percent
# 百分比数值
value: 100
# 该值必须处于(0s, 1800s]
periodSeconds: 15
# 策略类型(绝对数)
- type: Pods
value: 4
periodSeconds: 15
# 缩容速度
scaleDown:
# 稳定窗口期(单位:秒),默认300s
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 4
periodSeconds: 15可执行 my-hpa.yaml 文件(自动扩缩容 )
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
namespace: hpa-ns
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ab-deploy
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 20可执行 my-hpa.yaml 文件(扩缩容速度 )
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
namespace: hpa-ns
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ab-deploy
minReplicas: 3
maxReplicas: 10
behavior:
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
scaleDown:
stabilizationWindowSeconds: 30
policies:
- type: Percent
value: 100
periodSeconds: 15测试
# apply
kubectl apply -f my-hpa.yaml
# 查看hpa
kubectl get hpa my-hpa -n hpa-ns -w
# 启动压力测试
ab -n 50000 -c 1000 http://192.168.7.71:30080/index.html
原创
K8s HPA
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法