Kubernetes 提供了豐富的機制來佈署和管理應用程式,從建立 Docker 映像、設定佈署組態到滾動更新和自動擴充套件,都能有效提升應用程式的可靠性和擴充套件性。本文將逐步說明如何利用 Docker 和 Kubernetes 佈署 Node.js 應用程式,並探討多雲佈署的管理策略,以及 Helm 套件管理器的應用,最後涵蓋監控、日誌和安全性等重要導向。首先,我們會建立 Docker 映像並推播到 Docker Hub,接著撰寫 Kubernetes 佈署組態檔,並使用 kubectl 指令進行佈署。後續將深入探討滾動更新的機制,確保應用程式在更新過程中保持可用性,並設定自動擴充套件以應對流量波動。在多雲環境下,我們將探討如何一致地管理 Kubernetes 叢集,並利用 Helm 簡化佈署流程。最後,我們將關注監控和日誌的收集,以及如何確保 Kubernetes 環境的安全性。

佈署應用程式的步驟

  1. 確認叢集狀態:在開始佈署應用程式之前,請確保您的Kubernetes叢集正在執行且功能正常。
  2. 選擇應用程式:為了示範,我們將使用一個Node.js應用程式。這個應用程式將被容器化並佈署到Kubernetes叢集上。
  3. 建立Dockerfile:在應用程式目錄中,建立一個Dockerfile以定義如何建構應用程式的Docker映像。
# 使用Node.js 14作為基礎映像
FROM node:14

# 設定工作目錄
WORKDIR /app

# 複製package.json檔案
COPY package*.json ./

# 執行npm ci指令以安裝依賴套件
RUN npm ci

# 複製應用程式程式碼
COPY . .

# 公開8080埠
EXPOSE 8080

# 設定啟動命令
CMD ["npm", "start"]
  1. 建構Docker映像:使用Dockerfile建構應用程式的Docker映像。
docker build -t my-nodejs-app:1.0 .
  1. 推播Docker映像到容器登入:將Docker映像推播到一個可供Kubernetes存取的容器登入中。這裡,我們使用Docker Hub作為範例。
docker tag my-nodejs-app:1.0 <您的Docker Hub帳戶名稱>/my-nodejs-app:1.0
docker push <您的Docker Hub帳戶名稱>/my-nodejs-app:1.0
  1. 建立Kubernetes佈署:使用Kubernetes的佈署資源定義來佈署您的應用程式。
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: <您的Docker Hub帳戶名稱>/my-nodejs-app:1.0
        ports:
        - containerPort: 8080
  1. 應用佈署組態:將佈署組態應用到您的Kubernetes叢集。
kubectl apply -f deployment.yaml
  1. 暴露服務:建立一個Kubernetes服務以暴露您的應用程式給外部。
apiVersion: v1
kind: Service
metadata:
  name: my-nodejs-app-service
spec:
  selector:
    app: my-nodejs-app
  ports:
  - name: http
    port: 80
    targetPort: 8080
  type: LoadBalancer
  1. 測試應用程式:最後,測試您的應用程式是否正常執行。
kubectl get svc my-nodejs-app-service -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'
圖表翻譯:
  graph LR
    A[應用程式程式碼] -->|建構|> B[Docker映像]
    B -->|推播|> C[容器登入]
    C -->|提取|> D[Kubernetes]
    D -->|佈署|> E[佈署組態]
    E -->|應用|> F[Kubernetes叢集]
    F -->|暴露|> G[服務]
    G -->|測試|> H[外部存取]

這個流程圖描述了從應用程式程式碼到佈署在Kubernetes叢集上的整個過程,包括建構Docker映像、推播到容器登入、提取映像、佈署到Kubernetes,以及最終暴露服務給外部。這個過程展示了Kubernetes如何簡化容器化應用程式的佈署和管理。

佈署Node.js應用至Kubernetes

步驟一:登入Docker Hub

首先,使用docker login命令登入Docker Hub,然後標記您的映象並上傳至Docker Hub。這一步驟非常重要,因為它確保您的映象可以被Kubernetes存取。

docker login
docker tag my-nodejs-app:1.0 <你的DockerHub使用者名稱>/my-nodejs-app:1.0
docker push <你的DockerHub使用者名稱>/my-nodejs-app:1.0

步驟二:建立佈署YAML檔

接下來,建立一個名為my-nodejs-app-deployment.yaml的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: <你的DockerHub使用者名稱>/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

