joeの小窝

Loading...

k8s hpa详解

k8s hpa详解

1、什么是hpa呢?

  • k8s水平扩缩容的核心控制器,通过监控指标动态调整deploy/statefulset/的pod数量

  • 当请求的的流量非常多的时候,可以动态的创建多个pod,流量小的时候,自动的缩容pod

  • 基于pod里面容器的request字段的

img

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

posted @ 2026-04-08 16:42  乔的港口  阅读(17)  评论(0)    收藏  举报