在多雲 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映像。

  1. FROM node:14:使用官方Node.js 14映像作為基礎映像。
  2. WORKDIR /app:在容器中設定工作目錄為/app
  3. COPY package*.json ./:將package.jsonpackage-lock.json複製到工作目錄。
  4. RUN npm ci:安裝依賴套件。
  5. COPY . .:將當前目錄的所有檔案複製到容器的工作目錄。
  6. EXPOSE 8080:暴露容器的8080埠。
  7. 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。

  1. Deployment部分定義瞭如何佈署my-nodejs-app應用程式,包括使用的映像和副本數量。
  2. 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:更新應用程式

更新應用程式需要以下步驟:

  1. 修改原始碼。
  2. 使用新標籤構建新的Docker映像。
  3. 將新映像推播到Docker Hub。
  4. 更新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>允許您指定要回復到的特定修訂版本,這在需要精確控制版本時非常有用。