k8s|kubernetes集群水平自动伸缩(HPA)

一、系统环境

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|kubernetes集群水平自动伸缩(HPA)
文章图片


所以要实现水平自动扩缩容的功能,我们在k8s集群上要先安装【K8s 核心监控聚合器 metrics-server】没有安装这个功能模块。具体安装方法请参考我上一编文章(CSDN)
总之要在master上执行kubectl top node后,各项的资源使用指标能够出来,就没有问题
# kubectl top node NAMECPU(cores)CPU%MEMORY(bytes)MEMORY% minio-155m2%1216Mi64% minio-266m3%1063Mi56% minio-336m3%1107Mi58% minio-4130m6%1382Mi73%

四、实现pod自动水平扩缩容 1、生成HPA控制器 vimphp-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

【k8s|kubernetes集群水平自动伸缩(HPA)】kubectl create -f php-fpm74-hpa.yaml
# kubectl get hpa NAMEREFERENCETARGETSMINPODSMAXPODSREPLICASAGE php-fpm74-hpaDeployment/php-fpm7423281664/80Mi, 1%/50%13138d

#在k8s面版上也可以看到创建的HPA
k8s|kubernetes集群水平自动伸缩(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 -fphp-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 1000http://pvc.test.cn/index.php

测试5分钟左右,使用kubectl get hpa查看一下结果,可以看到结果是按照预想的,HPA实现pod副本数量的自动扩容与缩容就实现了。
# kubectl get hpa NAMEREFERENCETARGETSMINPODSMAXPODSREPLICASAGE php-fpm74-hpaDeployment/php-fpm7415829674666m/80Mi, 9%/50%13338d# kubectl top pod NAMECPU(cores)MEMORY(bytes) php-fpm74-6dfd9d9b4c-8cr5b1m23Mi php-fpm74-6dfd9d9b4c-k9w8v1m7Mi php-fpm74-6dfd9d9b4c-lbbq41m14Mi


    推荐阅读