Docker 與 Kubernetes 協同工作



Kubernetes 和 Docker 協同工作,簡化了應用程式的部署和管理。Docker 將應用程式及其依賴項打包到一個可移植的容器中,確保在開發、暫存、測試和生產環境中保持一致的環境。接下來,Kubernetes 透過自動化來編排所有這些 Docker 容器 - 例如擴充套件、負載均衡、自我修復等任務。

Kubernetes 叢集包含執行 Docker 容器的工作節點和管理叢集狀態的主節點。透過在 YAML 檔案中定義應用程式的期望狀態,Kubernetes 持續監控部署並遵循規範,從而提供高可用性和高效的資源利用率。

在本章中,讓我們來看一個 Docker 容器和 Kubernetes 如何協同工作,使叢集的部署和管理更加輕鬆的實際示例。

準備 Java Spring Boot 應用程式包

  • 訪問 Spring Initializr - 開啟您最喜歡的 Web 瀏覽器並導航到 https://start.spring.io/
  • 選擇依賴項 - 在這裡,選擇應用程式的依賴項。對於構建簡單的 REST API,您可以選擇 Spring Web。
  • 建立專案 - 選擇“生成”,然後“下載 ZIP 檔案”。
  • 匯入專案 - 將專案匯入您最喜歡的 IDE,例如 IntelliJ IDEA 或 Eclipse。

使用 RESTController 建立 REST 端點

現在讓我們建立一個普通的 REST 控制器 -

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

   @GetMapping("/")
   public String hello() {
      return "Hello from Spring Boot!";
   }
}
Docker Working of Kubernetes 1

構建應用程式

要將應用程式打包成 JAR,請執行以下 Maven 命令 -

$ mvn clean package

生成的 JAR 檔案將放置在 target 目錄中。

其他注意事項

  • 依賴項管理 - 使用 Maven 或 Gradle 進行正確的依賴項管理,以避免在其他地方發生衝突。
  • 配置 - 使配置外部化,透過考慮將配置儲存在應用程式外部的屬性檔案甚至環境變數中。
  • 測試 - 編寫單元測試和整合測試以確保程式碼質量。

Spring Boot 應用程式打包完成後,我們就可以建立 Docker 映象了。

構建 Docker 映象

讓我們建立一個 Dockerfile 來定義 Spring Boot 應用程式構建 Docker 映象的指令。

編寫 Dockerfile

在 Spring Boot 專案的根目錄中建立一個名為 Dockerfile 的檔案。

FROM openjdk:17-jdk-alpine

WORKDIR /app

