目录

一、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-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

总结

  1. HPA 工作流:部署 metrics-server → 创建带资源请求的 Deployment → 配置 HPA 规则 → 自动根据负载扩缩容。
  2. 关键配置:HPA 依赖 Pod 的 requests.cpu 计算使用率,需确保配置正确。
  3. 资源限制:通过 Pod 级 requests/limits 和命名空间级 ResourceQuota/LimitRange 避免资源滥用。
  4. 扩缩容特性:扩容快、缩容慢,防止负载波动导致的频繁调整。

更多推荐