Kubernetes 佈署擴充套件是確保應用程式高用性和可擴充套件性的關鍵。本文探討了在資源受限的單節點 Kubernetes 環境下進行佈署擴充套件的挑戰。透過嘗試將佈署副本數量擴充套件至 90,觀察到節點資源耗盡導致的不穩定性,突顯了資源限制的重要性。使用 kubectl describe node 命令詳細分析了節點的資源狀態,包括 CPU、記憶體、磁碟和 Pod 容量,以及網路連線狀態。此外,還示範了使用 scale-deployment.sh 指令碼逐步擴充套件佈署,並搭配 kubectl get deployments 命令監控擴充套件過程,以及使用 kubectl describe node 命令觀察節點資源使用情況。最後,文章提出了未來改進方向,包括多節點叢集佈署、自動擴充套件機制和更精細的資源監控與管理策略,以提升 Kubernetes 叢集的穩定性和擴充套件性。

Kubernetes 佈署擴充套件的探討

在前面的章節中,我們已經初步瞭解了 Kubernetes(K8S)中的 ReplicaSet 以及其在確保應用程式高用性方面的重要性。現在,我們將更深入地探討 Kubernetes 中的佈署擴充套件(Scaling the Deployment),並且透過實際操作來觀察節點資源耗盡時的行為。

什麼是副本(Replicas)?

副本是指在任何給定的時間內,我們希望執行的容器映像例項的數量,以確保應用的可用性和可擴充套件性。在 Kubernetes 中,透過調整副本數量,可以實作應用的水平擴充套件。

檢視當前節點和 Pod 狀態

首先,我們來檢視當前叢集中的節點狀態。如以下輸出所示,我們的叢集中只有一個節點 wks01,並且它處於 Ready 狀態。

microk8s kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
wks01     Ready    <none>   136m   v1.27.4

程式碼解密:

  • microk8s kubectl get nodes:這個命令用於取得叢集中所有節點的狀態。
  • NAMESTATUSROLESAGEVERSION 分別表示節點名稱、狀態、角色、存在時間和 Kubernetes 版本。

擴充套件佈署

現在,讓我們嘗試將佈署 mydeployment 的副本數量更新為 90,並觀察 Kubernetes 如何處理這個請求。

microk8s kubectl apply -f mydep-atscale.yaml
deployment.apps/mydeployment configured

程式碼解密:

  • microk8s kubectl apply -f mydep-atscale.yaml:這個命令用於應用 mydep-atscale.yaml 檔案中的組態,更新佈署 mydeployment
  • deployment.apps/mydeployment configured:表示佈署已經成功更新。

更新後,我們檢查佈署的狀態:

microk8s kubectl get deployments
NAME          READY   UP-TO-DATE   AVAILABLE   AGE
mydeployment   30/90   30           30          4h15m

程式碼解密:

  • microk8s kubectl get deployments:這個命令用於取得當前佈署的狀態。
  • NAMEREADYUP-TO-DATEAVAILABLEAGE 分別表示佈署名稱、準備就緒的副本數、更新完成的副本數、可用的副本數和佈署存在時間。
  • 30/90 表示當前只有 30 個副本處於準備就緒狀態,而我們請求的是 90 個副本。

資源限制與節點穩定性

在我們的實驗環境中,由於只有一個虛擬機器(VM),並且其資源有限(2GB 記憶體),當我們嘗試擴充套件到 90 個副本時,節點很快就變得不穩定,最終不得不重啟 VM。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Kubernetes 佈署擴充套件探討

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

圖表翻譯: 此圖示展示了當我們請求擴充套件到 90 個副本時,Kubernetes 的排程過程以及最終導致節點資源耗盡和不穩定的過程。

內容解密:

  • 開始擴充套件:我們請求將佈署擴充套件到 90 個副本。
  • Kubernetes 排程:Kubernetes 嘗試排程這些副本到可用的節點上。
  • 資源耗盡:由於節點資源有限,很快就被耗盡。
  • 節點不穩定:資源耗盡導致節點變得不穩定。

自動擴充套件指令碼

為了更系統地觀察叢集在擴充套件過程中的行為,我們編寫了一個簡單的 bash 指令碼 scale-deployment.sh,每隔 30 秒增加一個副本。

#!/bin/bash
num=1
while [ $num -gt 0 ]
do
  microk8s kubectl scale deployment --replicas $num mydeployment
  echo "deployment scale = $num"
  date
  echo "sleeping for 30 seconds, on another terminal watch deployment being scaled"
  sleep 30
  num=`expr $num + 1`
done

程式碼解密:

  • while [ $num -gt 0 ]:迴圈條件,只要 num 大於 0 就繼續執行。
  • microk8s kubectl scale deployment --replicas $num mydeployment:動態調整佈署 mydeployment 的副本數量為 num
  • sleep 30:每隔 30 秒執行一次擴充套件操作。

觀察節點資源使用情況

在執行擴充套件指令碼的同時,我們開啟另一個終端視窗,使用 microk8s kubectl describe node 命令來觀察節點的資源使用情況。

microk8s kubectl describe node
Name:               wks01
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64

程式碼解密:

  • microk8s kubectl describe node:用於取得節點的詳細資訊。
  • NameRolesLabels 等欄位提供了節點的基本資訊和標籤。

未來工作與改進方向

  1. 多節點叢集佈署:在多節點叢集中進行佈署擴充套件,以提高資源利用率和應用可用性。
  2. 自動擴充套件機制:利用 Kubernetes 的自動擴充套件功能,根據實際負載動態調整副本數量。
  3. 資源監控與管理:加強對節點資源的監控和管理,及時發現並解決資源瓶頸問題。