步驟三:佈署應用

使用以下命令佈署您的應用至Kubernetes叢集:

kubectl apply -f my-nodejs-app-deployment.yaml

步驟四:監控佈署

檢查佈署狀態:

kubectl rollout status deployment my-nodejs-app

一旦佈署完成,您可以檢視建立的Pods:

kubectl get pods -l app=my-nodejs-app

步驟五:存取應用

要存取您的應用,您需要取得my-nodejs-app服務的外部IP地址:

kubectl get service my-nodejs-app

注意輸出的EXTERNAL-IP,然後在瀏覽器中存取該IP地址加上埠號(本例中為8080)。

步驟六:擴充套件應用

如果需要,您可以擴充套件應用的複本數量:

kubectl scale deployment my-nodejs-app --replicas=5

然後,檢視更新後的Pods數量:

kubectl get pods -l app=my-nodejs-app

步驟七:更新應用

要更新您的應用,修改原始程式碼,建立一個新的Docker映象,標記並推播到Docker Hub,然後更新佈署。例如,更新映象標籤至1.1:

# 建立新的映象
docker build -t my-nodejs-app:1.1 .

# 標記映象
docker tag my-nodejs-app:1.1 <你的DockerHub使用者名稱>/my-nodejs-app:1.1

# 推播映象到Docker Hub
docker push <你的DockerHub使用者名稱>/my-nodejs-app:1.1

這樣,您就可以使用Kubernetes佈署您的Node.js應用,並且可以輕鬆地擴充套件和更新您的應用。

Kubernetes 多雲佈署管理

在 Kubernetes 中,無論您是在單雲還是多雲環境中佈署應用程式,管理佈署的方法都大致相同。您將使用相同的工具 kubectl 來與您的佈署進行互動。這意味著,一旦您掌握了在單雲叢集中管理佈署的技能,您就可以毫不費力地將這些技能應用於多雲環境。

常見的佈署管理任務

以下是管理多雲 Kubernetes 叢集中佈署的一些常見任務:

取得佈署列表

要檢視叢集中的佈署列表,請執行:

kubectl get deployments

取得佈署的詳細資訊

要檢視特定佈署的詳細資訊,請執行:

kubectl describe deployment <佈署名稱>

<佈署名稱> 替換為您的佈署名稱。

更新複製數

要擴大或縮小佈署,請更改複製數:

kubectl scale deployment <佈署名稱> --replicas=<複製數>

<佈署名稱> 替換為您的佈署名稱,將 <複製數> 替換為所需的複製數。

暫停和還原佈署

您可以暫停佈署以應用多個更改,然後還原它:

# 暫停佈署
kubectl rollout pause deployment <佈署名稱>

# 應用多個更改
kubectl set env deployment <佈署名稱> KEY1=VALUE1 KEY2=VALUE2
kubectl set resources deployment <佈署名稱> -c=<容器名稱> --limits=cpu=200m,memory=512Mi

# 還原佈署
kubectl rollout resume deployment <佈署名稱>

<佈署名稱><容器名稱> 替換為您的佈署和容器名稱。

更新佈署

要更新佈署以使用新映像,請執行:

kubectl set image deployment my-nodejs-app my-nodejs-app=<您的 Docker Hub 使用者名稱稱>/my-nodejs-app:1.1

這將更新 my-nodejs-app 佈署以使用新映像 <您的 Docker Hub 使用者名稱稱>/my-nodejs-app:1.1

清理資源

要刪除與您的應用程式相關的資源,請執行:

kubectl delete -f my-nodejs-app-deployment.yaml

這將刪除與您的應用程式相關的資源。

透過這些命令和任務,您可以輕鬆地管理您的 Kubernetes 佈署,無論是在單雲還是多雲環境中。

佈署管理和滾動更新

在 Kubernetes 中,佈署(Deployment)是一種管理 Pod 和 ReplicaSet 的資源,能夠讓您輕鬆地管理和更新您的應用程式。以下是佈署管理和滾動更新的相關內容。

檢查滾動更新狀態

您可以使用以下命令檢查滾動更新的狀態:

kubectl rollout status deployment <佈署名稱>

請將 <佈署名稱> 替換為您的佈署名稱。

檢視滾動更新歷史

您可以使用以下命令檢視滾動更新的歷史:

kubectl rollout history deployment <佈署名稱>

請將 <佈署名稱> 替換為您的佈署名稱。

滾動更新

