K8s HPA

MetricsServer 和 AB压测工具

安装MetricsServer

Metrics Server 是Kubernetes中一个核心的指标收集器(默认不安装),可以提供资源利用率相关的重要指 标信息。主要用于实时监控和自动化任务。

 # 下载yaml清单
 curl -o metrics-server.yaml https://gh-proxy.com/https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
 ​
 # 修改yaml清单
 - 将唯一Deployment中的image换成阿里云镜像
     image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.4
 - args添加如下两行
     # 允许使用不安全的TLS连接来与kubelet通信,生产环境谨慎!!!
     - --kubelet-insecure-tls
     # 与 API Server 通信时首选的IP和端口
     - --kubelet-preferred-address-types=InternalDNS,InternalIP,ExternalDNS,ExternalIP,Hostname
     
 # 安装metrics-server
 kubectl apply -f metrics-server.yaml
 ​
 # 查看deploy
 watch -n 1 kubectl get deploy metrics-server -n kube-system
 ​
 # 查看节点资源使用情况
 kubectl top node
 ​
 # 查看pod资源使用情况(kube-system命名空间)
 kubectl top pod -n kube-system

安装AB压测工具

AB压测工具是由Apache提供的一个非常方便的命令行程序,用于测试HTTP服务的性能。

 # 安装httpd(Apache服务器)包含AB压测工具 - CentOS
 sudo yum update && sudo yum install httpd -y
 ​
 # 安装httpd(Apache服务器)包含AB压测工具 - Ubuntu
 sudo apt update && sudo apt install apache2 -y

基本命令格式

 # x表示总的请求数; y表示并发发起的请求数;
 ab -n x -c y <压测地址>

创建测试所用的deployment 和 service:

 apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: ab-deploy
   namespace: hpa-ns
   labels:
     app: ab
 spec:
   selector:
     matchLabels:
       app: ab
   replicas: 1
   template:
     metadata:
       labels:
         app: ab
     spec:
       # 定向调度到node1上
       nodeName: node1
       containers:
         - name: container-nginx
           image: nginx:1.26.2
           ports:
             - containerPort: 80
 ---
 apiVersion: v1
 kind: Service
 metadata:
   name: ab-service
   namespace: hpa-ns
   labels:
     app: ab
 spec:
   selector:
     app: ab
   type: NodePort
   ports:
   - port: 80
     targetPort: 80
     nodePort: 30080

实际操作

 # 创建命名空间
 kubectl create ns hpa-ns
 ​
 # 创建资源
 kubectl apply -f ab.yaml
 ​
 # 监视node和pod的资源使用情况
 watch -n 1 kubectl top node node1
 watch -n 1 kubectl top pod -n hpa-ns
 ​
 # AB压力测试
 ab -n 10000 -c 100 http://192.168.7.71:30080/index.html

HPA 命令参考

hpa控制器要求pod必须设定cpu或memory的资源配额

 spec:
   containers:
     - name: container-nginx
       image: nginx:1.26.2
       ports:
         - containerPort: 80
       # 资源配额
       resources:
         requests:
           cpu: 100m
           memory: 100Mi
         limits:
           cpu: 200m
           memory: 200Mi

ab.yaml 文件 已做资源配额

 apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: ab-deploy
   namespace: hpa-ns
   labels:
     app: ab
 spec:
   selector:
     matchLabels:
       app: ab
   replicas: 1
   template:
     metadata:
       labels:
         app: ab
     spec:
       nodeName: node1
       containers:
         - name: container-nginx
           image: nginx:1.26.2
           ports:
             - containerPort: 80
           resources:
             requests:
               cpu: 100m
               memory: 100Mi
             limits:
               cpu: 200m
               memory: 200Mi
 ---
 apiVersion: v1
 kind: Service
 metadata:
   name: ab-service
   namespace: hpa-ns
   labels:
     app: ab
 spec:
   selector:
     app: ab
   type: NodePort
   ports:
     - port: 80
       targetPort: 80
       nodePort: 30080