透過這些改進,我們可以進一步提升 Kubernetes 叢集的穩定性和擴充套件性,為應用提供更強大的支援。

參考資料

本章內容到此結束,感謝您的閱讀。希望透過本章的學習,您能夠對 Kubernetes 中的佈署擴充套件有更深入的瞭解。

Kubernetes 叢集擴充套件實戰:深入剖析 Deployment 擴充套件過程

在現代雲原生應用中,Kubernetes 已成為事實上的容器協調標準。其中,Deployment 資源是管理應用佈署的核心元件。本文將探討 Kubernetes Deployment 的擴充套件機制,並透過實際案例分析其運作細節。

節點健康狀態檢查

在進行 Deployment 擴充套件之前,檢查節點健康狀態是必要的第一步。透過 kubectl describe node 命令,我們可以取得節點的詳細資訊:

shiva@wks01:~$ microk8s kubectl describe node wks01

節點資訊解析

Name:               wks01
Labels:
  kubernetes.io/hostname=wks01
  kubernetes.io/os=linux
  microk8s.io/cluster=true
  node.kubernetes.io/microk8s-controlplane=microk8s-controlplane
Annotations:
  node.alpha.kubernetes.io/ttl: 0
  projectcalico.org/IPv4Address: 192.168.0.209/24
  volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Thu, 31 Aug 2023 16:19:53 +0000
Taints:             <none>
Unschedulable:      false

內容解密:

此段輸出顯示了節點的基本資訊,包括:

  1. 節點標籤:標識節點的主機名稱、作業系統和叢集歸屬
  2. 註解資訊:包含網路組態和儲存管理相關的後設資料
  3. 建立時間戳:節點加入叢集的時間
  4. Taints 狀態:目前無任何汙點,表示節點可正常排程

節點資源狀態分析

進一步檢視節點的資源狀態:

Conditions:
  Type             Status  LastHeartbeatTime           Reason              Message
  
---
-             
---
---
  
---
-
---
-
---
-
---
---
          
---
---
              
---
-
---
  NetworkUnavailable False   Thu, 31 Aug 2023 16:54:01   CalicoIsUp          Calico is running on this node
  MemoryPressure    False   Thu, 31 Aug 2023 20:59:30   KubeletHasSufficientMemory kubelet has sufficient memory available
  DiskPressure      False   Thu, 31 Aug 2023 20:59:30   KubeletHasNoDiskPressure   kubelet has no disk pressure
  PIDPressure       False   Thu, 31 Aug 2023 20:59:30   KubeletHasSufficientPID    kubelet has sufficient PID available
  Ready             True    Thu, 31 Aug 2023 20:59:30   KubeletReady        kubelet is posting ready status. AppArmor enabled

內容解密:

節點狀態檢查結果表明:

  1. 網路狀態正常:Calico 網路元件運作正常
  2. 資源充足:記憶體、磁碟和 PID 資源均未出現壓力
  3. Ready 狀態:節點已準備好接受新的工作負載
  4. Kubelet 狀態:Kubelet 運作正常並啟用 AppArmor

資源容量與可分配資源

檢視節點的資源容量:

Capacity:
  cpu:                2
  ephemeral-storage:   38905184Ki
  memory:             2010852Ki
  pods:               110
Allocatable:
  cpu:                2
  ephemeral-storage:   37856608Ki
  memory:             1908452Ki
  pods:               110

內容解密:

資源組態詳情:

  1. 總容量:2 核心 CPU、約 1.9GB 可用記憶體
  2. 可分配資源:扣除系統預留資源後的可用量
  3. Pod 容量:節點最多可執行 110 個 Pod

Deployment 擴充套件實戰

擴充套件過程監控

透過 scale-deployment.sh 指令碼持續擴充套件 Deployment:

shiva@ubuntu2004-02:~$ microk8s kubectl get deployments
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
dep-webserver   1/1     1            1           72d
mydeployment    38/39   38           38          6d15h

內容解密:

擴充套件結果顯示:

  1. mydeployment 已擴充套件至 38 個副本,接近目標值 39
  2. dep-webserver 保持單一副本穩定執行
  3. 年齡資訊:顯示 Deployment 的執行時間

詳細佈署資訊分析

進一步檢視 mydeployment 的詳細資訊:

Name:                   mydeployment
Namespace:              default
Replicas:               60 desired | 59 updated | 59 total | 59 available | 0 unavailable
StrategyType:           RollingUpdate
RollingUpdateStrategy: 25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=label-nginx
  Containers:
    name-nginx:
      Image: local/mynginx:01
      Port:     80/TCP

內容解密:

佈署策略詳解:

  1. 期望狀態:60 個副本
  2. 更新策略:滾動更新,最大不可用/激增比例均為 25%
  3. 容器組態:使用 local/mynginx:01 映像,暴露 80 埠

效能監控與觀察

在擴充套件過程中,叢集表現出一定的延遲:

deployment.apps/mydeployment scaled
deployment scale = 270
Thu Aug 31 09:10:58 PM UTC 2023
sleeping for 30 seconds, on another terminal watch deployment being scaled
deployment.apps/mydeployment scaled
deployment scale = 271

內容解密:

擴充套件過程觀察:

  1. 擴充套件速度:逐漸增加副本數量

  2. 間隔控制:每 30 秒調整一次規模

  3. 叢集反應:觀察到叢集在高負載下的反應

  4. 自動擴充套件機制:研究根據 HPA 的動態擴充套件方案

  5. 效能最佳化:探索更高效的資源排程策略

  6. 高可用性架構:設計多維度的高可用性解決方案

透過持續最佳化和改進,我們可以構建更穩定、高效的 Kubernetes 叢集環境。