一、系统环境
 CentOS Linux release 7.9.2009 (Core)
 kubectl-1.20.4-0.x86_64
 kubelet-1.20.4-0.x86_64
 kubeadm-1.20.4-0.x86_64
 kubernetes-cni-0.8.7-0.x86_64
二、k8s架构
| 用途 | ip地址 | 主机名 | 
| master | 192.168.10.127 | minio-4 | 
| node01 | 192.168.10.124 | minio-1 | 
| node02 | 192.168.10.125 | minio-2 | 
| node03 | 192.168.10.126 | minio-3 | 
| nfs存储 | 192.168.10.143 | 
三、HPA简介
关于具体的概念请参考,官方文档(Pod 水平自动伸缩 - Kubernetes)
HPA的全称为(Horizontal Pod Autoscaling)它可以根据当前pod资源的使用率(如CPU、磁盘、内存等),进行副本数的动态的扩容与缩容,以便减轻各个pod的压力。当pod负载达到一定的阈值后,会根据扩缩容的策略生成更多新的pod来分担压力,当pod的使用比较空闲时,在稳定空闲一段时间后,还会自动减少pod的副本数量。
若要实现自动扩缩容的功能,要基于CPU利用率自动伸缩 replication controller、deployment和 replica set 中的 pod 数量,(除了 CPU 利用率)也可以 基于其他应程序提供的度量指标custom metrics。 pod 自动缩放不适用于无法缩放的对象,比如 DaemonSets。
Pod 水平自动伸缩特性由 Kubernetes API 资源和控制器实现。资源决定了控制器的行为。 控制器会周期性的获取平均 CPU 利用率,并与目标值相比较后来调整 replication controller 或 deployment 中的副本数量。

所以要实现水平自动扩缩容的功能,我们在k8s集群上要先安装【K8s 核心监控聚合器 metrics-server】没有安装这个功能模块。具体安装方法请参考我上一编文章(CSDN)
总之要在master上执行kubectl top node后,各项的资源使用指标能够出来,就没有问题
# kubectl top node
NAME      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
minio-1   55m          2%     1216Mi          64%
minio-2   66m          3%     1063Mi          56%
minio-3   36m          3%     1107Mi          58%
minio-4   130m         6%     1382Mi          73%
四、实现pod自动水平扩缩容
1、生成HPA控制器
vim php-fpm74-hpa.yaml
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: php-fpm74-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-fpm74
  minReplicas: 1  #最小pod数量
  maxReplicas: 3  #最大pod数量
  metrics:  #我是以cpu资源和内存资源来衡量指标,来扩缩容的
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 50
  - type: Resource
    resource:
      name: memory
      targetAverageValue: 80Mi
kubectl create -f php-fpm74-hpa.yaml
# kubectl get hpa
NAME            REFERENCE                TARGETS                 MINPODS   MAXPODS   REPLICAS   AGE
php-fpm74-hpa   Deployment/php-fpm74     23281664/80Mi, 1%/50%   1         3         1          38d
#在k8s面版上也可以看到创建的HPA

2、验证自动伸缩服务
用nginx+php服务来测试的
#创建php服务
vim php-fpm74-dep.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-fpm74
spec:
  selector:
    matchLabels:
      app: php-fpm74
  replicas: 1 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: php-fpm74
    spec:
      containers:
      - name: php-fpm74
        image: registry-op.test.cn/php-fpm:7.4
        ports:
        - containerPort: 9000
        resources:
          requests:
            cpu: 100m #这些资源的设置是必要的
            memory: 30Mi
          limits:
            cpu: 100m
            memory: 30Mi
 kubectl create -f  php-fpm74-dep.yaml
  
#vim php-fpm74-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: php-fpm74
  labels:
    app: php-fpm74
spec:
  ports:
  - port: 9000
    targetPort: 9000
    protocol: TCP
  type: ClusterIP
  selector:
    app: php-fpm74
kubcectl create -f php-fpm74-service.yaml
#vim nginx-dep.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-php74
spec:
  selector:
    matchLabels:
      app: nginx-php74
  replicas: 1 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx-php74
    spec:
      containers:
      - name: nginx
        image: registry-op.test.cn/nginx:1.14.9
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 100m
            memory: 30Mi
          limits:
            cpu: 100m
            memory: 30Mi
        volumeMounts:
          - mountPath: /etc/nginx/nginx.conf
            name: nginx-php74
            subPath: nginx.conf
      volumes:
      - name: nginx-php74
        configMap:
          name: nginx-php-configmap
          items:
           - key: nginx_php_conf
             path: nginx.conf
      imagePullSecrets:
      - name: registry-op.hjimi.cn
kubcectl create -f nginx-dep.yaml
#vim nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-php74
  labels:
    app: nginx-php74
spec:
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30001
    protocol: TCP
  type: NodePort
  selector:
    app: nginx-php74
#测试方法
这里是用ab工具测试的,直接测试phpinfo()页面
# ab -n 10000 -c 1000  http://pvc.test.cn/index.php
测试5分钟左右,使用kubectl get hpa查看一下结果,可以看到结果是按照预想的,HPA实现pod副本数量的自动扩容与缩容就实现了。
# kubectl get hpa
NAME            REFERENCE                TARGETS                     MINPODS   MAXPODS   REPLICAS   AGE
php-fpm74-hpa   Deployment/php-fpm74     15829674666m/80Mi, 9%/50%   1         3         3          38d
# kubectl top pod
NAME                              CPU(cores)   MEMORY(bytes)
php-fpm74-6dfd9d9b4c-8cr5b        1m           23Mi
php-fpm74-6dfd9d9b4c-k9w8v        1m           7Mi
php-fpm74-6dfd9d9b4c-lbbq4        1m           14Mi