返回文章列表

多雲Kubernetes叢集應用程式佈署

本文介紹如何在多雲 Kubernetes 叢集上佈署、更新、擴充套件和存取應用程式,以一個 Node.js 範例應用程式為例,逐步說明佈署流程,包含 Docker 映像構建、推播至 Docker Hub、YAML 檔案設定、佈署指令操作、狀態監控、擴充套件應用程式副本以及滾動更新等關鍵步驟,並提供管理多雲

Kubernetes 雲端運算

在多雲 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>允許您指定要回復到的特定修訂版本,這在需要精確控制版本時非常有用。