Kubernetes 提供了一個重要的功能叫做滾動更新(Rolling Updates),它可以讓您在不中斷使用者的情況下更新您的應用程式。滾動更新的工作原理是確保有一定數量的副本(Replica)始終可用,即使新版本的應用程式正在佈署,使用者也可以繼續存取舊版本的應用程式而不會受到影響。

執行滾動更新

您可以使用以下命令執行滾動更新:

kubectl set image deployment <佈署名稱> <容器名稱>=<新映像>

請將 <佈署名稱> 替換為您的佈署名稱, <容器名稱> 替換為您要更新的容器名稱, <新映像> 替換為新的映像名稱。

例如,如果您有一個名為 my-nodejs-app 的佈署,包含一個名為 my-nodejs-app 的容器,您可以使用以下命令更新映像:

kubectl set image deployment my-nodejs-app my-nodejs-app=<您的 Docker Hub 使用者名稱稱>/my-nodejs-app:1.1

Kubernetes 會逐漸替換舊的例項為新的例項,確保應用程式在更新過程中保持可用。

暫停和還原滾動更新

您可以暫停滾動更新以應用多個變更或除錯問題,然後稍後還原它:

# 暫停滾動更新
kubectl rollout pause deployment <佈署名稱>

請將 <佈署名稱> 替換為您的佈署名稱。

圖表翻譯:

  flowchart TD
    A[開始] --> B[檢查滾動更新狀態]
    B --> C[執行滾動更新]
    C --> D[暫停滾動更新]
    D --> E[還原滾動更新]
    E --> F[完成]

這個流程圖描述了滾動更新的過程,從檢查滾動更新狀態開始,然後執行滾動更新,暫停滾動更新,還原滾動更新,最後完成滾動更新。

內容解密:

這個內容描述了 Kubernetes 中的佈署管理和滾動更新。滾動更新是一個重要的功能,可以讓您在不中斷使用者的情況下更新您的應用程式。您可以使用 kubectl 命令檢查滾動更新的狀態,執行滾動更新,暫停和還原滾動更新。

Kubernetes 佈署管理:滾動更新、回復和自動擴充套件

Kubernetes 提供了一套強大的工具來管理容器化應用程式的佈署和擴充套件。這些工具包括滾動更新、回復和自動擴充套件,讓您可以輕鬆地管理應用程式的生命週期。

滾動更新

滾動更新是一種更新佈署的方式,讓您可以逐步更新應用程式的版本,而不會中斷服務。您可以使用 kubectl rollout 命令來管理滾動更新。

# 暫停滾動更新
kubectl rollout pause deployment <deployment-name>

# 繼續滾動更新
kubectl rollout resume deployment <deployment-name>

如果您遇到問題,可以使用 kubectl rollout undo 命令來回復到之前的版本。

# 回復到之前的版本
kubectl rollout undo deployment <deployment-name>

您也可以使用 kubectl rollout history 命令來檢視滾動更新的歷史記錄。

# 檢視滾動更新歷史記錄
kubectl rollout history deployment <deployment-name>

自動擴充套件

自動擴充套件是 Kubernetes 中的一個重要功能,讓您可以根據工作負載的變化自動調整應用程式的副本數。您可以使用 kubectl autoscale 命令來管理自動擴充套件。

# 啟用自動擴充套件
kubectl autoscale deployment <deployment-name> --min=<min-replicas> --max=<max-replicas> --cpu-percent=<cpu-percent>

您也可以使用 kubectl scale 命令來手動調整應用程式的副本數。

# 手動調整副本數
kubectl scale deployment <deployment-name> --replicas=<number-of-replicas>

圖表翻譯

以下是滾動更新和自動擴充套件的流程圖:

  flowchart TD
    A[滾動更新] --> B[暫停更新]
    B --> C[繼續更新]
    C --> D[回復到之前的版本]
    D --> E[檢視更新歷史記錄]
    E --> F[自動擴充套件]
    F --> G[啟用自動擴充套件]
    G --> H[手動調整副本數]

圖表翻譯:

此圖表顯示了滾動更新和自動擴充套件的流程。首先,滾動更新可以暫停和繼續,然後可以回復到之前的版本。接著,可以檢視更新歷史記錄。自動擴充套件可以啟用和手動調整副本數。

自動擴充套件(Autoscaling)在 Kubernetes 中的實踐

