Kubernetes HPA(Pod 水平自动伸缩)部署与资源限制全流程
·
目录
一、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-amd64
tag: 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-apache
labels:
run: php-apache
spec:
replicas: 1
selector:
matchLabels:
run: php-apache
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: gcr.io/google_containers/hpa-example
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources:
requests:
cpu: 200m # 必须设置请求资源,HPA 基于此计算使用率
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
spec:
ports:
- port: 80
targetPort: 80
selector:
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: app
image: nginx
resources:
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-resources
namespace: 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-resources
namespace: test
spec:
limits:
- default: # 默认 limits(最大限制)
cpu: 500m
memory: 512Mi
defaultRequest: # 默认 requests(初始分配)
cpu: 100m
memory: 256Mi
type: Container # 作用于容器
应用:kubectl apply -f limit-range.yaml
总结
- HPA 工作流:部署 metrics-server → 创建带资源请求的 Deployment → 配置 HPA 规则 → 自动根据负载扩缩容。
- 关键配置:HPA 依赖 Pod 的
requests.cpu计算使用率,需确保配置正确。 - 资源限制:通过 Pod 级
requests/limits和命名空间级ResourceQuota/LimitRange避免资源滥用。 - 扩缩容特性:扩容快、缩容慢,防止负载波动导致的频繁调整。
更多推荐
所有评论(0)