水平Pod伸缩hpa实战

- hpa:(水平扩容)
	表示Pod数量资源不足时,可以自动增加Pod副本数量,以抵抗流量过多的情况,降低负载。
	
- vpa: (垂直扩容)
	表示可以动态调整容器的资源上限,比如一个Pod一开始是200Mi内存,如果资源达到定义的阈值,就可以扩展内存,但不会增加pod副本数量。
	
	
典型的区别在于vpa具有一定的资源上限问题,因为pod是K8S集群调度的最小单元,不可拆分,因此这个将来扩容时,取决于单节点的资源上限。


2.部署metrics-server组件
	2.1 下载资源清单 
	wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml

vim high-availability-1.21+.yaml
...
114 apiVersion: apps/v1
115 kind: Deployment
116 metadata:
...
144       - args:
145         - --kubelet-insecure-tls  # 不要验证Kubelets提供的服务证书的CA。不配置则会报错x509。
            ...
...         image: registry.aliyuncs.com/google_containers/metrics-server:v0.7.2

		2.3 部署metrics-server组件
[root@master231 ~]# kubectl apply -f high-availability-1.21+.yaml 
serviceaccount/metrics-server created
clusterrole.rbac.authorization.k8s.io/system:aggregated-metrics-reader created
clusterrole.rbac.authorization.k8s.io/system:metrics-server created
rolebinding.rbac.authorization.k8s.io/metrics-server-auth-reader created
clusterrolebinding.rbac.authorization.k8s.io/metrics-server:system:auth-delegator created
clusterrolebinding.rbac.authorization.k8s.io/system:metrics-server created
service/metrics-server created
deployment.apps/metrics-server created
poddisruptionbudget.policy/metrics-server created
apiservice.apiregistration.k8s.io/v1beta1.metrics.k8s.io created
[root@master231 ~]# 

		2.4 查看镜像是否部署成功
[root@master231 02-metrics-server]# kubectl get pods,svc -n kube-system  -l k8s-app=metrics-server -o wide
NAME                                  READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pod/metrics-server-57c6f647bb-6n74n   1/1     Running   0          71s   10.100.1.102   worker232   <none>           <none>
pod/metrics-server-57c6f647bb-f5t5j   1/1     Running   0          71s   10.100.2.73    worker233   <none>           <none>

NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE   SELECTOR
service/metrics-server   ClusterIP   10.200.24.39   <none>        443/TCP   71s   k8s-app=metrics-server
[root@master231 02-metrics-server]# 
[root@master231 02-metrics-server]# kubectl -n kube-system describe svc metrics-server
Name:              metrics-server
Namespace:         kube-system
Labels:            k8s-app=metrics-server
Annotations:       <none>
Selector:          k8s-app=metrics-server
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.200.24.39
IPs:               10.200.24.39
Port:              https  443/TCP
TargetPort:        https/TCP
Endpoints:         10.100.1.102:10250,10.100.2.73:10250
Session Affinity:  None
Events:            <none>
[root@master231 02-metrics-server]# 



		2.5 验证metrics组件是否正常工作 
[root@master231 02-metrics-server]# kubectl top node 
NAME        CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
master231   73m          3%     1331Mi          17%       
worker232   31m          1%     831Mi           10%       
worker233   30m          1%     912Mi           11%       
[root@master231 02-metrics-server]#          
[root@master231 02-metrics-server]# kubectl top pods -A
NAMESPACE        NAME                                CPU(cores)   MEMORY(bytes)   
default          xiuxian-77b9d95d56-4dxpr            1m           0Mi             
kube-flannel     kube-flannel-ds-5hbns               5m           12Mi            
kube-flannel     kube-flannel-ds-dzffl               4m           12Mi            
kube-flannel     kube-flannel-ds-h5kwh               5m           12Mi            
kube-system      coredns-6d8c4cb4d-k52qr             1m           11Mi            
kube-system      coredns-6d8c4cb4d-rvzd9             1m           11Mi            
kube-system      etcd-master231                      9m           108Mi           
kube-system      kube-apiserver-master231            29m          216Mi           
kube-system      kube-controller-manager-master231   13m          53Mi            
kube-system      kube-proxy-g5sfd                    5m           17Mi            
kube-system      kube-proxy-m6mxj                    5m           17Mi            
kube-system      kube-proxy-q5bqh                    5m           17Mi            
kube-system      kube-scheduler-master231            2m           16Mi            
kube-system      metrics-server-57c6f647bb-6n74n     2m           14Mi            
kube-system      metrics-server-57c6f647bb-f5t5j     2m           14Mi            
metallb-system   controller-644c958987-57rzz         1m           14Mi            
metallb-system   speaker-4t849                       3m           15Mi            
metallb-system   speaker-gnh9v                       3m           16Mi            
metallb-system   speaker-kp99v                       3m           15Mi            
[root@master231 02-metrics-server]# 
[root@master231 02-metrics-server]# kubectl top pods
NAME                       CPU(cores)   MEMORY(bytes)   
xiuxian-77b9d95d56-4dxpr   1m           0Mi             
[root@master231 02-metrics-server]#  



- 水平Pod伸缩hpa实战
	1.什么是hpa
hpa是k8s集群内置的资源,全称为"HorizontalPodAutoscaler"。

可以自动实现Pod水平伸缩,说白了,在业务高峰期可以自动扩容Pod副本数量,在集群的低谷期,可以自动缩容Pod副本数量。


	2.hpa
		2.1 导入镜像 
[root@worker233 ~]# wget http://192.168.21.253/Resources/Kubernetes/Add-ons/metrics-server/oldboyedu-linux-tools-v0.1-stress.tar.gz

