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的全称为(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
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
文章图片
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
推荐阅读
- federation--kubernetes集群联邦的实现
- (1)redis集群原理及搭建与使用(1)
- K8S|K8S 生态周报| Istio 即将发布重大安全更新,多个版本受影响
- 如何在Kubernetes|如何在Kubernetes 里添加自定义的 API 对象(一)
- 个人日记|K8s中Pod生命周期和重启策略
- k8s|Scheduling Framework 与 Extender对比及详细介绍
- k8s|k8s(六)(配置管理与集群安全机制)
- 2021-04-24|2021-04-24 K8s构建Jenkins(1)
- 啥是负载均衡、高并发、分布式、集群()
- 三十一、|三十一、 Elasticsearch集群搭建部署及配置