W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
HorizontalPodAutoscaler (簡稱 HPA ) 自動更新工作負(fù)載資源(例如 Deployment 或者 StatefulSet), 目的是自動擴縮工作負(fù)載以滿足需求。
水平擴縮意味著對增加的負(fù)載的響應(yīng)是部署更多的 Pods。 這與 “垂直(Vertical)” 擴縮不同,對于 Kubernetes, 垂直擴縮意味著將更多資源(例如:內(nèi)存或 CPU)分配給已經(jīng)為工作負(fù)載運行的 Pod。
如果負(fù)載減少,并且 Pod 的數(shù)量高于配置的最小值, HorizontalPodAutoscaler 會指示工作負(fù)載資源( Deployment、StatefulSet 或其他類似資源)縮減。
本文檔將引導(dǎo)你完成啟用 HorizontalPodAutoscaler 以自動管理示例 Web 應(yīng)用程序的擴縮的示例。 此示例工作負(fù)載是運行一些 PHP 代碼的 Apache httpd。
你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構(gòu)建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構(gòu)建:
您的 Kubernetes 服務(wù)器版本必須不低于版本 1.23. 要獲知版本信息,請輸入 kubectl version
。
如果你運行的是舊版本的 Kubernetes,請參閱該版本的文檔版本 (可用的文檔版本)。
按照本演練進(jìn)行操作,你需要一個部署并配置了 Metrics Server 的集群。 Kubernetes Metrics Server 從集群中的 kubelets 收集資源指標(biāo), 并通過 Kubernetes API 公開這些指標(biāo), 使用 APIService 添加代表指標(biāo)讀數(shù)的新資源。
要了解如何部署 Metrics Server,請參閱 metrics-server 文檔。
為了演示 HorizontalPodAutoscaler,你將首先制作一個自定義容器鏡像, 該鏡像使用來自 Docker Hub 的 ?php-apache
? 鏡像作為其起點。 ?Dockerfile
?已經(jīng)為你準(zhǔn)備好了,內(nèi)容如下:
FROM php:5-apache
COPY index.php /var/www/html/index.php
RUN chmod a+rx index.php
代碼定義了一個簡單的 ?index.php
? 頁面,該頁面執(zhí)行一些 CPU 密集型計算, 以模擬集群中的負(fù)載。
<?php
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
$x += sqrt($x);
}
echo "OK!";
?>
制作完該容器鏡像后,使用你制作的鏡像啟動運行一個容器的 Deployment, 并使用以下清單將其公開為服務(wù):
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
為此,運行下面的命令:
kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
deployment.apps/php-apache created
service/php-apache created
現(xiàn)在服務(wù)器正在運行,使用 ?kubectl
?創(chuàng)建自動擴縮器。 ?kubectl autoscale
? 子命令是 ?kubectl
?的一部分, 可以幫助你執(zhí)行此操作。
你將很快運行一個創(chuàng)建 HorizontalPodAutoscaler 的命令, 該 HorizontalPodAutoscaler 維護由你在這些說明的第一步中創(chuàng)建的 php-apache Deployment 控制的 Pod 存在 1 到 10 個副本。
粗略地說,HPA 控制器將增加和減少副本的數(shù)量 (通過更新 Deployment)以保持所有 Pod 的平均 CPU 利用率為 50%。 Deployment 然后更新 ReplicaSet —— 這是所有 Deployment 在 Kubernetes 中工作方式的一部分 —— 然后 ReplicaSet 根據(jù)其 ?.spec
? 的更改添加或刪除 Pod。
由于每個 Pod 通過 ?kubectl run
? 請求 200 milli-cores,這意味著平均 CPU 使用率為 100 milli-cores。
創(chuàng)建 HorizontalPodAutoscaler:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/php-apache autoscaled
你可以通過運行以下命令檢查新制作的 HorizontalPodAutoscaler 的當(dāng)前狀態(tài):
# 你可以使用 “hap” 或 “horizontalpodautoscaler”;任何一個名字都可以。
kubectl get hpa
輸出類似于:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 18s
(如果你看到其他具有不同名稱的 HorizontalPodAutoscalers,這意味著它們已經(jīng)存在,這通常不是問題)。
請注意當(dāng)前的 CPU 利用率是 0%,這是由于我們尚未發(fā)送任何請求到服務(wù)器 (?TARGET
?列顯示了相應(yīng) Deployment 所控制的所有 Pod 的平均 CPU 利用率)。
接下來,看看自動擴縮器如何對增加的負(fù)載做出反應(yīng)。 為此,你將啟動一個不同的 Pod 作為客戶端。 客戶端 Pod 中的容器在無限循環(huán)中運行,向 php-apache 服務(wù)發(fā)送查詢。
# 在單獨的終端中運行它
# 以便負(fù)載生成繼續(xù),你可以繼續(xù)執(zhí)行其余步驟
kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
現(xiàn)在執(zhí)行:
# 準(zhǔn)備好后按 Ctrl+C 結(jié)束觀察
kubectl get hpa php-apache --watch
一分鐘時間左右之后,通過以下命令,我們可以看到 CPU 負(fù)載升高了;例如:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 305% / 50% 1 10 1 3m
然后,更多的副本被創(chuàng)建。例如:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 305% / 50% 1 10 7 3m
這時,由于請求增多,CPU 利用率已經(jīng)升至請求值的 305%。 可以看到,Deployment 的副本數(shù)量已經(jīng)增長到了 7:
kubectl get deployment php-apache
你應(yīng)該會看到與 HorizontalPodAutoscaler 中的數(shù)字與副本數(shù)匹配
NAME READY UP-TO-DATE AVAILABLE AGE
php-apache 7/7 7 7 19m
說明: 有時最終副本的數(shù)量可能需要幾分鐘才能穩(wěn)定下來。由于環(huán)境的差異, 不同環(huán)境中最終的副本數(shù)量可能與本示例中的數(shù)量不同。
要完成該示例,請停止發(fā)送負(fù)載。
在我們創(chuàng)建 ?busybox
?容器的終端中,輸入 ?<Ctrl> + C
? 來終止負(fù)載的產(chǎn)生。
然后驗證結(jié)果狀態(tài)(大約一分鐘后):
# 準(zhǔn)備好后按 Ctrl+C 結(jié)束觀察
kubectl get hpa php-apache --watch
輸出類似于:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache/scale 0% / 50% 1 10 1 11m
Deployment 也顯示它已經(jīng)縮小了:
kubectl get deployment php-apache
NAME READY UP-TO-DATE AVAILABLE AGE
php-apache 1/1 1 1 27m
一旦 CPU 利用率降至 0,HPA 會自動將副本數(shù)縮減為 1。
自動擴縮完成副本數(shù)量的改變可能需要幾分鐘的時間。
利用 ?autoscaling/v2
? API 版本,你可以在自動擴縮 php-apache 這個 Deployment 時使用其他度量指標(biāo)。
首先,將 HorizontalPodAutoscaler 的 YAML 文件改為 ?autoscaling/v2
? 格式:
kubectl get hpa php-apache -o yaml > /tmp/hpa-v2.yaml
在編輯器中打開 ?/tmp/hpa-v2.yaml
?:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
status:
observedGeneration: 1
lastScaleTime: <some-time>
currentReplicas: 1
desiredReplicas: 1
currentMetrics:
- type: Resource
resource:
name: cpu
current:
averageUtilization: 0
averageValue: 0
需要注意的是,?targetCPUUtilizationPercentage
?字段已經(jīng)被名為 ?metrics
?的數(shù)組所取代。 CPU 利用率這個度量指標(biāo)是一個 resource metric(資源度量指標(biāo)),因為它表示容器上指定資源的百分比。 除 CPU 外,你還可以指定其他資源度量指標(biāo)。默認(rèn)情況下,目前唯一支持的其他資源度量指標(biāo)為內(nèi)存。 只要 ?metrics.k8s.io
? API 存在,這些資源度量指標(biāo)就是可用的,并且他們不會在不同的 Kubernetes 集群中改變名稱。
你還可以指定資源度量指標(biāo)使用絕對數(shù)值,而不是百分比,你需要將 ?target.type
? 從 ?Utilization
?替換成 ?AverageValue
?,同時設(shè)置 ?target.averageValue
? 而非 ?target.averageUtilization
? 的值。
還有兩種其他類型的度量指標(biāo),他們被認(rèn)為是 custom metrics(自定義度量指標(biāo)): 即 Pod 度量指標(biāo)和 Object 度量指標(biāo)。 這些度量指標(biāo)可能具有特定于集群的名稱,并且需要更高級的集群監(jiān)控設(shè)置。
第一種可選的度量指標(biāo)類型是 Pod 度量指標(biāo)。這些指標(biāo)從某一方面描述了 Pod, 在不同 Pod 之間進(jìn)行平均,并通過與一個目標(biāo)值比對來確定副本的數(shù)量。 它們的工作方式與資源度量指標(biāo)非常相像,只是它們 僅 支持 ?target
?類型為 ?AverageValue
?。
pod 度量指標(biāo)通過如下代碼塊定義:
type: Pods
pods:
metric:
name: packets-per-second
target:
type: AverageValue
averageValue: 1k
第二種可選的度量指標(biāo)類型是對象 (Object)度量指標(biāo)。這些度量指標(biāo)用于描述 在相同名字空間中的別的對象,而非 Pods。 請注意這些度量指標(biāo)不一定來自某對象,它們僅用于描述這些對象。 對象度量指標(biāo)支持的 ?target
?類型包括 ?Value
?和 ?AverageValue
?。 如果是 ?Value
?類型,?target
?值將直接與 API 返回的度量指標(biāo)比較, 而對于 ?AverageValue
?類型,API 返回的度量值將按照 Pod 數(shù)量拆分, 然后再與 ?target
?值比較。 下面的 YAML 文件展示了一個表示 ?requests-per-second
? 的度量指標(biāo)。
type: Object
object:
metric:
name: requests-per-second
describedObject:
apiVersion: networking.k8s.io/v1
kind: Ingress
name: main-route
target:
type: Value
value: 2k
如果你指定了多個上述類型的度量指標(biāo),HorizontalPodAutoscaler 將會依次考量各個指標(biāo)。 HorizontalPodAutoscaler 將會計算每一個指標(biāo)所提議的副本數(shù)量,然后最終選擇一個最高值。
比如,如果你的監(jiān)控系統(tǒng)能夠提供網(wǎng)絡(luò)流量數(shù)據(jù),你可以通過 ?kubectl edit
? 命令 將上述 Horizontal Pod Autoscaler 的定義更改為:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Pods
pods:
metric:
name: packets-per-second
target:
type: AverageValue
averageValue: 1k
- type: Object
object:
metric:
name: requests-per-second
describedObject:
apiVersion: networking.k8s.io/v1
kind: Ingress
name: main-route
target:
type: Value
value: 10k
status:
observedGeneration: 1
lastScaleTime: <some-time>
currentReplicas: 1
desiredReplicas: 1
currentMetrics:
- type: Resource
resource:
name: cpu
current:
averageUtilization: 0
averageValue: 0
- type: Object
object:
metric:
name: requests-per-second
describedObject:
apiVersion: networking.k8s.io/v1
kind: Ingress
name: main-route
current:
value: 10k
這樣,你的 HorizontalPodAutoscaler 將會嘗試確保每個 Pod 的 CPU 利用率在 50% 以內(nèi), 每秒能夠服務(wù) 1000 個數(shù)據(jù)包請求, 并確保所有在 Ingress 后的 Pod 每秒能夠服務(wù)的請求總數(shù)達(dá)到 10000 個。
許多度量流水線允許你通過名稱或附加的 標(biāo)簽 來描述度量指標(biāo)。 對于所有非資源類型度量指標(biāo)(Pod、Object 和后面將介紹的 External), 可以額外指定一個標(biāo)簽選擇算符。例如,如果你希望收集包含 ?verb
?標(biāo)簽的 ?http_requests
?度量指標(biāo),可以按如下所示設(shè)置度量指標(biāo)塊,使得擴縮操作僅針對 GET 請求執(zhí)行:
type: Object
object:
metric:
name: http_requests
selector: {matchLabels: {verb: GET}}
這個選擇算符使用與 Kubernetes 標(biāo)簽選擇算符相同的語法。 如果名稱和標(biāo)簽選擇算符匹配到多個系列,監(jiān)測管道會決定如何將多個系列合并成單個值。 選擇算符是可以累加的,它不會選擇目標(biāo)以外的對象(類型為 ?Pods
?的目標(biāo) Pods 或者 類型為 ?Object
?的目標(biāo)對象)。
運行在 Kubernetes 上的應(yīng)用程序可能需要基于與 Kubernetes 集群中的任何對象 沒有明顯關(guān)系的度量指標(biāo)進(jìn)行自動擴縮, 例如那些描述與任何 Kubernetes 名字空間中的服務(wù)都無直接關(guān)聯(lián)的度量指標(biāo)。 在 Kubernetes 1.10 及之后版本中,你可以使用外部度量指標(biāo)(external metrics)。
使用外部度量指標(biāo)時,需要了解你所使用的監(jiān)控系統(tǒng),相關(guān)的設(shè)置與使用自定義指標(biāo)時類似。 外部度量指標(biāo)使得你可以使用你的監(jiān)控系統(tǒng)的任何指標(biāo)來自動擴縮你的集群。 你需要在 ?metric
?塊中提供 ?name
?和 ?selector
?,同時將類型由 ?Object
?改為 ?External
?。 如果 ?metricSelector
?匹配到多個度量指標(biāo),HorizontalPodAutoscaler 將會把它們加和。 外部度量指標(biāo)同時支持 ?Value
?和 ?AverageValue
?類型,這與 ?Object
?類型的度量指標(biāo)相同。
例如,如果你的應(yīng)用程序處理來自主機上消息隊列的任務(wù), 為了讓每 30 個任務(wù)有 1 個工作者實例,你可以將下面的內(nèi)容添加到 HorizontalPodAutoscaler 的配置中。
- type: External
external:
metric:
name: queue_messages_ready
selector:
matchLabels:
queue: "worker_tasks"
target:
type: AverageValue
averageValue: 30
如果可能,還是推薦定制度量指標(biāo)而不是外部度量指標(biāo),因為這便于讓系統(tǒng)管理員加固定制度量指標(biāo) API。 而外部度量指標(biāo) API 可以允許訪問所有的度量指標(biāo)。 當(dāng)暴露這些服務(wù)時,系統(tǒng)管理員需要仔細(xì)考慮這個問題。
使用 ?autoscaling/v2
? 格式的 HorizontalPodAutoscaler 時,你將可以看到 Kubernetes 為 HorizongtalPodAutoscaler 設(shè)置的狀態(tài)條件(Status Conditions)。 這些狀態(tài)條件可以顯示當(dāng)前 HorizontalPodAutoscaler 是否能夠執(zhí)行擴縮以及是否受到一定的限制。
?status.conditions
? 字段展示了這些狀態(tài)條件。 可以通過 ?kubectl describe hpa
? 命令查看當(dāng)前影響 HorizontalPodAutoscaler 的各種狀態(tài)條件信息:
kubectl describe hpa cm-test
Name: cm-test
Namespace: prom
Labels: <none>
Annotations: <none>
CreationTimestamp: Fri, 16 Jun 2017 18:09:22 +0000
Reference: ReplicationController/cm-test
Metrics: ( current / target )
"http_requests" on pods: 66m / 500m
Min replicas: 1
Max replicas: 4
ReplicationController pods: 1 current / 1 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale the last scale time was sufficiently old as to warrant a new scale
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from pods metric http_requests
ScalingLimited False DesiredWithinRange the desired replica count is within the acceptable range
Events:
對于上面展示的這個 HorizontalPodAutoscaler,我們可以看出有若干狀態(tài)條件處于健康狀態(tài)。 首先,?AbleToScale
?表明 HPA 是否可以獲取和更新擴縮信息,以及是否存在阻止擴縮的各種回退條件。 其次,?ScalingActive
?表明 HPA 是否被啟用(即目標(biāo)的副本數(shù)量不為零) 以及是否能夠完成擴縮計算。 當(dāng)這一狀態(tài)為 ?False
?時,通常表明獲取度量指標(biāo)存在問題。 最后一個條件 ?ScalingLimitted
?表明所需擴縮的值被 HorizontalPodAutoscaler 所定義的最大或者最小值所限制(即已經(jīng)達(dá)到最大或者最小擴縮值)。 這通常表明你可能需要調(diào)整 HorizontalPodAutoscaler 所定義的最大或者最小副本數(shù)量的限制了。
HorizontalPodAutoscaler 和 度量指標(biāo) API 中的所有的度量指標(biāo)使用 Kubernetes 中稱為 量綱(Quantity) 的特殊整數(shù)表示。 例如,數(shù)量 10500m 用十進(jìn)制表示為 10.5。 如果可能的話,度量指標(biāo) API 將返回沒有后綴的整數(shù),否則返回以千分單位的數(shù)量。 這意味著你可能會看到你的度量指標(biāo)在 1 和 1500m (也就是在十進(jìn)制記數(shù)法中的 1 和 1.5)之間波動。
除了使用 ?kubectl autoscale
? 命令,也可以使用以下清單以聲明方式創(chuàng)建 HorizontalPodAutoscaler:
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
targetCPUUtilizationPercentage: 50
使用如下命令創(chuàng)建 autoscaler:
kubectl create -f https://k8s.io/examples/application/hpa/php-apache.yaml
horizontalpodautoscaler.autoscaling/php-apache created
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: