一、系统环境
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