執行應用程式的多個執行個體

使用 kubectl 手動擴充現有應用程式。

目標

  • 使用 kubectl 擴充應用程式。

擴充應用程式

先前我們建立了一個 Deployment,然後透過 Service 公開它。Deployment 僅建立了一個 Pod 來執行我們的應用程式。當流量增加時,我們將需要擴充應用程式以跟上使用者需求。

如果您尚未完成先前的章節,請從 使用 minikube 建立叢集 開始。

擴充 是透過變更 Deployment 中的副本數來完成


摘要

  • 擴充 Deployment

您可以使用 kubectl create deployment 命令的 --replicas 參數,從一開始就建立具有多個執行個體的 Deployment

擴充概觀


擴充 Deployment 將確保建立新的 Pod 並排程到具有可用資源的節點。擴充將會增加 Pod 的數量到新的期望狀態。Kubernetes 也支援 Pod 的 自動擴充,但它超出本教學課程的範圍。擴充到零也是可能的,它將終止指定 Deployment 的所有 Pod。

執行應用程式的多個執行個體將需要一種將流量分配到所有執行個體的方式。服務具有整合的負載平衡器,可將網路流量分配到公開 Deployment 的所有 Pod。服務將持續監控使用端點的執行中 Pod,以確保流量僅傳送到可用的 Pod。

擴充是透過變更 Deployment 中的副本數來完成。


一旦您有多個應用程式執行個體正在執行,您就可以在不停機的情況下進行滾動更新。我們將在教學課程的下一節中介紹這一點。現在,讓我們前往終端機並擴充我們的應用程式。

擴充 Deployment

若要列出您的 Deployment,請使用 get deployments 子命令

kubectl get deployments

輸出應類似於

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
kubernetes-bootcamp   1/1     1            1           11m

我們應該有 1 個 Pod。如果沒有,請再次執行命令。這顯示

  • NAME 列出叢集中 Deployment 的名稱。
  • READY 顯示 CURRENT/DESIRED 副本的比率
  • UP-TO-DATE 顯示已更新以達成期望狀態的副本數。
  • AVAILABLE 顯示有多少應用程式副本可供您的使用者使用。
  • AGE 顯示應用程式已執行的時間量。

若要查看 Deployment 建立的 ReplicaSet,請執行

kubectl get rs

請注意,ReplicaSet 的名稱始終格式化為[DEPLOYMENT-NAME]-[RANDOM-STRING]。隨機字串是隨機產生的,並使用 pod-template-hash 作為種子。

此輸出的兩個重要欄位是

  • DESIRED 顯示應用程式的期望副本數,這是您在建立 Deployment 時定義的。這是期望狀態。
  • CURRENT 顯示目前正在執行的副本數。

接下來,讓我們將 Deployment 擴充到 4 個副本。我們將使用 kubectl scale 命令,後接 Deployment 類型、名稱與期望的執行個體數

kubectl scale deployments/kubernetes-bootcamp --replicas=4

若要再次列出您的 Deployment,請使用 get deployments

kubectl get deployments

變更已套用,我們有 4 個可用的應用程式執行個體。接下來,讓我們檢查 Pod 的數量是否已變更

kubectl get pods -o wide

現在有 4 個 Pod,具有不同的 IP 位址。變更已記錄在 Deployment 事件日誌中。若要檢查,請使用 describe 子命令

kubectl describe deployments/kubernetes-bootcamp

您也可以在這個指令的輸出中看到現在有 4 個副本。

負載平衡

讓我們檢查 Service 是否正在進行流量的負載平衡。為了找出暴露的 IP 和 Port,我們可以像在本教學課程前一部分學到的那樣使用 describe service 指令

kubectl describe services/kubernetes-bootcamp

建立一個名為NODE_PORT且值為 Node port 的環境變數

export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"

echo NODE_PORT=$NODE_PORT

接下來,我們將對暴露的 IP 位址和 port 執行 curl 指令。多次執行此指令

curl http://"$(minikube ip):$NODE_PORT"

我們每次請求都會連到不同的 Pod。這證明負載平衡正在運作。

輸出應類似於

Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-wp67j | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-hs9dj | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-4hjvf | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-wp67j | v=1
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-644c5687f4-4hjvf | v=1
                  

縮減規模

若要將 Deployment 縮減規模至 2 個副本,請再次執行 scale 子指令

kubectl scale deployments/kubernetes-bootcamp --replicas=2

列出 Deployments 以檢查變更是否已使用 get deployments 子指令套用

kubectl get deployments

副本數量減少到 2 個。使用 get pods 列出 Pod 數量

kubectl get pods -o wide

這確認了 2 個 Pod 已終止。

準備就緒後,請繼續進行執行滾動更新

上次修改時間:2024 年 10 月 20 日下午 1:40 PST:修正縮排 (57950764ca)