文档,https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/
1.Deployment动态扩容
1.1 什么是HPA
Horizontal Pod Autoscaler
(HPA,Pod水平自动伸缩),根据平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标自动调整 Deployment 、ReplicaSet 或 StatefulSet 或其他类似资源,实现部署的自动扩展和缩减,让部署的规模接近于实际服务的负载。HPA不适用于无法缩放的对象,例如DaemonSet
实际生产中,一般使用这四类指标:
- Resource metrics——CPU核 和 内存利用率指标。
- Pod metrics——例如网络利用率和流量。
- Object metrics——特定对象的指标,比如Ingress, 可以按每秒使用请求数来扩展容器
- Custom metrics——自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自动扩容
1.2 为什么要用
虽然通过 kubectl scale
命令可以实现扩缩容功能,但是这个操作需要运维人员手工进行干预,不仅可能处理不及时,而且还可能误操作导致生产事故。如果我们能够根据系统当前的运行状态自动进行扩缩容,比如当检测到某个应用负载过高时自动对其扩容,这样就可以给运维人员带来极大的方便。为此,Kubernetes 提供了一种新的资源对象:Horizontal Pod Autoscaling(Pod 水平自动伸缩,简称 HPA),HPA 通过监控 Pod 的负载变化来确定是否需要调整 Pod 的副本数量,从而实现动态扩缩容
1.3 ⾃动扩缩容算法
算法:副本数 = [当前副本数 * (当前指标 / 期望指标)]
当前指标
:当前Pod已经达到了百分之多少的压⼒;
期望指标
:当Pod达到期望的指标百分⽐时就要进⾏扩容;
如,当前副本为1,当前当前指标值250%,⽽期望的指标值是50%,则副本数会翻5倍,因为 1 * (250%/50%) = 5
1.4 安装MetricServer
为了实现动态扩缩容,首先我们需要对 Kubernetes 集群的负载情况进行监控,Kubernetes 从 v1.8 开始提出了 Metrics API 的概念来解决这个问题
- 下载指定yaml文件
#基于k8s-1.24
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/metrics-server-helm-chart-3.8.2/components.yaml
#下载最新
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
#基于k8s-1.24
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/metrics-server-helm-chart-3.8.2/components.yaml
#下载最新
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
- 修改配置文件
...
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --kubelet-insecure-tls # 加上该启动参数,不加可能会报错
image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.1 # 镜像地址根据情况修改
imagePullPolicy: IfNotPresent
...
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- args:
- --cert-dir=/tmp
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --kubelet-insecure-tls # 加上该启动参数,不加可能会报错
image: registry.aliyuncs.com/google_containers/metrics-server:v0.6.1 # 镜像地址根据情况修改
imagePullPolicy: IfNotPresent
- 安装
kubectl apply -f components.yaml
#查看
kubectl get pod -n kube-system | grep metrics-server
# 查看node和pod资源使用情况
[root@kube-master ~]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master01 296m 14% 1297Mi 70%
kube-node01 320m 8% 1674Mi 61%
kube-node02 234m 11% 1415Mi 49%
kube-node03 227m 11% 1478Mi 52%
[root@kube-master ~]# kubectl top pods
NAME CPU(cores) MEMORY(bytes)
app-prod-97dfb4bf-h59vq 1m 26Mi
app-prod-tcp-7bdfd5577c-tb8ls 1m 18Mi
custom-nginx-errors-6df8ddcc64-ztqnz 0m 11Mi
demo-6d4fc77748-dmg94 1m 22Mi
demo-6d4fc77748-fbvg6 1m 17Mi
nfs-client-provisioner-7f5bc48c68-8wld4 3m 20Mi
old-demo-687c6ccd99-2rzwr 1m 26Mi
old-demo-687c6ccd99-rv9fz 1m 17Mi
kubectl apply -f components.yaml
#查看
kubectl get pod -n kube-system | grep metrics-server
# 查看node和pod资源使用情况
[root@kube-master ~]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master01 296m 14% 1297Mi 70%
kube-node01 320m 8% 1674Mi 61%
kube-node02 234m 11% 1415Mi 49%
kube-node03 227m 11% 1478Mi 52%
[root@kube-master ~]# kubectl top pods
NAME CPU(cores) MEMORY(bytes)
app-prod-97dfb4bf-h59vq 1m 26Mi
app-prod-tcp-7bdfd5577c-tb8ls 1m 18Mi
custom-nginx-errors-6df8ddcc64-ztqnz 0m 11Mi
demo-6d4fc77748-dmg94 1m 22Mi
demo-6d4fc77748-fbvg6 1m 17Mi
nfs-client-provisioner-7f5bc48c68-8wld4 3m 20Mi
old-demo-687c6ccd99-2rzwr 1m 26Mi
old-demo-687c6ccd99-rv9fz 1m 17Mi
2.案例
目前,HPA 有两个正式版本:v1 和 v2,v2 又有两个 beta 版本,v2beta1 和 v2beta2,这两个 beta 版本在最新的 Kubernetes 版本中都已经废弃。HPA v1 版本 只支持基于 CPU 的自动扩缩容,如果要使用基于内存的自动扩缩容,必须使用 HPA v2 版本
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hap-nginx
spec:
maxReplicas: 10 # 最大扩容到10个节点(pod)
minReplicas: 1 # 最小扩容1个节点(pod)
metrics:
- resource:
name: cpu
target:
averageUtilization: 40 # CPU 平局资源使用率达到40%就开始扩容,低于40%就是缩容
# 设置内存
# AverageValue:40
type: Utilization
type: Resource
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hap-nginx
---
apiVersion: v1
kind: Service
metadata:
name: hap-nginx
spec:
type: NodePort
ports:
- name: "http"
port: 80
targetPort: 80
nodePort: 30080
selector:
service: hap-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hap-nginx
spec:
replicas: 1
selector:
matchLabels:
service: hap-nginx
template:
metadata:
labels:
service: hap-nginx
spec:
containers:
- name: hap-nginx
image: nginx:latest
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 200m
memory: 200Mi
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hap-nginx
spec:
maxReplicas: 10 # 最大扩容到10个节点(pod)
minReplicas: 1 # 最小扩容1个节点(pod)
metrics:
- resource:
name: cpu
target:
averageUtilization: 40 # CPU 平局资源使用率达到40%就开始扩容,低于40%就是缩容
# 设置内存
# AverageValue:40
type: Utilization
type: Resource
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hap-nginx
---
apiVersion: v1
kind: Service
metadata:
name: hap-nginx
spec:
type: NodePort
ports:
- name: "http"
port: 80
targetPort: 80
nodePort: 30080
selector:
service: hap-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hap-nginx
spec:
replicas: 1
selector:
matchLabels:
service: hap-nginx
template:
metadata:
labels:
service: hap-nginx
spec:
containers:
- name: hap-nginx
image: nginx:latest
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 200m
memory: 200Mi
主要参数解释如下:
- scaleTargetRef:目标作用对象,可以是Deployment、ReplicationController或ReplicaSet。
- minReplicas和maxReplicas:Pod副本数量的最小值和最大值,系统将在这个范围内进行自动扩缩容操作,并维持每个Pod的内存使用率为40%,这个值就是上面设置的阈值averageUtilization。
- metrics:目标指标值。在metrics中通过参数type定义指标的类型;通过参数target定义相应的指标目标值,系统将在指标数据达到目标值时(考虑容忍度的区间,见前面算法部分的说明)触发扩缩容操作。
- 对于CPU使用率,在target参数中设置averageUtilization定义目标平均CPU使用率。
- 对于内存资源,在target参数中设置AverageValue定义目标平均内存使用值
2.1 ab压力测试
yum install httpd -y
ab -n 100000 -c 800 http://local-168-182-112:30080/
#-c:并发数
#-n:总请求数
yum install httpd -y
ab -n 100000 -c 800 http://local-168-182-112:30080/
#-c:并发数
#-n:总请求数
- 查看 pod
kubectl get pods -w|grep hap
kubectl get pods -w|grep hap