COPY target/*.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]
  • FROM openjdk:17-jdk-alpine - 這提供了基礎映象。
  • WORKDIR /app - 設定容器內的工作目錄。
  • COPY target/*.jar app.jar - 它會將 target 資料夾中建立的 jar 檔案複製到容器中的 /app 目錄。
  • ENTRYPOINT ["java", "-jar", "app.jar"] - 設定入口點命令,在執行此命令啟動容器時執行;在本例中,為 Java JAR。

您可以使用以下命令構建 Docker 映象 -

$ docker build -t my-spring-boot-app .
  • -t my-spring-boot-app - 將您的映象標記為 my-spring-boot-app。
  • . (點) - 將當前目錄指示為構建上下文。
Docker Working of Kubernetes 2

執行以下命令以驗證映象是否已成功建立 -

$ docker images
Docker Working of Kubernetes 3

新建立的映象應該在輸出中。

其他注意事項

  • 基礎映象 - 選擇滿足您的應用程式需求和效能的基礎映象。
  • 多階段構建 - 在最佳化映象大小和分離構建和執行時環境時,考慮使用多階段構建。
  • Dockerfile 最佳實踐 - 使用 Dockerfile 編寫最佳實踐來減小映象大小。

現在我們有了 Docker 映象,就可以將其部署到 Kubernetes 叢集中了。

Kubernetes 安裝和設定

要部署我們的 Spring Boot 應用程式,我們需要一個 Kubernetes 叢集。我們將瞭解如何使用 Minikube 設定本地 Kubernetes 環境。

設定 Minikube

Minikube 是一種允許您設定單節點 Kubernetes 的工具。

先決條件

  • 啟用虛擬化(例如,VirtualBox、Hyper-V)

安裝

1. 下載 Minikube 二進位制檔案 -

curl -L https://github.com/minikube/minikube/releases/latest/download/minikube-linux-amd64 > minikube
chmod +x minikube
sudo mv minikube /usr/local/bin/
Docker Working of Kubernetes 4

將 minikube-linux-amd64 替換為您作業系統的相應二進位制檔案。

2. 啟動 Minikube 叢集 -

$ minikube start
Docker Working of Kubernetes 5

安裝 kubectl

Kubectl 是一個用於控制 Kubernetes 的命令列工具。

安裝

1. 下載 Kubectl 二進位制檔案 -

curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

將 linux/amd64 替換為您作業系統的相應二進位制檔案。

2. 配置 kubectl 以使用 Minikube -

minikube config set context minikube

驗證安裝

要驗證本地 `minikube` 和使用 `kubectl` 設定的叢集,請執行 -

minikube status
kubectl cluster-info
Docker Working of Kubernetes 6

Docker Working of Kubernetes 7

這將獲取 Minikube 叢集的詳細資訊以及您環境中執行的資源。

其他注意事項

  • Kubernetes 發行版 - 建議檢查其他 Kubernetes 發行版,例如 K3s 或 MicroK8s,以滿足不同的用例。
  • 雲提供商 - 對於生產環境,雲提供商提供託管的 Kubernetes 服務,例如 Google Kubernetes Engine、Amazon EKS 和 Azure Kubernetes Service。
  • 叢集配置 - 根據您的資源限制和需求自定義 Minikube 配置。

最後,安裝了 Minikube 和 kubectl 後,我們就可以開始編寫必要的 YAML 配置來部署應用程式了。

設定 Kubernetes 叢集

以下是關鍵 Kubernetes 元件 -

  • 主節點 - 控制叢集並管理工作節點。
  • 工作節點 - 執行容器化應用程式。
  • Pod - Kubernetes 中最小的可部署單元,包含一個或多個容器。
  • Deployment - 管理 Pod 副本的期望狀態。
  • Service - 將 Pod 上執行的應用程式公開為網路服務。

檢查叢集狀態

您可以使用以下命令來驗證 Minikube 叢集是否正在正確執行 -

$ kubectl cluster-info

上述命令的結果將顯示有關叢集的資訊,其中包含 Kubernetes 版本和主節點地址。

檢查節點狀態

要檢視叢集中的節點,您可以使用以下命令 -

$ kubectl get nodes
Docker Working of Kubernetes 8

您將看到列出的單個節點,即 Minikube 節點。

其他注意事項

  • 叢集大小 - 對於生產環境,請根據工作負載確定最佳節點數量。
  • 節點資源 - 您應該配置節點資源(CPU、記憶體)以匹配應用程式的需求。
  • 網路配置 - 請確保節點與外部環境之間具有正確的網路連線。

現在我們準備為應用程式建立 YAML 配置了。

編寫 YAML 配置

您需要一個 YAML 配置檔案才能在 Kubernetes 上部署 Spring Boot 應用程式。您可以在此檔案中定義應用程式所需的資源,例如部署和服務。

部署配置

Kubernetes 中的 Deployment 管理一組相同的 Pod。以下是一個 YAML 檔案示例,用於定義應用程式的 Deployment -

apiVersion: apps/v1
kind: Deployment
metadata:
   name: my-spring-boot-app
spec:
   replicas: 3
   selector:
      matchLabels:
         app: my-spring-boot-app
   template:
      metadata:
         labels:
            app: my-spring-boot-app
      spec:
         containers:
         - name: my-spring-boot-app
            image: my-spring-boot-app:latest
            ports:
            - containerPort: 8080
  • replicas - 指定 Pod 例項的數量。
  • matchLabels - 確保 Deployment 管理正確的 Pod。
  • image - 指向我們之前構建的 Docker 映象。
  • containerPort - 定義應用程式在容器內偵聽的埠。

服務配置

Service 將您的應用程式公開到網路。以下是一個 Service YAML 檔案示例 -

apiVersion: v1
kind: Service
metadata:
   name: my-spring-boot-app-service
spec:
   type: NodePort
   selector:
      app: my-spring-boot-app
   ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
  • type - NodePort 在每個節點的 IP 上的靜態埠上公開服務。
  • port - 服務公開的埠。
  • targetPort - Service 將轉發流量到的 Pod 上的埠。

應用配置

要部署應用程式,您可以使用 kubectl 應用這些配置 -

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

驗證部署

要檢查 Pod 和服務的狀況,您可以使用以下命令 -

kubectl get pods
kubectl get services

您將看到您的應用程式正在執行,並且服務將其公開。

訪問應用程式

要訪問您的應用程式,您可以使用 Minikube IP 和分配給服務的 NodePort -

$ minikube service my-spring-boot-app-service

執行此命令將開啟瀏覽器並訪問服務 URL。

其他注意事項

  • 擴充套件 − 應始終根據流量調整 Deployment YAML 檔案中副本的數量以處理更多負載。
  • 安全 − 考慮新增安全上下文和網路策略。
  • 監控 − 在生產應用中,應實施 Prometheus 和 Grafana 等監控解決方案以實現可觀測性。

透過這些配置,您已成功在 Kubernetes 叢集上部署了 Spring Boot 應用程式。

結論

換句話說,將 Docker 整合到 Kubernetes 中提供了一種有效的方式來部署和管理應用程式。Docker 容器確保了所有開發階段的環境一致性,而 Kubernetes 自動編排這些容器以實現可擴充套件性、高可用性和最佳資源利用率。使用 YAML 配置本地化 Minikube 環境,將使開發人員的工作流程變得簡單,並輕鬆部署和維護強大的應用程式。

Docker 與 Kubernetes 協作的常見問題

1. Docker 和 Kubernetes 之間有什麼區別?

Docker 是一種用於構建、執行和管理容器的軟體。它主要用於將應用程式及其依賴項安裝到稱為容器的標準包中。另一方面,Kubernetes 也是一個編排平臺,負責處理在多個主機上執行的應用程式的自動部署或擴充套件等操作。由於 Docker 圍繞單個容器執行,而 Kubernetes 則處理靜態容器集的實現、擴充套件和管理。

2. Kubernetes 如何編排容器?

Kubernetes 透過包含 Pod、Deployment、Service 等資源範圍來編排容器。Pod 被歸類為共享資源的容器組。Deployment 負責管理 Pod 副本的期望狀態,而 Service 則為一組 Pod 維持穩定的網路端點。Kubernetes 會根據配置自動處理容器生命週期、負載均衡或擴充套件。

廣告

© . All rights reserved.