k8s hpa详解
k8s hpa详解
1、什么是hpa呢?
-
k8s水平扩缩容的核心控制器,通过监控指标动态调整deploy/statefulset/的pod数量
-
当请求的的流量非常多的时候,可以动态的创建多个pod,流量小的时候,自动的缩容pod
-
基于pod里面容器的request字段的

2、安装metrics-server
- 这个是可以监控node cpu,mem, pod使用了多少资源的
[root@master01 hpa]# wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.4/components.yaml
# 添加135行的
- --kubelet-insecure-tls
# 就可以监控node节点使用率了
[root@master01 hpa]# kubectl top node
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master01 188m 9% 1607Mi 68%
master02 173m 8% 1559Mi 66%
node 131m 6% 1050Mi 45%
[root@master01 hpa]# kubectl top pod -n kube-system
NAME CPU(cores) MEMORY(bytes)
calico-kube-controllers-54756b744f-dmqrm 1m 43Mi
calico-node-qjff7 19m 186Mi
calico-node-x8fqd 19m 200Mi
calico-node-xs5m8 16m 206Mi
coredns-665d974787-46d59 1m 20Mi
coredns-665d974787-s564k 1m 24Mi
etcd-master01 20m 96Mi
# 镜像问题的话,使用华为云镜像也可以的
3、创建deploy
[root@master01 hpa]# cat deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: d1
name: d1
spec:
replicas: 3
selector:
matchLabels:
app: d1
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: d1
spec:
containers:
- image: nginx:1.25
imagePullPolicy: IfNotPresent
name: nginx
resources:
requests: # 必须要有这个容器资源限制,才能实现hpa
cpu: 100m
status: {}
4、创建hpa
[root@master01 hpa]# cat hpa.yml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpanginx
spec:
scaleTargetRef: # 监控哪些deploy
apiVersion: apps/v1
kind: Deployment
name: d1 # deploy的name
minReplicas: 3 # 最小pod数量,不能小于deploy的副本数
maxReplicas: 7 # 最大pod数量
metrics: # 定义伸缩的规则
- type: Resource # 类型是资源
resource:
name: cpu # cpu
target:
type: Utilization # 利用率
averageUtilization: 3 # cpu的平均利用率是3%
[root@master01 hpa]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpanginx Deployment/d1 0%/3% 3 7 3 2m7s
5、模拟测试
创建一个svc,写一个循环脚本
[root@master01 hpa]# kubectl expose deployment d1 --type ClusterIP --port 80 --target-port 80 --name d1-svc
service/d1-svc exposed
[root@master01 hpa]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
d1-svc ClusterIP 10.109.184.161 <none> 80/TCP 2s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 15d
[root@master01 hpa]# cat curl.sh
while `true`
do
curl 10.109.184.161 &> /dev/null
done
执行脚本,观察hpa使用率,pod数量
[root@master01 hpa]# bash curl.sh
[root@master01 hpa]# kubectl get hpa -w
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpanginx Deployment/d1 0%/3% 3 7 3 4m59s
hpanginx Deployment/d1 7%/3% 3 7 3 5m16s
hpanginx Deployment/d1 10%/3% 3 7 6 5m31s
[root@master01 ~]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
d1-84dcd487dd-9jp2l 1/1 Running 0 10m
d1-84dcd487dd-hkf9w 1/1 Running 0 10m
d1-84dcd487dd-tvr7b 1/1 Running 0 10m
d1-84dcd487dd-dbh52 0/1 Pending 0 0s
d1-84dcd487dd-dbh52 0/1 Pending 0 0s
d1-84dcd487dd-zhnq4 0/1 Pending 0 0s
d1-84dcd487dd-vb2r4 0/1 Pending 0 0s
d1-84dcd487dd-zhnq4 0/1 Pending 0 0s
d1-84dcd487dd-vb2r4 0/1 Pending 0 0s
d1-84dcd487dd-dbh52 0/1 ContainerCreating 0 0s
d1-84dcd487dd-zhnq4 0/1 ContainerCreating 0 0s
d1-84dcd487dd-vb2r4 0/1 ContainerCreating 0 0s
d1-84dcd487dd-zhnq4 0/1 ContainerCreating 0 1s
d1-84dcd487dd-dbh52 0/1 ContainerCreating 0 1s
d1-84dcd487dd-vb2r4 0/1 ContainerCreating 0 1s
d1-84dcd487dd-vb2r4 1/1 Running 0 2s
d1-84dcd487dd-dbh52 1/1 Running 0 2s
d1-84dcd487dd-zhnq4 1/1 Running 0 2s
d1-84dcd487dd-mqdl5 0/1 Pending 0 0s
d1-84dcd487dd-mqdl5 0/1 Pending 0 0s
d1-84dcd487dd-mqdl5 0/1 ContainerCreating 0 0s
d1-84dcd487dd-mqdl5 0/1 ContainerCreating 0 1s
停止脚本,观察数量
# 发现要过一段时间,才能恢复到原始的状态
[root@master01 hpa]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpanginx Deployment/d1 0%/3% 3 7 7 7m43s
[root@master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
d1-84dcd487dd-9jp2l 1/1 Running 0 12m
d1-84dcd487dd-dbh52 1/1 Running 0 2m18s
d1-84dcd487dd-hkf9w 1/1 Running 0 12m
d1-84dcd487dd-mqdl5 1/1 Running 0 2m3s
d1-84dcd487dd-tvr7b 1/1 Running 0 12m
d1-84dcd487dd-vb2r4 1/1 Running 0 2m18s
d1-84dcd487dd-zhnq4 1/1 Running 0 2m18s

浙公网安备 33010602011771号