執行應用程式的多個例項
目標
- 使用 kubectl 手動擴充套件現有應用程式。
擴充套件應用程式
之前我們建立了一個 Deployment,然後透過 Service 將其公開。該 Deployment 只為執行我們的應用程式建立了一個 Pod。當流量增加時,我們需要擴充套件應用程式以滿足使用者需求。
如果您還沒有完成前面的部分,請從使用 minikube 建立叢集開始。
透過更改 Deployment 中副本的數量來實現**擴縮**。
注意
如果您在上一節之後嘗試此操作,則您可能已刪除建立的服務,或者建立了一個 `type: NodePort` 的服務。在本節中,假設為 kubernetes-bootcamp Deployment 建立了一個 `type: LoadBalancer` 的服務。
如果您**尚未**刪除在上一節中建立的服務,請首先刪除該服務,然後執行以下命令建立一個新的 `type` 設定為 `LoadBalancer` 的服務
kubectl expose deployment/kubernetes-bootcamp --type="LoadBalancer" --port 8080
擴縮概覽
擴充套件 Deployment 將確保建立新的 Pod 並將其排程到具有可用資源的節點上。擴充套件會將 Pod 數量增加到新的期望狀態。Kubernetes 還支援 Pod 的自動擴縮,但這超出了本教程的範圍。擴充套件到零也是可能的,它將終止指定 Deployment 的所有 Pod。
執行應用程式的多個例項將需要一種方法來將流量分發給所有這些例項。Service 具有整合的負載均衡器,可將網路流量分發給所有公開的 Deployment 的 Pod。Service 將使用端點持續監控正在執行的 Pod,以確保流量僅傳送到可用的 Pod。
一旦應用程式運行了多個例項,您就可以在不中斷服務的情況下執行滾動更新。我們將在教程的下一節中介紹這一點。現在,讓我們轉到終端並擴充套件我們的應用程式。
擴充套件 Deployment
要列出您的 Deployment,請使用 `get deployments` 子命令
kubectl get deployments
輸出應類似於
NAME READY UP-TO-DATE AVAILABLE AGE
kubernetes-bootcamp 1/1 1 1 11m
我們應該有一個 Pod。如果不是,請再次執行該命令。這表明
- **NAME** 列出叢集中 Deployment 的名稱。
- **READY** 顯示 CURRENT/DESIRED 副本的比例
- **UP-TO-DATE** 顯示已更新以達到期望狀態的副本數量。
- **AVAILABLE** 顯示有多少應用程式副本可供您的使用者使用。
- **AGE** 顯示應用程式已執行的時間量。
要檢視 Deployment 建立的 ReplicaSet,請執行
kubectl get rs
請注意,ReplicaSet 的名稱始終格式化為
此輸出的兩個重要列是
- **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 和埠,我們可以像教程前面部分學到的那樣使用 `describe service`
kubectl describe services/kubernetes-bootcamp
建立一個名為 NODE_PORT 的環境變數,其值為 Node 埠
export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo NODE_PORT=$NODE_PORT
接下來,我們將對公開的 IP 地址和埠執行 `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 隧道。這是因為 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
使用 `get deployments` 子命令列出 Deployment 以檢查更改是否已應用
kubectl get deployments
副本數量減少到 2。使用 `get pods` 列出 Pod 的數量
kubectl get pods -o wide
這確認有 2 個 Pod 被終止。
下一步
- 教程 執行滾動更新。
- 瞭解有關 ReplicaSet 的更多資訊。
- 瞭解有關 自動擴縮 的更多資訊。