日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

k8s-HPA

發布時間:2024/3/12 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 k8s-HPA 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、認識HPA

參考: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale/

  • HPA全稱是Horizontal Pod Autoscaler,中文意思是POD水平自動伸縮.

  • 可以基于 CPU 利用率自動擴縮 ReplicationController、Deployment、ReplicaSet 和 StatefulSet 中的 Pod 數量。

  • 除了 CPU 利用率,內存占用外,也可以基于其他應程序提供的自定義度量指標來執行自動擴縮。

自定義度量參考: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/custom-metrics-api.md

  • Pod 自動擴縮不適用于無法擴縮的對象,比如 DaemonSet。

  • Pod 水平自動擴縮特性由 Kubernetes API 資源和控制器實現。資源決定了控制器的行為。

  • 控制器會周期性的調整副本控制器或 Deployment 中的副本數量,以使得 Pod 的平均 CPU 利用率與用戶所設定的目標值匹配。

二、HPA工作機制

Pod 水平自動擴縮器的實現是一個控制回路,由控制器管理器的 --horizontal-pod-autoscaler-sync-period 參數指定周期(默認值為 15 秒)。

每個周期內,控制器管理器根據每個 HorizontalPodAutoscaler 定義中指定的指標查詢資源利用率。 控制器管理器可以從資源度量指標 API(按 Pod 統計的資源用量)和自定義度量指標 API(其他指標)獲取度量值。

  • 對于按 Pod 統計的資源指標(如 CPU), 控制器從資源指標 API 中獲取每一個 HorizontalPodAutoscaler 指定的 Pod 的度量值,如果設置了目標使用率, 控制器獲取每個 Pod 中的容器資源使用情況,并計算資源使用率。 如果設置了 target 值,將直接使用原始數據(不再計算百分比)。 接下來,控制器根據平均的資源使用率或原始值計算出擴縮的比例,進而計算出目標副本數。

    需要注意的是,如果 Pod 某些容器不支持資源采集,那么控制器將不會使用該 Pod 的 CPU 使用率。

  • 如果 Pod 使用自定義指示,控制器機制與資源指標類似,區別在于自定義指標只使用 原始值,而不是使用率。

  • 如果 Pod 使用對象指標和外部指標(每個指標描述一個對象信息)。 這個指標將直接根據目標設定值相比較,并生成一個上面提到的擴縮比例。 在 autoscaling/v2beta2 版本 API 中,這個指標也可以根據 Pod 數量平分后再計算。

通常情況下,控制器將從一系列的聚合 API(metrics.k8s.io、custom.metrics.k8s.io 和 external.metrics.k8s.io)中獲取度量值。 metrics.k8s.io API 通常由 Metrics 服務器(需要額外啟動)提供。

確認安裝metrics-server

[root@master1 ~]# kubectl get pods -n kube-system |grep metrics-server metrics-server-869ffc99cd-lz68h 1/1 Running 5 23h [root@master1 ~]# kubectl top nodes NAME CPU(cores) CPU% MEMORY(bytes) MEMORY% 192.168.122.11 357m 4% 895Mi 17% 192.168.122.12 426m 5% 910Mi 28% 192.168.122.13 353m 4% 664Mi 20% 192.168.122.14 251m 3% 408Mi 12%

三、HPA API對象

HPA的API有三個版本

[root@master1 ~]# kubectl api-versions | grep autoscal autoscaling/v1 autoscaling/v2beta1 autoscaling/v2beta2 APA版本描述
autoscaling/v1只支持基于CPU指標的縮放
autoscaling/v2beta1支持Resource Metrics(資源指標,如pod的CPU)和Custom Metrics(自定義指標)的縮放;
autoscaling/v2beta2支持Resource Metrics(資源指標,如pod的CPU)和Custom Metrics(自定義指標)和ExternalMetrics(額外指標)的縮放。

四、kubectl對HPA的支持

與其他 API 資源類似,kubectl 以標準方式支持 HPA。

  • 通過 kubectl create 命令創建一個 HPA 對象

  • 通過 kubectl get hpa 命令來獲取所有 HPA 對象

  • 通過 kubectl describe hpa 命令來查看 HPA 對象的詳細信息

  • 通過 kubectl delete hpa 命令刪除對象。

此外,還有個簡便的命令 kubectl autoscale 來創建 HPA 對象。

例如,命令 kubectl autoscale rs foo --min=2 --max=5 --cpu-percent=80 將會為名 為 foo 的 ReplicationSet 創建一個 HPA 對象, 目標 CPU 使用率為 80%,副本數量配置為 2 到 5 之間。

五、HPA演示案例

參考: https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

基于CPU的HPA

1, 構建測試鏡像

[root@master1 ~]# vim index.php <?php$x = 0.0001;for ($i = 0; $i <= 1000000; $i++) {$x += sqrt($x);}echo "OK!"; ?> [root@master1 ~]# vim Dockerfile FROM php:5-apache COPY index.php /var/www/html/index.php RUN chmod a+rx index.php [root@master1 ~]# docker build -f Dockerfile -t 192.168.122.18/library/hpa-example:v1 .

2, 上傳到harbor

[root@master1 ~]# docker login 192.168.122.18 Username: admin Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded [root@master1 ~]# docker push 192.168.122.18/library/hpa-example:v1

3, 部署測試deployment

[root@master1 ~]# vim php-apache.yaml apiVersion: apps/v1 kind: Deployment metadata:name: php-apache spec:selector:matchLabels:app: php-apachereplicas: 1template:metadata:labels:app: php-apachespec:containers:- name: php-apacheimage: 192.168.122.18/library/hpa-example:v1ports:- containerPort: 80resources:limits:cpu: 500mrequests:cpu: 200m [root@master1 ~]# kubectl apply -f php-apache.yaml deployment.apps/php-apache created

