CKA [Networking] – HPA的使用

HPA是让pod水平扩展,使用HPA之前必须在Kubernetes集群中按照Metric Server否则就无法使用。因为这个Metric Server的作用就是记录着服务器的资源使用状况,如果没有安装这个Metric Server那么Kubernetes就无法得知是否足够资源,HPA 会显示状态为 Unknown,无法自动扩缩容。

HPA 可以用于 Deployment、ReplicaSet、StatefulSet 等控制器,但不能用于 DaemonSet。

🧠 为什么 HPA 不能用于 DaemonSet?
  • DaemonSet 的设计目标是:在每个节点上运行一个(或多个)Pod 实例,不随着负载自动扩缩容。
  • 因此它的 Pod 数量是 和节点数绑定 的,不支持动态增减副本。
  • 这就与 HPA 的目标(根据负载动态调整副本数)逻辑上冲突

使用案例

我们创建一个服务应用, 然后创建一个观察terminal , 和一个执行一直请求服务应用的程式,目的就是为了拉高服务应用的使用量,以便达到水平扩展。

1. 创建Deployment和Service

在设定HPA的前提是你的Deployment必须设置了Request资源的请求,否则无法设置HPA

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: registry.k8s.io/hpa-example
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 50m
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache

2. 创建HPA,使用yaml或命令

【命令行】- 缺点是无法为HPA命名
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=5
【Yaml文件】
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: cpu-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 5
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 50
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 60

3. 进行测试

Terminal 1 【执行watch一直观察HPA的变化】

kubectl get hpa cpu-hpa --watch

Terminal 2 【执行一直对服务APP进行http请求】

kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

可以看到你的pod使用状况慢慢提高,然后进行扩容。扩容的速度比较快,但是缩容就相对比较慢,如果pod是cpu用来立刻降低了,也不会马上缩容的,所以需要多一下。

HPA设置了stabilizationWindowSeconds,这个是防止使用量降低立马缩容,而是等待一段时间之后才进行缩容,所以流量可能比较瞬间波动,从而提高系统的稳定性。

【查看pod的数量,看看是否有扩容】
kubectl get pods

4. 删除设置

kubectl delete hpa cpu-hpa

Loading

Facebook评论