HPA控制器
HPA控制器:
此控制器用于自动弹性伸缩
支持核心资源和非核心资源。核心资源的cpu可以压缩,但内存不能压缩,非核心资源中的内存可以压缩
需要依赖metric-server数据采集,根据给定的数据指标伸缩
默认15s查询一次metric采集的数据,可通过 -horizontal-pod-autoscaler-sync-period修改
工作方式:
请求api-server发起自动扩容,api-server调用controller manager,通过控制器管理员调用HPA控制器, hpa通过查询metric数据,达到定义的期望值
metrics-server
部署
注意:不要按照官方文档所说的那样直接安装,会不可用的
wget -O metrics-server.yml https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
sed -i '/metric-resolution/a\ - --kubelet-insecure-tls' metrics-server.yml
kubectl apply -f metrics-server.yml
配置语法:
kubectl explain hpa.spec
spec:
behavior: <Object> #配置缩容、扩容时的行为。默认使用HPAScalingRules策略扩容
scaleDown: #缩容策略
maxReplicas: int #必需,最大副本
minReplicas: int #必需。它默认为 1个Pod。如果启用了Alpha特性门控HPAScaleToZero并且配置了至少一个Object或External度量指标,则允许为0
metrics: <[]Object> #计算指标
containerResource: #容器资源
container: 容器名
name: 资源名称
target: #期望目标值
type: 类型
#Utilization,利用率
#Value,值
#AverageValue,平均值
averageUtilization
averageValue
value
pods #应用被弹性伸缩的pod对象的特定指标
resource: <Object> #pod的cpu、内存资源
name: 名称
target: <Object> -required-
averageUtilization #所有pod平均利用率
averageValue #所有pod平均值
type: 类型
#Utilization,利用率
#Value,值
#AverageValue,平均值
value
type: 监控资源类型
#ContainerResource,只有在启用HPAContainerMetrics特性后才能使用
#External
#Object
#Pods
#Resource
external #用于集群外的全局指标
metric: #通过名称和选择算符识别目标指标
name: 指标名称
selector: 指标选择器
target: #期望目标值
type:
averageUtilization #平均利用率
averageValue #平均值
value #固定值
object #应用描述集群中某单一对象的特定指标,如Ingress对象上的hits-per-second
describedObject: #控制器描述信息
kind
name
apiVersion
metric:
name
selector
target
scaleTargetRef: <Object> #必须。监控指定的控制器的资源使用
apiVersion: 版本 #要写上,不然找不到控制器
kind: 控制器 #必需
name: 控制器名称 #必需
命令行创建:
kubectl autoscale 控制器 名称 --min=最小 --max=最大 --cpu-percent=利用率
案例:
例1:动态扩展pod,用命令行创建hpa
只能扩容控制器创建的pod
1)创建pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dep
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources:
requests:
cpu: "50m"
memory: "50Mi"
limits:
cpu: "50m"
memory: "50Mi"
---
apiVersion: v1
kind: Service
metadata:
name: ngx-svc
spec:
ports:
- name: 80-80
port: 80
targetPort: 80
nodePort: 31001
selector:
app: nginx
type: NodePort
2)创建hpa控制器
kubectl autoscale deployment nginx-dep --min=1 --max=4 --cpu-percent=50
3)ab压测
yum install -y httpd-tools
ab -c 100 -n 50000 2.2.2.13:31001/index.html
#此时能发现自动增加了pod
watch -n0.1 'kubectl top pod'
kubectl describe hpa nginx-dep
例2: 配置清单创建hpa,扩容pod
1)创建ngx的pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: ngx-dep
spec:
replicas: 1
selector:
matchLabels:
app: ngx
template:
metadata:
labels:
app: ngx
spec:
containers:
- name: ngx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
resources:
requests:
cpu: "50m"
memory: "50Mi"
limits:
cpu: "50m"
memory: "50Mi"
---
apiVersion: v1
kind: Service
metadata:
name: ngx-svc
spec:
ports:
- name: 80-80
port: 80
targetPort: 80
nodePort: 31002
selector:
app: ngx
type: NodePort
2)创建hpa控制器
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: ngx-hpa
spec:
scaleTargetRef:
kind: Deployment
name: ngx-dep
apiVersion: apps/v1
minReplicas: 2
maxReplicas: 4
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
3)压测并监控
ab -c 100 -n 50000 2.2.2.10:31002/index.html
watch -n0.1 "kubectl top po"