[root@worker233 ~]# docker load  -i oldboyedu-linux-tools-v0.1-stress.tar.gz 
[root@worker233 ~]# docker tag jasonyin2020/oldboyedu-linux-tools:v0.1 harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1
[root@worker233 ~]# docker push harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1


		2.2 编写资源清单
[root@master231 17-HorizontalPodAutoscaler]# cat > 01-deploy-hpa.yaml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-stress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: stress
  template:
    metadata:
      labels:
        app: stress
    spec:
      containers:
      # - image: jasonyin2020/oldboyedu-linux-tools:v0.1
      - image: harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1
        name: oldboyedu-linux-tools
        args:
        - tail
        - -f
        - /etc/hosts
		# 配置容器的资源限制
        resources: 
		  # 容器的期望资源
          requests:
		    # CPU限制,1 =1000m
            cpu: 0.2
			# 内存限制
            memory: 300Mi
		  # 容器的资源上限
          limits:
            cpu: 0.5
            memory: 500Mi

---

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: stress-hpa
spec:
  maxReplicas: 5
  minReplicas: 2
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: deploy-stress
  targetCPUUtilizationPercentage: 95
EOF



		2.3 创建资源
[root@master231 17-HorizontalPodAutoscaler]# kubectl apply -f 01-deploy-hpa.yaml 
deployment.apps/deploy-stress created
horizontalpodautoscaler.autoscaling/stress-hpa created
[root@master231 17-HorizontalPodAutoscaler]# 



 
		2.4 测试验证
[root@master231 17-HorizontalPodAutoscaler]# kubectl get deploy,hpa,po -o wide  # 第一次查看发现Pod副本数量只有1个
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS              IMAGES                                               SELECTOR
deployment.apps/deploy-stress   2/2     2            2           44s   oldboyedu-linux-tools   harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1   app=stress

NAME                                             REFERENCE                  TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/stress-hpa   Deployment/deploy-stress   <unknown>/95%   2         5         2          44s

NAME                                 READY   STATUS        RESTARTS      AGE     IP             NODE        NOMINATED NODE   READINESS GATES
pod/deploy-stress-74688d4f56-g4zcc   1/1     Running       0             44s     10.100.1.103   worker232   <none>           <none>
pod/deploy-stress-74688d4f56-kz92b   1/1     Running       0             29s     10.100.2.74    worker233   <none>           <none>
[root@master231 17-HorizontalPodAutoscaler]# 
[root@master231 17-HorizontalPodAutoscaler]# 


		2.5 压力测试
[root@master231 ~]# kubectl exec deploy-stress-74688d4f56-g4zcc -- stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10m
stress: info: [7] dispatching hogs: 8 cpu, 4 io, 2 vm, 0 hdd




		2.6 查看Pod副本数量
[root@master231 17-HorizontalPodAutoscaler]# kubectl get deploy,hpa,po -o wide
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS              IMAGES                                               SELECTOR
deployment.apps/deploy-stress   3/3     3            3           2m47s   oldboyedu-linux-tools   harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1   app=stress

NAME                                             REFERENCE                  TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/stress-hpa   Deployment/deploy-stress   125%/95%   2         5         3          2m47s

NAME                                 READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
pod/deploy-stress-74688d4f56-5rpqm   1/1     Running   0          17s     10.100.1.104   worker232   <none>           <none>
pod/deploy-stress-74688d4f56-g4zcc   1/1     Running   0          2m47s   10.100.1.103   worker232   <none>           <none>
pod/deploy-stress-74688d4f56-kz92b   1/1     Running   0          2m32s   10.100.2.74    worker233   <none>           <none>
[root@master231 17-HorizontalPodAutoscaler]# 
[root@master231 17-HorizontalPodAutoscaler]# 



		2.7 再次压测
[root@master231 ~]# kubectl exec deploy-stress-74688d4f56-5rpqm  -- stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10m
stress: info: [6] dispatching hogs: 8 cpu, 4 io, 2 vm, 0 hdd

[root@master231 ~]# kubectl exec deploy-stress-74688d4f56-kz92b -- stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10m
stress: info: [7] dispatching hogs: 8 cpu, 4 io, 2 vm, 0 hdd



		2.6 发现最多有5个Pod创建 
[root@master231 17-HorizontalPodAutoscaler]# kubectl get deploy,hpa,po -o wide
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS              IMAGES                                               SELECTOR
deployment.apps/deploy-stress   5/5     5            5           4m28s   oldboyedu-linux-tools   harbor250.oldboyedu.com/oldboyedu-test/stress:v0.1   app=stress

NAME                                             REFERENCE                  TARGETS    MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/stress-hpa   Deployment/deploy-stress   245%/95%   2         5         5          4m28s

NAME                                 READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
pod/deploy-stress-74688d4f56-4q775   1/1     Running   0          28s     10.100.2.75    worker233   <none>           <none>
pod/deploy-stress-74688d4f56-5rpqm   1/1     Running   0          118s    10.100.1.104   worker232   <none>           <none>
pod/deploy-stress-74688d4f56-9ndkh   1/1     Running   0          28s     10.100.1.105   worker232   <none>           <none>
pod/deploy-stress-74688d4f56-g4zcc   1/1     Running   0          4m28s   10.100.1.103   worker232   <none>           <none>
pod/deploy-stress-74688d4f56-kz92b   1/1     Running   0          4m13s   10.100.2.74    worker233   <none>           <none>
[root@master231 17-HorizontalPodAutoscaler]# 
posted @ 2025-07-21 21:51  寻梦行  阅读(122)  评论(0)    收藏  举报