在多雲 Kubernetes 叢集上佈署應用程式,與單一雲叢集的流程大致相同,主要差異在於叢集的組成架構。本文將以一個 Node.js 應用程式範例,示範如何在多雲環境中佈署、管理和更新應用程式。首先,確保您的多雲 Kubernetes 叢集狀態正常,接著準備 Node.js 範例程式碼,並建立對應的 Dockerfile。建構 Docker 映像後,推播到 Docker Hub 等容器映像倉函式庫。接著,撰寫 Kubernetes 佈署 YAML 檔案,定義 Deployment 和 Service,並使用 kubectl 指令佈署應用程式到多雲叢集。佈署完成後,可透過 kubectl 指令監控 Pod 狀態、取得服務外部 IP 位址,並進行擴充套件和更新等操作。透過滾動更新機制,可以確保應用程式在更新過程中保持可用性。
在多雲Kubernetes叢集上佈署應用程式
現在您已經擁有一個跨多雲環境的Kubernetes叢集,接下來我們將逐步介紹如何在這個叢集上佈署應用程式。本文將以一個Node.js範例應用程式為例,詳細講解佈署流程。
佈署應用程式前的準備
首先,確保您的多雲Kubernetes叢集已經正常運作。接下來,我們將透過以下步驟來佈署範例應用程式。
步驟1:複製範例應用程式
從以下GitHub倉函式庫複製範例Node.js應用程式:
git clone https://github.com/kubernetes/examples.git
cd examples/staging/nodejs/
步驟2:建立Dockerfile
在nodejs目錄下建立一個名為Dockerfile的檔案,內容如下:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
EXPOSE 8080
CMD ["npm", "start"]
內容解密:
此Dockerfile定義瞭如何構建Node.js應用程式的Docker映像。
FROM node:14:使用官方Node.js 14映像作為基礎映像。WORKDIR /app:在容器中設定工作目錄為/app。COPY package*.json ./:將package.json和package-lock.json複製到工作目錄。RUN npm ci:安裝依賴套件。COPY . .:將當前目錄的所有檔案複製到容器的工作目錄。EXPOSE 8080:暴露容器的8080埠。CMD ["npm", "start"]:設定容器啟動時執行的命令。
步驟3:構建Docker映像
使用以下命令構建範例應用程式的Docker映像:
docker build -t my-nodejs-app:1.0 .
內容解密:
此命令根據當前目錄下的Dockerfile構建一個名為my-nodejs-app:1.0的Docker映像。
步驟4:將Docker映像推播到容器註冊中心
首先,登入Docker Hub:
docker login
然後,將映像標記為您的Docker Hub使用者名稱:
docker tag my-nodejs-app:1.0 <your-dockerhub-username>/my-nodejs-app:1.0
最後,將映像推播到Docker Hub:
docker push <your-dockerhub-username>/my-nodejs-app:1.0
內容解密:
這些命令將您的Docker映像推播到Docker Hub,使其能夠被您的Kubernetes叢集存取。
步驟5:建立佈署YAML檔案
建立一個名為my-nodejs-app-deployment.yaml的檔案,內容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nodejs-app
spec:
replicas: 3
selector:
matchLabels:
app: my-nodejs-app
template:
metadata:
labels:
app: my-nodejs-app
spec:
containers:
- name: my-nodejs-app
image: <your-dockerhub-username>/my-nodejs-app:1.0
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: my-nodejs-app
spec:
type: LoadBalancer
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
app: my-nodejs-app
內容解密:
此YAML檔案定義了一個Deployment和一個Service。
- Deployment部分定義瞭如何佈署
my-nodejs-app應用程式,包括使用的映像和副本數量。 - Service部分定義了一個LoadBalancer型別的服務,用於暴露應用程式。
步驟6:佈署應用程式
使用以下命令將應用程式佈署到您的多雲Kubernetes叢集:
kubectl apply -f my-nodejs-app-deployment.yaml
步驟7:監控佈署狀態
檢查佈署狀態:
kubectl rollout status deployment my-nodejs-app
一旦佈署完成,您可以檢查建立的Pod:
kubectl get pods -l app=my-nodejs-app
步驟8:存取應用程式
取得my-nodejs-app服務的外部IP位址:
kubectl get service my-nodejs-app
使用外部IP位址和埠8080存取應用程式,例如:http://123.45.67.89:8080
步驟9:擴充套件應用程式
如有需要,您可以擴充套件應用程式的副本數量:
kubectl scale deployment my-nodejs-app --replicas=5
檢查更新後的Pod數量:
kubectl get pods -l app=my-nodejs-app
步驟10:更新應用程式
更新應用程式需要以下步驟:
- 修改原始碼。
- 使用新標籤構建新的Docker映像。
- 將新映像推播到Docker Hub。
- 更新Deployment以使用新映像。
例如,更新映像標籤到1.1:
# 構建新映像
docker build -t my-nodejs-app:1.1 .
# 將新映像標記為您的Docker Hub使用者名稱
docker tag my-nodejs-app:1.1 <your-dockerhub-username>/my-nodejs-app:1.1
# 將新映像推播到Docker Hub
docker push <your-dockerhub-username>/my-nodejs-app:1.1
# 更新Deployment以使用新映像
kubectl set image deployment my-nodejs-app my-nodejs-app=<your-dockerhub-username>/my-nodejs-app:1.1
清理資源
完成實驗後,刪除與應用程式相關的資源:
kubectl delete -f my-nodejs-app-deployment.yaml
本範例演示瞭如何在多雲Kubernetes叢集上佈署、更新、擴充套件和存取範例應用程式。遵循這些步驟,您可以在自己的多雲叢集上佈署自己的應用程式。
管理多雲Kubernetes叢集中的佈署
無論是使用多雲Kubernetes叢集還是單一雲叢集,管理佈署的方式基本上是相同的。在這兩種情況下,都會依賴同一個工具——kubectl,來與佈署進行互動。這意味著,無需擔心因雲端服務供應商的不同而調整管理方法。簡而言之,一旦掌握了在單一雲叢集中管理佈署的技能,就能夠輕鬆地將這些技能應用到多雲環境中。
常見的佈署管理任務
取得佈署清單
要檢視叢集中的佈署清單,請執行:
kubectl get deployments
取得佈署的詳細資訊
要檢視特定佈署的詳細資訊,請執行:
kubectl describe deployment <deployment-name>
請將<deployment-name>替換為您的佈署名稱。
更新副本數量
要擴充套件佈署,請變更副本數量:
kubectl scale deployment <deployment-name> --replicas=<number-of-replicas>
請將<deployment-name>替換為您的佈署名稱,將<number-of-replicas>替換為所需的副本數量。
#### 內容解密:
kubectl scale指令用於手動擴充套件或縮減Deployment中的Pod數量。<deployment-name>是您要擴充套件的Deployment名稱。--replicas=<number-of-replicas>指定了您希望Deployment維持的Pod數量。
暫停和還原佈署
您可以暫停佈署以套用多項變更,然後還原它:
# 暫停佈署
kubectl rollout pause deployment <deployment-name>
# 套用多項變更
kubectl set env deployment <deployment-name> KEY1=VALUE1 KEY2=VALUE2
kubectl set resources deployment <deployment-name> -c=<container-name> --limits=cpu=200m,memory=512Mi
# 還原佈署
kubectl rollout resume deployment <deployment-name>
請將<deployment-name>和<container-name>分別替換為您的佈署和容器的名稱。
#### 內容解密:
kubectl rollout pause指令暫停Deployment的滾動更新,讓您可以在不觸發新滾動更新的情況下進行多項變更。kubectl set env用於設定環境變數。kubectl set resources用於設定資源限制。kubectl rollout resume還原暫停的滾動更新。
檢查滾動更新狀態
監控滾動更新的狀態:
kubectl rollout status deployment <deployment-name>
請將<deployment-name>替換為您的佈署名稱。
#### 內容解密:
kubectl rollout status用於檢查Deployment滾動更新的進度與狀態。
檢視滾動更新歷史
要檢視佈署的滾動更新歷史,請執行:
kubectl rollout history deployment <deployment-name>
請將<deployment-name>替換為您的佈署名稱。
#### 內容解密:
kubectl rollout history顯示Deployment的滾動更新歷史記錄,包括每次更新的版本資訊。
滾動更新
Kubernetes提供了一個重要的功能,稱為滾動更新,它能夠在最小中斷的情況下更新應用程式。基本上,滾動更新的工作原理是逐漸用新的應用程式例項替換舊的例項,確保始終有一定數量的副本可供存取。這樣,即使在新版本的應用程式正在佈署過程中,使用者仍然可以存取舊版本的某部分,而不會中斷他們的使用體驗。
執行滾動更新
要對特定佈署執行滾動更新,您需要更新容器映像:
kubectl set image deployment <deployment-name> <container-name>=<new-image>
請將<deployment-name>替換為您的佈署名稱,將<container-name>替換為要更新的容器名稱,將<new-image>替換為新的映像。
例如,如果您有一個名為my-nodejs-app的佈署,其中有一個名為my-nodejs-app的容器,並且您想要將映像更新到版本1.1,請執行:
kubectl set image deployment my-nodejs-app my-nodejs-app=<your-dockerhub-username>/my-nodejs-app:1.1
Kubernetes將逐漸用新的例項替換舊的例項,確保應用程式在整個更新過程中保持可用。
#### 內容解密:
kubectl set image用於更新Deployment中的容器映像,觸發滾動更新。<container-name>=<new-image>指定了要更新的容器及其新的映像。
監控滾動更新狀態
您可以使用以下指令檢查滾動更新的狀態:
kubectl rollout status deployment <deployment-name>
請將<deployment-name>替換為您的佈署名稱。
#### 內容解密:
kubectl rollout status指令用於即時監控滾動更新的狀態,確保更新過程順利進行。
暫停和還原滾動更新
您可以暫停滾動更新以套用多項變更或除錯問題,然後稍後還原它:
# 暫停滾動更新
kubectl rollout pause deployment <deployment-name>
# 進行變更或除錯問題
# ...
# 還原滾動更新
kubectl rollout resume deployment <deployment-name>
請將<deployment-name>替換為您的佈署名稱。
#### 內容解密:
kubectl rollout pause暫停滾動更新,讓您可以在不影響整體進度的情況下進行額外的變更或除錯。kubectl rollout resume還原被暫停的滾動更新,使其繼續執行。
回復到先前的版本
如果在滾動更新後遇到問題,您可以回復到先前的佈署版本:
kubectl rollout undo deployment <deployment-name>
請將<deployment-name>替換為您的佈署名稱。
#### 內容解密:
kubectl rollout undo指令將Deployment回復到上一個版本,用於快速修復問題或還原變更。
回復到特定修訂版本
如果您想要回復到特定的修訂版本,請使用--to-revision標誌:
kubectl rollout undo deployment <deployment-name> --to-revision=<revision-number>
請將<deployment-name>替換為您的佈署名稱,將<revision-number>替換為所需的修訂版本號碼。
#### 內容解密:
--to-revision=<revision-number>允許您指定要回復到的特定修訂版本,這在需要精確控制版本時非常有用。