在 Kubernetes 中,自動擴充套件(Autoscaling)是一項重要的功能,能夠根據實際工作負載的情況動態調整 Pod 的數量,以確保應用程式的高效執行和穩定性。這項功能主要透過 Kubernetes Horizontal Pod Autoscaler(HPA)來實作。

建立 HPA 資源

要啟用自動擴充套件,首先需要建立一個 HPA 資源。這可以透過 kubectl autoscale 命令來完成。基本的命令格式如下:

kubectl autoscale deployment <佈署名稱> --min=<最小副本數> --max=<最大副本數> --cpu-percent=<目標 CPU 使用率>

在這個命令中,需要替換 <佈署名稱><最小副本數><最大副本數><目標 CPU 使用率>。例如,要為一個名為 my-nodejs-app 的佈署建立一個 HPA,設定最小副本數為 3,最大副本數為 10,目標 CPU 使用率為 50%,可以使用以下命令:

kubectl autoscale deployment my-nodejs-app --min=3 --max=10 --cpu-percent=50

驗證 HPA

建立 HPA 資源後,可以透過 kubectl get hpa 命令來驗證 HPA 的狀態。這個命令會顯示建立的 HPA 資源,包括目標 CPU 使用率和當前的副本數。

監視 HPA

要檢視 HPA 的詳細資訊,可以使用 kubectl describe hpa <HPA 名稱> 命令。這個命令會顯示 HPA 的組態和當前的狀態,包括目標 CPU 使用率、當前的副本數等資訊。

更新 HPA

如果需要更新 HPA 的組態,例如改變目標 CPU 使用率或最小/最大副本數,可以使用 kubectl edit hpa <HPA 名稱> 命令。這個命令會在預設的文字編輯器中開啟 HPA 的組態檔案,允許進行修改並儲存。

刪除 HPA

如果需要刪除 HPA 和停用自動擴充套件,可以使用 kubectl delete hpa <HPA 名稱> 命令。這個命令會刪除指定的 HPA 資源,停止自動擴充套件功能。

內容解密:

在上述過程中,kubectl autoscale 命令是用來建立 HPA 資源的核心命令。透過這個命令,可以根據實際需求設定最小和最大副本數,以及目標 CPU 使用率。這個設定對於應用程式的效能和穩定性有著重要的影響。

圖表翻譯:

  graph LR
    A[建立 HPA] --> B[設定 HPA 引數]
    B --> C[驗證 HPA 狀態]
    C --> D[監視 HPA]
    D --> E[更新 HPA 組態]
    E --> F[刪除 HPA]

這個流程圖描述了建立、驗證、監視、更新和刪除 HPA 的過程,展示了自動擴充套件功能在 Kubernetes 中的實踐過程。

探索 Helm Package Manager

Helm 是一個 Kubernetes 的套件管理器,簡化了在 Kubernetes 叢集上佈署、管理和擴充套件應用程式的過程。它使用「charts」來描述一組相關的 Kubernetes 資源,讓您可以使用單一命令來佈署預先設定的應用程式。

在多雲 Kubernetes 環境中,應用程式和服務通常需要在不同的雲供應商(如 AWS、Azure、GCP 或本地資料中心)上佈署和管理。這增加了應用程式管理的複雜性,因為每個雲供應商都有自己的工具、API 和設定。Helm 在多雲 Kubernetes 環境中發揮關鍵作用,提供以下優點:

  • 簡化佈署:Helm charts 封裝了在 Kubernetes 上佈署應用程式的複雜性,讓您可以使用單一命令來佈署預先設定的應用程式。
  • 一致性:Helm 確保在不同雲供應商之間的佈署是一致的,讓您可以在任何 Kubernetes 叢集上使用相同的 Helm chart 來佈署您的應用程式。
  • 版本控制和回復:Helm 允許您版本控制您的應用程式佈署,讓您可以輕鬆升級或回復到之前的版本。
  • 重用和分享:Helm charts 可以輕鬆地被分享和重用,讓您可以利用預先建置的設定和最佳實踐。
  • 自訂:Helm charts 可以被高度自訂,讓您可以根據您的特定需求來組態應用程式佈署。
  • 生態系統整合:Helm 與 Kubernetes 生態系統中的其他工具整合,例如 CI/CD 管道、監控工具和安全解決方案,讓您可以輕鬆地佈署和管理您的應用程式。

安裝和設定 Helm

