Kubernetes 自動擴充套件功能對於現代應用程式至關重要,能有效應對波動的流量負載。VPA 能夠依據 Pod 的資源使用情況,自動調整 CPU 和記憶體的資源請求,避免資源不足或浪費。HPA 則根據 CPU 使用率或其他自定義指標,動態調整 Pod 副本數量,確保應用程式在高負載下仍能保持穩定執行。這兩種機制相互配合,構成了 Kubernetes 強大的自動擴充套件體系,讓開發者能更專注於應用程式邏輯,而無需過多擔心底層資源管理。實務上,VPA 常用於最佳化單個 Pod 的資源利用率,而 HPA 則更側重於應對整體服務的流量壓力。
自動擴充套件 Kubernetes Pod 與節點
在 Kubernetes 中,自動擴充套件(Autoscaling)是一項重要的功能,能夠根據資源使用情況動態調整 Pod 和節點的數量。本篇文章將介紹如何使用 Vertical Pod Autoscaler(VPA)來自動擴充套件 Kubernetes 中的 Pod。
準備 Deployment
首先,我們需要準備一個 Deployment 物件。以下是一步一步的:
- 啟用 Metric Server:確保你的 Kubernetes 叢集已經啟用了 Metric Server。你可以使用預設的 Metric Server 並將其佈署在你的 Kubernetes 叢集中。如果使用的是 Minikube,可以使用以下命令啟用 Metric Server:
$ minikube addons enable metrics-server
2. **建立新的 Namespace**:建立一個新的 Namespace 用於測試 VPA。
```yml
# vpa/vpa-demo-ns.yaml
---
apiVersion: v1
kind: Namespace
metadata:
labels:
project: vpa-demo
name: vpa-demo
使用 kubectl apply 命令建立 Namespace:
$ kubectl apply -f vpa/vpa-demo-ns.yaml
namespace/vpa-demo created
- 建立 Deployment:建立一個名為
hamster的 Deployment。
vpa/hamster-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: hamster namespace: vpa-demo spec: selector: matchLabels: app: hamster replicas: 5 template: metadata: labels: app: hamster spec: containers: - name: hamster image: ubuntu:20.04 resources: requests: cpu: 100m memory: 50Mi command: - /bin/sh - -c - while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done
這個 Deployment 中的 Pod 會不斷消耗 CPU 資源,但其請求的 CPU 資源遠低於實際使用量。
4. **套用 Deployment**:
```bash
$ kubectl apply -f vpa/hamster-deployment.yaml
deployment.apps/hamster created
- 檢查 Pod 狀態:
$ kubectl get po -n vpa-demo NAME READY STATUS RESTARTS AGE hamster-7fb7dbff7-hmzt5 1/1 Running 0 8s hamster-7fb7dbff7-lbk9f 1/1 Running 0 8s hamster-7fb7dbff7-ql6gd 1/1 Running 0 8s hamster-7fb7dbff7-qmxd8 1/1 Running 0 8s hamster-7fb7dbff7-qtrpp 1/1 Running 0 8s
6. **檢查 Pod 的 CPU 使用率**:
```bash
$ kubectl top pod -n vpa-demo
NAME CPU(cores) MEMORY(bytes)
hamster-7fb7dbff7-hmzt5 457m 0Mi
hamster-7fb7dbff7-lbk9f 489m 0Mi
hamster-7fb7dbff7-ql6gd 459m 0Mi
hamster-7fb7dbff7-qmxd8 453m 0Mi
hamster-7fb7dbff7-qtrpp 451m 0Mi
此表格顯示了每個 Pod 的 CPU 使用率,證實了它們的 CPU 使用率約為500m KCU。
建立 VPA
接下來,我們將建立一個 VPA 物件來自動調整 Pod 的資源請求。
- 建立 VPA YAML 檔案:
vpa/hamster-vpa.yaml
apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: hamster-vpa namespace: vpa-demo spec: targetRef: apiVersion: apps/v1 kind: Deployment name: hamster updatePolicy: updateMode: ‘Off’ resourcePolicy: containerPolicies: - containerName: ‘*’ minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: - cpu - memory
在這個 VPA 設定中,我們指定了 `updateMode` 為 `Off`,表示 VPA 只會提供建議而不自動更新 Pod 的資源請求。
2. **套用 VPA 設定**:
```bash
$ kubectl apply -f vpa/hamster-vpa.yaml
verticalpodautoscaler.autoscaling.k8s.io/hamster-vpa created
- 檢查 VPA 的建議:
$ kubectl describe vpa hamster-vpa -n vpa-demo
…
#### VPA 的建議結果顯示,目標 CPU 資源應為587m KCU,記憶體為262144k。
4. **啟用 VPA 的自動更新模式**:將 `updateMode` 改為 `Auto`,然後重新套用設定。
```yml
# vpa/hamster-vpa.yaml (更新後)
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: hamster-vpa
namespace: vpa-demo
spec:
...
updatePolicy:
updateMode: Auto # 更新此處設定為 Auto
...
- 套用更新後的 VPA 設定:
$ kubectl apply -f vpa/hamster-vpa.yaml verticalpodautoscaler.autoscaling.k8s.io/hamster-vpa configured
6. **觀察 Pod 的變化**:
```bash
$ kubectl get po -n vpa-demo -w
NAME READY STATUS RESTARTS AGE
hamster-7fb7dbff7-24p89 $0/1$ ContainerCreating $0 $2s
hamster-7fb7dbff7-6nz8f $0/1$ ContainerCreating $0 $2s
hamster-7fb7dbff7-hmzt5 $1/1$ Running $0 $20m
hamster-7fb7dbff7-lbk9f $1/1$ Running $0 $20m
hamster-7fb7dbff7-ql6gd $1/1$ Terminating $0 $20m
hamster-7fb7dbff7-qmxd8 $1/1$ Terminating $0 $20m
hamster-7fb7dbff7-qtrpp $1/1$ Running $0 $20m
hamster-7fb7dbff7-24p89 $1/1$ Running $0 $2s
hamster-7fb7dbff-VPA 成功地根據實際使用情況重新組態了 Pod 的資源請求。
VPA 自動更新模式啟用後,Pod 將根據 VPA 的建議重新組態資源請求並重啟。
Kubernetes 自動擴充套件:深入理解 VPA 與 HPA
在 Kubernetes 環境中,自動擴充套件是一項至關重要的功能,能夠根據實際需求動態調整資源分配。Vertical Pod Autoscaler(VPA)與 Horizontal Pod Autoscaler(HPA)是兩種主要的自動擴充套件機制,分別負責垂直擴充套件與水平擴充套件。
垂直擴充套件:VPA 的角色
VPA 主要負責最佳化 Pod 資源的使用效率,根據實際需求調整 Pod 的資源請求(requests)。透過分析 Pod 的資源使用情況,VPA 能夠動態調整 CPU 與記憶體請求,以確保 Pod 獲得適當的資源。
檢視 VPA 更新後的 Pod 資源請求
$ kubectl describe pod hamster-7fb7dbff7-24p89 -n vpa-demo
...
Annotations: ...<removed for brevity>...
vpaObservedContainers: hamster
vpaUpdates: Pod resources updated by hamster-vpa:
container 0: memory request, cpu request
...
Containers:
hamster:
...
Requests:
cpu: 587m
memory: 262144k
...<removed for brevity>...
如上述範例所示,VPA 成功更新了 Pod 的 CPU 與記憶體請求,使其符合實際需求。
水平擴充套件:HPA 的應用
HPA 則負責根據 CPU 使用率或其他自定義指標自動調整 Deployment 或 StatefulSet 的副本數量。當 CPU 使用率超過預設閾值時,HPA 會增加副本數量以降低負載;反之,當 CPU 使用率下降時,HPA 會減少副本數量以節省資源。
HPA 的工作原理
HPA 透過監控 Pod 的 CPU 使用率或其他指標,計算平均值並與目標值進行比較。若實際值與目標值有差距,HPA 會調整副本數量以使其接近目標值。例如,若目標 CPU 使用率為 50%,而實際使用率達到 80%,HPA 會增加副本數量以降低平均 CPU 使用率。
垂直擴充套件與水平擴充套件的比較
下圖展示了垂直擴充套件與水平擴充套件的差異: 此圖示說明瞭兩種擴充套件方式的不同:垂直擴充套件著重於提升單一 Pod 的效能,而水平擴充套件則透過增加副本數量來提升整體服務的效能。
實作 HPA 示範
步驟1:啟用 Metric Server
首先,需要在 Kubernetes 叢集中啟用 Metric Server。對於 minikube,使用以下指令:
$ minikube addons enable metrics-server
#### 內容解密:
此指令用於啟用 minikube 的 metrics-server 附加元件,使叢集能夠收集資源使用指標。
步驟2:建立 Namespace 與 Deployment
建立一個新的 Namespace 與一個簡單的 Web 伺服器 Deployment:
# hpa/hpa-demo-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
labels:
project: hpa-demo
name: hpa-demo
# hpa/todo-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: todo-app
namespace: hpa-demo
spec:
replicas: 1
selector:
matchLabels:
app: todo
template:
metadata:
labels:
app: todo
spec:
containers:
- name: todoapp
image: quay.io/ginigangadharan/todo-app:2.0
ports:
- containerPort: 3000
resources:
requests:
cpu: 100m
#### 內容解密:
此 YAML 組態檔案定義了一個名為 todo-app 的 Deployment,使用 quay.io/ginigangadharan/todo-app:2.0 映象,並設定了 CPU 資源請求。CPU 資源請求的設定對於 HPA 的運作至關重要,因為 HPA 需要根據 CPU 使用率進行擴充套件決策。
Kubernetes 自動擴充套件:Pod 與 Node 的彈性管理
在現代化的雲端原生應用中,自動擴充套件(Autoscaling)是一項至關重要的功能,它能夠根據實際的工作負載動態調整資源,確保應用程式的高用性和效能。Kubernetes 提供了強大的自動擴充套件機制,包括 Horizontal Pod Autoscaler(HPA)和 Cluster Autoscaler(CA),用於管理和最佳化 Pod 和 Node 的資源分配。
實作 HPA
在前面的章節中,我們已經瞭解瞭如何使用 kubectl scale 命令手動調整 Pod 的數量。然而,在實際的生產環境中,我們需要根據工作負載自動調整 Pod 的數量。這就是 HPA 的用武之地。
建立 HPA 資源
首先,我們需要建立一個 HPA 資源,用於根據 CPU 使用率自動調整 Todo 應用的 Pod 數量。
# hpa/todo-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: todo-hpa
namespace: hpa-demo
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: todo-app
minReplicas: 1
maxReplicas: 5
metrics:
- resource:
name: cpu
target:
averageUtilization: 80
type: Utilization
type: Resource
套用 HPA 組態
$ kubectl apply -f hpa/todo-hpa.yaml
horizontalpodautoscaler.autoscaling/todo-hpa created
驗證 HPA 狀態
$ kubectl get hpa -n hpa-demo
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
todo-hpa Deployment/todo-app cpu: <unknown>/80% 1 5 0 6s
模擬工作負載
為了測試 HPA 的功能,我們需要模擬一個工作負載。我們可以使用 hey 工具來生成 HTTP 請求,模擬多個使用者同時存取 Todo 應用。
安裝 hey 工具
請參考官方檔案安裝 hey 工具:https://github.com/rakyll/hey
執行 hey 命令
$ hey -z 4m -c 25 http://localhost:8081
這個命令會在 4 分鐘內,使用 25 個並發連線存取 Todo 應用,模擬一個較高的負載。
觀察 Pod 資源使用情況
$ watch 'kubectl get po -n hpa-demo;kubectl top pods -n hpa-demo'
透過觀察 Pod 的資源使用情況,我們可以看到 HPA 如何根據 CPU 使用率自動調整 Pod 的數量。
此圖示展示了 HPA 的工作流程:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Kubernetes Pod 節點自動擴充套件實務
package "Kubernetes Cluster" {
package "Control Plane" {
component [API Server] as api
component [Controller Manager] as cm
component [Scheduler] as sched
database [etcd] as etcd
}
package "Worker Nodes" {
component [Kubelet] as kubelet
component [Kube-proxy] as proxy
package "Pods" {
component [Container 1] as c1
component [Container 2] as c2
}
}
}
api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2
note right of api
核心 API 入口
所有操作經由此處
end note
@enduml
內容解密:
此圖示展示了 HPA 的工作流程。當 CPU 使用率超過設定的門檻時,HPA 會觸發自動擴充套件,增加 Pod 的數量,以重新分配工作負載,穩定 CPU 使用率。當 CPU 使用率降低到門檻以下時,HPA 會減少 Pod 的數量,以最佳化資源利用率。