通过命令管理hpa控制器

 # 查看hpa
 kubectl get hpa -n hpa-ns
 ​
 # apply -f ab.yaml
 kubectl apply -f ab.yaml
 ​
 # 创建hpa
 # --min代表pod最小数量;--max代表pod最大数量;--cpu-percent代表cpu的使用率阈值
 kubectl autoscale deploy ab-deploy --min=1 --max=10 --cpu-percent=20 --name=my-hpa -n hpa-ns
 ​
 # 删除hpa
 kubectl delete hpa my-hpa -n hpa-ns

AB压力测试

# 查看hpa(参数-w可观察监控数据的连续变化)
kubectl get hpa -n hpa-ns -w

# 启动压力测试
ab -n 10000 -c 1000 http://192.168.7.71:30080/index.html

YAML 文件参考(YAML方式)

创建hpa控制器的yaml文件前,先查阅一下该类型的资源版本

# 查看hpa资源
kubectl api-resources | grep hpa

# 查看api版本(v1-仅支持基于CPU指标的自动扩缩;v2-支持基于CPU、内存和自定义指标的自动扩缩)
kubectl api-versions | grep autoscaling

自动扩缩容

# api版本
apiVersion: autoscaling/v2
# 资源类型
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
  # 所在命名空间
  namespace: hpa-ns
spec:
  # hpa的目标资源(要求目标资源中的pod必须设定cpu或memory的资源配额)
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: ab-deploy
  # pod最小值
  minReplicas: 3
  # pod最大值
  maxReplicas: 10
  # 度量指标
  metrics:
    # 指标的类型(Resource、External、Object、Pods、ContainerResource其中之一)
    # Resource - CPU和内存利用率指标
    # Pods - 网络利用率和流量
    # Object - 特定对象的指标,如:Ingress按每秒使用请求数来扩展容器
    - type: Resource
      resource:
        # resource名字
        name: cpu
        # 目标值
        target:
          # 度量类型(Utilization-利用率、AverageValue-平均值、Value-值其中之一)
          type: Utilization
          # 度量的阈值(<50%缩容、>50%扩容)
          averageUtilization: 50
    - type: Resource
      resource:
        # resource名字
        name: memory
        # 目标值
        target:
          # 度量类型(Utilization-利用率、AverageValue-平均值、Value-值其中之一)
          type: AverageValue
          # 度量的阈值(<600Mi缩容、>600Mi扩容)
          averageValue: 600Mi

扩缩容速度

spec:
  # 精确控制扩缩容的速度
  behavior:

    # 扩容速度
    scaleUp:
      # 稳定窗口期。即增加或减少Pod数量后保持不变的时间(单位:秒),默认0s
      stabilizationWindowSeconds: 0
      policies:
        # 策略类型(相对数)
        - type: Percent
          # 百分比数值
          value: 100
          # 该值必须处于(0s, 1800s]
          periodSeconds: 15

        # 策略类型(绝对数)
        - type: Pods
          value: 4
          periodSeconds: 15

    # 缩容速度
    scaleDown:
      # 稳定窗口期(单位:秒),默认300s
      stabilizationWindowSeconds: 300
      policies:
        - type: Percent
          value: 100
          periodSeconds: 15
        - type: Pods
          value: 4
          periodSeconds: 15

可执行 my-hpa.yaml 文件(自动扩缩容 )

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
  namespace: hpa-ns
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: ab-deploy
  minReplicas: 3
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 20

可执行 my-hpa.yaml 文件(扩缩容速度 )

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: my-hpa
  namespace: hpa-ns
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: ab-deploy
  minReplicas: 3
  maxReplicas: 10
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
        - type: Percent
          value: 100
          periodSeconds: 15
    scaleDown:
      stabilizationWindowSeconds: 30
      policies:
        - type: Percent
          value: 100
          periodSeconds: 15

测试

# apply
kubectl apply -f my-hpa.yaml

# 查看hpa
kubectl get hpa my-hpa -n hpa-ns -w

# 启动压力测试
ab -n 50000 -c 1000 http://192.168.7.71:30080/index.html