前言
前面 Kubernetes入門 系列,我們學習了k8s的基礎知識和簡單用法,今天開始我們繼續進一步學習,了解一些複雜和進階用法。本文我們學習pod水準自動擴縮容即hpa。
hpa全稱是Horizontal Pod Autoscaler,可以基于CPU的使用率或其它名額自動伸縮replication controller、deployment和 replica set 中的 pod 數量。
我們可以根據标準應用系統的CPU等名額的周期性變化情況,通過HPA進行動态擴縮容以此來提高叢集的資源使用率。
準備
hpa通過
metrics-server,監控叢集運作名額觸發擴縮容的,使用前需要先確定metrics-server是可用狀态。
minikube addons list

觀察metrics-server是否是可用狀态,如果是disabled。則需要執行以下指令開啟。
minikube addons enable metrics-server
此時執行kubectl top指令即可檢視pod、node的cpu、memory的使用消耗情況。
如果想禁用metrics-server,disable即可
minikube addons disable metrics-server
啟動應用并暴露服務
我們參考官方demo,使用PHP提供http服務,進行CPU密集型計算。觀察CPU和pod自動擴縮容情況。
準備鏡像
這裡建立一個CPU密集型PHP腳本,并打成鏡像。
也可以直接用我打好的鏡像 registry.cn-hangzhou.aliyuncs.com/larswang/php-hpa:1.0,跳過這一步,直接看Deployment。
檔案及源碼位址見:
AloofJr# Dockerfile
FROM php:7.4.6-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php
// index.php
<?php
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
$x += sqrt($x);
}
echo "OK!";
?>
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-hpa-deployment
labels:
app: php-hpa
spec:
replicas: 1
selector:
matchLabels:
app: php-hpa
template:
metadata:
labels:
app: php-hpa
spec:
containers:
- name: php-hpa
image: registry.cn-hangzhou.aliyuncs.com/larswang/php-hpa:1.0
ports:
- containerPort: 80
resources:
requests:
cpu: 200m
Service 暴露服務
apiVersion: v1
kind: Service
metadata:
name: php-hpa-service
spec:
type: ClusterIP
selector:
app: php-hpa
ports:
- port: 80
HPA
建立HPA
建立hpa設定pod擴縮最多和最少的數量以及執行擴縮容的條件。
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-hpa-deployment
minReplicas: 1 #pod最小數量
maxReplicas: 10 #pod最大數量
targetCPUUtilizationPercentage: 10 #cpu使用率超過10%進行擴容,小于10%縮容
觀察HPA運作情況
kubectl get hpa
可以看到以下名額
TARGETS:目前CPU使用率是0%,10%是我們設定的擴縮容阙值。
MINPODS:pod最小數量
MAXPODS:pod最大數量
REPLICAS:目前副本數,因為我們的cpu使用率是0%,目前副本數是1。
增加負載
我們使用busybox,不斷的對php-hpa-service發起http調用,增加服務端壓力。
# 使用busybox并進入容器
kubectl run -i --rm --tty load-generator --image=busybox /bin/sh
# 不斷發起http請求
while true; do wget -q -O- http://php-hpa-service; done
檢視hpa情況
cpu使用率143%了,此時REPLICAS還是1,再等一會兒
可以看到REPLICAS已經擴到了10個pod,cpu負載平均到了35%,雖然比我們配置的10%高,但是擴到了最多MAXPODS 10個,是以不會繼續擴容了
降低負載
停掉load-generator發壓,等幾分鐘(可以通過--horizontal-pod-autoscaler-downscale-stabilization設定縮容冷卻時間,預設五分鐘)。
可以看到REPLICAS縮到了1個pod。
總結
上面介紹了根據CPU使用率進行HPA的操作,其實在實際工作中,HPA是一個非常複雜的課題,因為影響應用運作狀态的不單單是CPU,會和記憶體、ERROR數、線程數等多項名額相關。
在擴容時,還要考慮資源額度、資料庫連接配接數等。
在縮容時則需要更小心了,要時刻關注應用的運作狀态,是很容易引發容量故障的。
更複雜的還有,應用系統是否非标、是CPU密集型還是記憶體密集型應用、系統的流量變化周期、如何應對突發流量等等。
歡迎感興趣或有實戰經驗的大神們來交流探讨。
檔案用到的yaml配置可以在
找到。
更多文章
見我的部落格:
https://nc2era.comwritten by
,轉載請注明出處