Kubernetes HPA(Pod 水平自动伸缩)部署与资源限制全流程
目录
一、HPA 核心概念
二、部署 metrics-server(资源监控组件)
1. 准备镜像(所有 Node 节点)
2. 安装 metrics-server(使用 Helm)
3. 验证 metrics-server 部署
三、部署 HPA 并测试自动扩缩容
1. 准备测试镜像(所有 Node 节点)
2. 创建测试 Deployment 和 Service
3. 创建 HPA 控制器
4. 模拟负载并观察扩缩容
(1)创建负载生成器
(2)观察 HPA 动态扩缩容
(3)停止负载并观察缩容
四、资源限制配置(扩展)
1. Pod 级资源限制
2. 命名空间级资源限制
(1)资源配额(ResourceQuota)
(2)默认资源限制(LimitRange)
总结
一、HPA 核心概念
HPA(Horizontal Pod Autoscaler)通过监控 Pod 的 CPU / 内存利用率,自动调整 Deployment/RC/RS 的 Pod 副本数量,实现:
- 动态扩缩容:负载高时增加副本,负载低时减少副本
- 依赖组件:需部署 metrics-server 提供资源监控数据
- 默认周期:每 30 秒检测一次 Pod 负载(可通过 kube-controller-manager 配置调整)
二、部署 metrics-server(资源监控组件)
metrics-server 是集群资源数据的聚合器,为 HPA、kubectl top
等提供数据支持。
1. 准备镜像(所有 Node 节点)
# 上传镜像包到 /opt 目录并加载
cd /opt
docker load -i metrics-server.tar
2. 安装 metrics-server(使用 Helm)
# 创建工作目录
mkdir -p /opt/metrics && cd /opt/metrics# 添加稳定仓库(国内镜像)
helm repo remove stable # 清理旧仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts
helm repo update# 拉取 Chart 包
helm pull stable/metrics-server# 创建自定义配置(解决证书和地址问题)
vim metrics-server.yaml
args:- --logtostderr- --kubelet-insecure-tls # 忽略 kubelet 证书验证(测试环境)- --kubelet-preferred-address-types=InternalIP # 使用节点内网 IP 通信
image:repository: k8s.gcr.io/metrics-server-amd64tag: v0.3.2 # 镜像版本# 安装 metrics-server 到 kube-system 命名空间
helm install metrics-server stable/metrics-server -n kube-system -f metrics-server.yaml
3. 验证 metrics-server 部署
# 查看 Pod 状态(确保 Running)
kubectl get pods -n kube-system | grep metrics-server# 验证资源监控(需等待 1-2 分钟)
kubectl top node # 查看节点资源使用率
kubectl top pods --all-namespaces # 查看所有命名空间 Pod 资源使用率
三、部署 HPA 并测试自动扩缩容
以 hpa-example
镜像(含 CPU 密集型测试代码)为例,测试 HPA 功能。
1. 准备测试镜像(所有 Node 节点)
cd /opt
docker load -i hpa-example.tar # 加载测试镜像
2. 创建测试 Deployment 和 Service
# 创建部署文件
vim hpa-pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: php-apachelabels:run: php-apache
spec:replicas: 1selector:matchLabels:run: php-apachetemplate:metadata:labels:run: php-apachespec:containers:- name: php-apacheimage: gcr.io/google_containers/hpa-exampleimagePullPolicy: IfNotPresentports:- containerPort: 80resources:requests:cpu: 200m # 必须设置请求资源,HPA 基于此计算使用率
---
apiVersion: v1
kind: Service
metadata:name: php-apache
spec:ports:- port: 80targetPort: 80selector:run: php-apache# 部署资源
kubectl apply -f hpa-pod.yaml# 验证部署
kubectl get pods # 确保 php-apache Pod 处于 Running 状态
3. 创建 HPA 控制器
# 创建 HPA:CPU 使用率阈值 50%,最小 1 副本,最大 10 副本
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10# 查看 HPA 状态(TARGETS 列需等待 metrics-server 采集数据,约 1 分钟)
kubectl get hpa
# 正常输出:NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
# php-apache Deployment/php-apache 0%/50% 1 10 1 1m
4. 模拟负载并观察扩缩容
(1)创建负载生成器
# 创建一个客户端 Pod,持续发送请求压测
kubectl run -it load-generator --image=busybox /bin/sh# 在客户端 Pod 内执行循环请求(增加负载)
while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
(2)观察 HPA 动态扩缩容
# 实时监控 HPA 状态(新开终端)
kubectl get hpa -w
# 现象:CPU 使用率超过 50% 后,副本数逐渐增加(最大 10 个)# 查看 Pod 数量变化
kubectl get pods -w
(3)停止负载并观察缩容
# 在负载生成器终端按 Ctrl+C 停止请求
# 观察 HPA:CPU 使用率下降后,副本数逐渐减少(缩容速度较慢,避免频繁波动)
kubectl get hpa -w
四、资源限制配置(扩展)
Kubernetes 通过 requests
(初始分配)和 limits
(最大限制)控制 Pod 资源使用,避免单个 Pod 耗尽节点资源。
1. Pod 级资源限制
在 Deployment 中为容器配置资源限制:
spec:containers:- name: appimage: nginxresources:requests: # 初始请求资源(调度依据)cpu: 100m # 100 毫核(0.1 CPU)memory: 128Mi # 128 MB 内存limits: # 最大资源限制(超限时可能被终止)cpu: 500m # 500 毫核(0.5 CPU)memory: 512Mi # 512 MB 内存
2. 命名空间级资源限制
通过 ResourceQuota
和 LimitRange
限制命名空间内所有资源的总配额和默认值。
(1)资源配额(ResourceQuota)
限制命名空间内资源总量:
# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:name: compute-resourcesnamespace: test # 目标命名空间
spec:hard:pods: "20" # 最大 Pod 数量requests.cpu: "2" # 总 CPU 请求上限requests.memory: 1Gi # 总内存请求上限limits.cpu: "4" # 总 CPU 限制上限limits.memory: 2Gi # 总内存限制上限
应用:kubectl apply -f resource-quota.yaml
(2)默认资源限制(LimitRange)
为未指定资源限制的 Pod 设置默认值:
# limit-range.yaml
apiVersion: v1
kind: LimitRange
metadata:name: default-resourcesnamespace: test
spec:limits:- default: # 默认 limits(最大限制)cpu: 500mmemory: 512MidefaultRequest: # 默认 requests(初始分配)cpu: 100mmemory: 256Mitype: Container # 作用于容器
应用:kubectl apply -f limit-range.yaml
总结
- HPA 工作流:部署 metrics-server → 创建带资源请求的 Deployment → 配置 HPA 规则 → 自动根据负载扩缩容。
- 关键配置:HPA 依赖 Pod 的
requests.cpu
计算使用率,需确保配置正确。 - 资源限制:通过 Pod 级
requests/limits
和命名空间级ResourceQuota/LimitRange
避免资源滥用。 - 扩缩容特性:扩容快、缩容慢,防止负载波动导致的频繁调整。