返回文章列表

Kubernetes Pod 節點自動擴充套件實務

本文探討 Kubernetes 自動擴充套件機制,涵蓋 Vertical Pod Autoscaler (VPA) 與 Horizontal Pod Autoscaler (HPA) 的實務應用。文章將逐步引導讀者設定 VPA,根據 Pod 資源使用情況自動調整 CPU 與記憶體請求,並示範如何設定 HPA,依據

容器技術 DevOps

Kubernetes 自動擴充套件功能對於現代應用程式至關重要,能有效應對波動的流量負載。VPA 能夠依據 Pod 的資源使用情況,自動調整 CPU 和記憶體的資源請求,避免資源不足或浪費。HPA 則根據 CPU 使用率或其他自定義指標,動態調整 Pod 副本數量,確保應用程式在高負載下仍能保持穩定執行。這兩種機制相互配合,構成了 Kubernetes 強大的自動擴充套件體系,讓開發者能更專注於應用程式邏輯,而無需過多擔心底層資源管理。實務上,VPA 常用於最佳化單個 Pod 的資源利用率,而 HPA 則更側重於應對整體服務的流量壓力。

自動擴充套件 Kubernetes Pod 與節點

在 Kubernetes 中,自動擴充套件(Autoscaling)是一項重要的功能,能夠根據資源使用情況動態調整 Pod 和節點的數量。本篇文章將介紹如何使用 Vertical Pod Autoscaler(VPA)來自動擴充套件 Kubernetes 中的 Pod。

準備 Deployment

首先,我們需要準備一個 Deployment 物件。以下是一步一步的:

  1. 啟用 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
  1. 建立 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
  1. 檢查 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 的資源請求。

  1. 建立 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
  1. 檢查 VPA 的建議

$ kubectl describe vpa hamster-vpa -n vpa-demo …… Status: Conditions: Last Transition Time: 2024-08-11T09:20:44Z Status: True Type: RecommendationProvided Recommendation: Container Recommendations: Container Name: hamster Lower Bound: Cpu: 461m Memory: 262144k Target: Cpu: 587m Memory: 262144k Uncapped Target: Cpu: 587m Memory: 262144k Upper Bound: Cpu: 1 Memory: 500Mi


#### 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 
...
  1. 套用更新後的 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 的數量,以最佳化資源利用率。