在多雲 Kubernetes 環境中佈署應用程式可能是一個複雜的任務,但使用 Helm 可以簡化這個過程。以下是您需要遵循的步驟來安裝和設定 Helm:

  1. 安裝 Helm CLI:您需要在您的本地機器上安裝 Helm CLI。您可以從 Helm 官方網站下載 Helm CLI,然後按照 README 檔案中的安裝指示進行安裝。
  2. 設定 Kubernetes 叢集:您需要確保您有多個 Kubernetes 叢集在不同的雲供應商上執行。您需要有必要的憑證,例如 kubeconfig 檔案或 API 金鑰,來存取和管理這些叢集。
  3. 組態上下文:您需要確保您的本地 Kubernetes 組態中有每個叢集的上下文設定。這通常儲存在 ~/.kube/config 檔案中。您可以使用 kubectl config use-context <context-name> 來切換不同的叢集。
  4. 安裝和組態雲供應商特定的元件:有些雲供應商可能需要額外的元件或組態來支援其特定的儲存、網路或其他服務。您需要確保這些元件已經正確地安裝和組態在您的 Kubernetes 叢集中。
  5. 建立 Helm Charts:您需要建立 Helm charts 來佈署您的應用程式。您可以從頭開始建立自己的 charts,或者自訂現有的 charts。
  6. 設定 CI/CD 管道:您需要組態 CI/CD 管道來自動化您的應用程式在多雲 Kubernetes 環境中的佈署和管理。這可以涉及工具如 Jenkins、GitLab CI/CD 或 GitHub Actions。

Helm Charts

Helm charts 是描述一組相關的 Kubernetes 資源的集合。您可以使用 Helm charts 來佈署您的應用程式,並且可以自訂 charts 來符合您的特定需求。

以下是 Helm charts 的一些關鍵特點:

  • 簡化佈署:Helm charts 封裝了在 Kubernetes 上佈署應用程式的複雜性,讓您可以使用單一命令來佈署預先設定的應用程式。
  • 重用和分享:Helm charts 可以輕鬆地被分享和重用,讓您可以利用預先建置的設定和最佳實踐。
  • 自訂:Helm charts 可以被高度自訂,讓您可以根據您的特定需求來組態應用程式佈署。

監控和記錄

為了確保多雲 Kubernetes 環境的穩定性和安全性,需要設立監控和記錄解決方案,以收集和聚合來自不同雲供應商的資料。Prometheus 是一種流行的監控工具,可以用於收集和分析應用程式的效能資料。同時,Elasticsearch、Fluentd 和 Kibana (EFK) 可以用於記錄和分析應用程式的日誌資料。

安全性

確保多雲 Kubernetes 環境的安全性是非常重要的。需要實施最佳的安全實踐,例如網路分段、根據角色的存取控制 (RBAC) 和資料加密。這些措施可以幫助防止未經授權的存取和資料洩露。

Ingress 控制器和負載平衡

Ingress 控制器和負載平衡是 Kubernetes 環境中兩個非常重要的元件。Ingress 控制器負責管理外部流量的進入和路由,確保流量被正確地分配到不同的服務。負載平衡則確保流量被均勻地分配到可用的服務,從而確保應用程式的穩定性和效能。

Ingress 控制器

Ingress 控制器是一個 Kubernetes 元件,負責監視 API 伺服器的 Ingress 資源和處理其中定義的規則。它負責管理外部存取到叢集中的服務,通常是透過路由規則來實作的。在多雲 Kubernetes 環境中,Ingress 控制器可以提供一個一致的介面來管理外部存取到應用程式,無論是在哪個雲供應商上。

Kubernetes 已成為容器協調領域的主導技術,其多雲佈署能力更是備受關注。本文深入探討了從應用程式佈署、滾動更新、自動擴充套件到 Helm Chart 使用等一系列 Kubernetes 的核心實務,並涵蓋了監控、日誌、安全以及 Ingress 控制器的關鍵環節。分析顯示,儘管 Kubernetes 簡化了容器化應用程式的佈署和管理流程,但多雲環境下的組態複雜度、安全性挑戰以及跨雲供應商的整合問題仍需仔細考量。技術限制深析指出,不同雲供應商提供的 Kubernetes 服務存在差異,需要針對特定環境進行調整和最佳化。展望未來,隨著雲原生技術的持續發展,預計將出現更多自動化工具和標準化方案,進一步降低多雲 Kubernetes 佈署的門檻。玄貓認為,企業應積極擁抱 Kubernetes 生態,並著重於提升團隊的技術能力和實務經驗,才能充分釋放 Kubernetes 的巨大潛力。