目標
- 使用 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
注意
如果您使用 Docker Desktop 作為容器驅動程式執行 minikube,則需要 minikube tunnel。這是因為 Docker Desktop 內的容器與您的主機電腦是隔離的。
在另一個終端機視窗中,執行minikube service kubernetes-bootcamp --url
輸出看起來像這樣
http://127.0.0.1:51082
! Because you are using a Docker driver on darwin, the terminal needs to be open to run it.
然後使用給定的 URL 來存取應用程式curl 127.0.0.1:51082
縮減規模
若要將 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 已終止。
準備就緒後,請繼續進行執行滾動更新。