前言
复习k8s,通过metric-server实现HPA水平伸缩
metric-server是一个用于收集资源信息的组件,它功能于sadvier功能相近,所以使用metric-server的意义是什么?
metric-server使用起来有2个特殊的功能:
- 提供的更好的pod资源查询
kubectl top
kubectl top vs kubectl get" title="kubectl topvskubectl get"> - 提供功能强大的HPA,水平伸缩功能
kubectl autoscale,通过创建hpa类型可以使用控制pod在一定条件(cpu或memory)下自动扩容/缩容
实现
1.安装metric-server
下载metric-server清单
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml修改清单(2025.3最新版本为v0.7.2)
#args添加--kubelet-insecure-tls #image修改dockerhub的镜像为aliyun镜像 - args: - --kubelet-insecure-tls ..... image: registry.aliyuncs.com/google_containers/metrics-server:v0.7.2部署
kubectl apply -f high-availability-1.21+.yaml kubectl -n kube-system get pods | grep metrics-server #每个node节点都会有一个metrics-server的pod
2.测试kubectl top命令
kubectl top node
kubectl top pods
kubectl top结果" title="kubectl top结果">
3.实现HPA
创建一个pod
apiVersion: apps/v1 kind: Deployment metadata: name: wym-k8s-stress spec: replicas: 1 selector: matchExpressions: - key: apps operator: Exists template: metadata: labels: apps: stress spec: imagePullSecrets: - name: harbor-secret containers: - name: web image: harbor.A.com/k8s/tools:latest stdin: true resources: requests: cpu: 500m memory: 200M limits: cpu: 1 memory: 500M此容器是一个特殊的容器,本身没有任何服务,所以需要使用stdin阻塞防止停止,它可以进行压力测试,占用大量cpu和memory
必须配置pod的resources.requests字段,因为hpa会使用request指定的内容作为基准
以下两种方法相同,都可以创建hpa规则,应用到该pod
声明式(清单)创建hpa
apiVersion: autoscaling/v2 # 指定资源类型为HPA kind: HorizontalPodAutoscaler metadata: name: wym-k8s-stress spec: #指定最大的Pod副本数量 maxReplicas: 6 # 指定监控指标 metrics: # 指定资源限制 - resource: # 指定资源限制的名称 name: cpu # 指定限制的阈值 target: #用到request的50%就会触发扩容,小于就会触发缩容 averageUtilization: 50 type: Utilization type: Resource #指定最小的Pod副本数量 minReplicas: 2 # 当前的hpa规则应用在哪个资源 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: wym-k8s-stress响应式(命令)创建hpa
kubectl autoscale deployment wym-k8s-stress --min=2 --max=6 --cpu-percent=50
发现,原本只启动1个的pod(replicas: 1),现在启动了2个,这是因为hpa规定的最小数量为2(minReplicas: 2),所以hpa又控制启动了个pod,
4.测试hpa
对pod进行压力测试
kubectl exec wym-k8s-stress-7dd9c54b76-5dj7v -- stress -c 1 --verbose --timeout 10m发现该容器占满1core,等待5m,hpa会扩容,如图已经扩容到了4个,但是等待了5min都没有继续创建pod,删除压力测试容器后等待5min同样没有删除pod
hpa有扩容冷却机制,默认扩容立即执行,冷却3min,缩容需观察5min,冷却5min,另外创建pod的时间(约30s)不算入冷却时间
扩容条件为最大指标值>目标指标值,立刻扩容
缩容条件为最大指标值<目标指标值,等待5m缩容
期望pod数量策略为 期望副本数 = 当前副本数 × (当前指标值 / 目标指标值),结果向上取整
注意,这是有延迟的,具体看情况

