一、系统环境

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.127minio-4
node01192.168.10.124minio-1
node02192.168.10.125minio-2
node03192.168.10.126minio-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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