4, 驗證得到pod-IP

[root@master1 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READIN ESS GATES php-apache-665fc66c67-cfj6f 1/1 Running 0 25m 10.3.104.15 192.168.122.14 <none> <none>

得到pod-IP為10.3.104.15,此IP下面測試需要用到

5, 創建HPA

[root@master1 ~]# kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10 horizontalpodautoscaler.autoscaling/php-apache autoscaled

說明:

  • –cpu-percent=50表示所有Pod的平均CPU使用率維持在50%,超過就要擴容
  • –min=1 --max=10表示pod數量的范圍
[root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 0%/50% 1 10 1 20s 看到目前CPU還是0%

6, 創建測試pod對其訪問

用另一個終端(我這里是master2)使用busybox鏡像產生一個測試pod,對10.3.104.15進行壓測

[root@master2 ~]# kubectl run busybox -it --image=busybox /bin/sh/ # while true; do wget -q -O- http://10.3.104.15; done OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!......

不斷查詢hpa狀態,大概一分鐘后才會看到效果

[root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 250%/50% 1 10 1 19m cpu用到250%[root@master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 3m27s php-apache-665fc66c67-8z6wj 1/1 Running 0 59s php-apache-665fc66c67-cfj6f 1/1 Running 0 26m php-apache-665fc66c67-fn4wg 1/1 Running 0 59s php-apache-665fc66c67-t9wpr 1/1 Running 0 44s php-apache-665fc66c67-zw662 1/1 Running 0 60s 也可以看到pod擴容到了5個 [root@master2 ~]# kubectl run busybox -it --image=busybox /bin/sh/ # while true; do wget -q -O- http://10.3.104.15; done OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!^ ctrl+c取消壓力測試

要等幾分鐘甚至更久后,就看到cpu與pod數量都回去了

[root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE php-apache Deployment/php-apache 0%/50% 1 10 5 22m[root@master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE busybox 1/1 Running 0 28m php-apache-665fc66c67-t9wpr 1/1 Running 0 25m

7, 測試完后刪除

[root@master1 ~]# kubectl delete deployments.apps php-apache deployment.apps "php-apache" deleted[root@master1 ~]# kubectl delete pod busybox pod "busybox" deleted[root@master1 ~]# kubectl delete hpa php-apache horizontalpodautoscaler.autoscaling "php-apache" deleted

基于內存的HPA

1, 創建測試deployment

[root@master1 ~]# vim nginx-hpa.yaml apiVersion: apps/v1 kind: Deployment metadata:name: nginx-hpa spec:selector:matchLabels:app: nginx-hpareplicas: 1template:metadata:labels:app: nginx-hpaspec:containers:- name: nginximage: nginx:1.15-alpineports:- containerPort: 80name: httpprotocol: TCPresources:requests:cpu: 0.01memory: 25Milimits:cpu: 0.05memory: 60Mi [root@master1 ~]# kubectl apply -f nginx-hpa.yaml deployment.apps/nginx-hpa created

2, 創建HPA

[root@master1 ~]# vim mem-hpa.yaml apiVersion: autoscaling/v2beta1 # v2beta1版本 kind: HorizontalPodAutoscaler metadata:name: nginx-hpa spec:maxReplicas: 10minReplicas: 1 # 1-10個pod范圍內擴容與裁剪scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: nginx-hpametrics:- type: Resource resource:name: memorytargetAverageUtilization: 50 # 50%內存利用 [root@master1 ~]# kubectl apply -f mem-hpa.yaml horizontalpodautoscaler.autoscaling/nginx-hpa created [root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-hpa Deployment/nginx-hpa 12%/50% 1 10 1 60s

3, 對pod進行測試

換一個終端(master2),進入pod后進行dd命令測試

[root@master2 ~]# kubectl exec -it nginx-hpa-74ccf95f7d-454z5 -- /bin/sh / # dd if=/dev/zero of=/tmp/file1

4, 驗證

不斷查詢hpa狀態,大概一分鐘后才會看到效果

[root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-hpa Deployment/nginx-hpa 204%/50% 1 10 5 3m10s[root@master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-hpa-74ccf95f7d-454z5 1/1 Running 0 6m20s nginx-hpa-74ccf95f7d-8gznw 1/1 Running 0 30s nginx-hpa-74ccf95f7d-bv4hm 1/1 Running 0 30s nginx-hpa-74ccf95f7d-g9276 1/1 Running 0 15s nginx-hpa-74ccf95f7d-xmzqs 1/1 Running 0 30s

5, 裁剪測試

ctrl+c取消后,刪除dd的文件

[root@master2 ~]# kubectl exec -it nginx-hpa-74ccf95f7d-454z5 -- /bin/sh/ # rm /tmp/file1 -rf

等幾分鐘甚至更久后,就看到cpu與pod數量都回去了

[root@master1 ~]# kubectl get hpa NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-hpa Deployment/nginx-hpa 12%/50% 1 10 1 28m[root@master1 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-hpa-74ccf95f7d-xmzqs 1/1 Running 0 25m

6, 測試完后刪除

[root@master1 ~]# kubectl delete deploy nginx-hpa deployment.apps "nginx-hpa" deleted[root@master1 ~]# kubectl delete hpa nginx-hpa horizontalpodautoscaler.autoscaling "nginx-hpa" deleted

寫在最后,更多功能可以自己去探索。雖然目前HPA功能還在beta版,但以后肯定會越來越成熟。

總結

以上是生活随笔為你收集整理的k8s-HPA的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。