Deploy Spring Boot application to Azure Kubernetes Service

注意

對於 Spring Boot 應用程式,請使用 Azure 容器應用程式。 不過,您仍可使用 Azure Kubernetes Service 作為目的地。 如需詳細資訊,請參閱 為 Java 應用程式選擇正確的 Azure 服務。

這個教學會教你如何使用 Kubernetes 和 Docker 來開發並部署 Spring Boot 應用程式到 Microsoft Azure。 更具體來說,您會使用 Spring Boot 進行應用程式開發、Kubernetes 進行容器部署,以及 Azure Kubernetes Service (AKS) 來裝載您的應用程式。

Kubernetes 和 Docker 是開放原始碼解決方案,可協助開發人員自動化其容器中執行之應用程式的部署、調整和管理。

先決條件

注意

由於本教學的虛擬化需求,你無法在虛擬機上依照本文的步驟操作。 你必須使用啟用虛擬化功能的實體電腦。

在 Docker 使用者入門 Web 應用程式上建立 Spring Boot

下列步驟會逐步引導您建置 Spring Boot Web 應用程式,並在本機進行測試。

  1. 打開命令提示字元,建立一個本地目錄來存放你的應用程式,然後切換到該目錄;例如:

    mkdir C:\SpringBoot
    cd C:\SpringBoot
    

    --或--

    mkdir /users/$USER/SpringBoot
    cd /users/$USER/SpringBoot
    
  2. 將 Docker 快速入門上的 Spring Boot 範例項目複製到 目錄中。

    git clone https://github.com/spring-guides/gs-spring-boot-docker.git
    
  3. 將目錄變更為已完成的專案。

    cd gs-spring-boot-docker
    cd complete
    
  4. 使用 Maven 建置並執行範例應用程式。

    mvn package spring-boot:run
    
  5. 瀏覽至 http://localhost:8080,或使用下列 curl 命令測試 Web 應用程式:

    curl http://localhost:8080
    
  6. 你會看到以下訊息顯示: Hello Docker World

    在本機瀏覽範例應用程式

使用 Azure CLI 建立 Azure Container Registry

  1. 開啟命令提示字元。

  2. 登入您的 Azure 帳戶:

    az login
    
  3. 選擇您的 Azure 訂閱:

    az account set -s <YourSubscriptionID>
    
  4. 為本教學課程中使用的 Azure 資源建立資源群組。

    az group create --name=wingtiptoys-kubernetes --location=eastus
    
  5. 在資源群組中建立私人 Azure 容器登錄。 本教學課程會在後續步驟中將範例應用程式作為 Docker 映像檔推送至此登錄。 以登錄的唯一名稱取代 wingtiptoysregistry。

    az acr create --resource-group wingtiptoys-kubernetes --location eastus \
     --name wingtiptoysregistry --sku Basic
    

透過 Jib 將您的應用程式推送至容器登錄

  1. 從 Azure CLI 登入你的 Azure Container Registry。

    # set the default name for Azure Container Registry, otherwise you need to specify the name in "az acr login"
    az config set defaults.acr=wingtiptoysregistry
    az acr login
    
  2. 使用文字編輯器(如 Visual Studio Code)開啟 pom.xml 檔案。

    code pom.xml
    
  3. 將 <properties> 集合更新於 pom.xml 檔案中,並將你的 Azure 容器註冊表名稱和最新版本的 jib-maven-plugin 一同更新。

    <properties>
       <!-- Note: If your ACR name contains upper case characters, be sure to convert them to lower case characters. -->
       <docker.image.prefix>wingtiptoysregistry.azurecr.io</docker.image.prefix>
       <jib-maven-plugin.version>2.5.2</jib-maven-plugin.version>
       <java.version>1.8</java.version>
    </properties>
    
  4. 更新 <plugins> 檔案中的 集合,讓 <plugin> 元素包含 jib-maven-plugin的條目,如下列範例所示。 請使用來自 Microsoft 容器登錄檔(MCR)的基礎映像:mcr.microsoft.com/openjdk/jdk:11-ubuntu,其中包含官方支援的 Azure JDK。 如需了解其他具有官方支援 JDK 的 MCR 基礎映像,請參見 安裝 Microsoft Build of OpenJDK。

    <plugin>
      <artifactId>jib-maven-plugin</artifactId>
      <groupId>com.google.cloud.tools</groupId>
      <version>${jib-maven-plugin.version}</version>
      <configuration>
         <from>
             <image>mcr.microsoft.com/openjdk/jdk:11-ubuntu</image>
         </from>
         <to>
             <image>${docker.image.prefix}/gs-spring-boot-docker</image>
         </to>
      </configuration>
    </plugin>
    
  5. 前往 Spring Boot 應用程式已完成的專案目錄,執行以下指令建立映像檔並將映像推送到登錄檔:

    az acr login && mvn compile jib:build
    

注意

出於安全考量,你所建立 az acr login 的憑證有效期為一小時。 如果看到錯誤 401 Unauthorized ,再執行 az acr login --name <your registry name> 一次指令重新驗證。 如果您看到 Read timed out 錯誤,請嘗試使用 mvn -Djib.httpTimeout=7200000 jib:dockerBuild 增加逾時時間,或使用 -Djib.httpTimeout=0 將逾時時間設為無限。

使用 Azure CLI 在 AKS 上建立 Kubernetes 叢集

  1. 在 Azure Kubernetes Service 中建立 Kubernetes 叢集。 下列命令會在 wingtiptoys-kubernetes 資源群組中建立一個 Kubernetes 叢集,並以 wingtiptoys-akscluster 作為叢集名稱、附加 Azure Container Registry (ACR) wingtiptoysregistry,以及以 wingtiptoys-kubernetes 作為 DNS 前綴:

    az aks create --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster \
     --attach-acr wingtiptoysregistry \
     --dns-name-prefix=wingtiptoys-kubernetes --generate-ssh-keys
    

    此命令可能需要一些時間才能完成。

  2. 使用 Azure CLI 安裝 kubectl。 Linux 使用者可能需要在此指令前加上 sudo ,因為它會部署 Kubernetes CLI 到 /usr/local/bin。

    az aks install-cli
    
  3. 下載叢集配置資訊,以便您可以通過 Kubernetes 網頁介面和 kubectl管理叢集。

    az aks get-credentials --resource-group=wingtiptoys-kubernetes --name=wingtiptoys-akscluster
    

將映像部署至 Kubernetes 叢集

這個教學會用 kubectl,然後你就可以透過 Kubernetes 網頁介面來部署應用程式。

使用 kubectl 部署

  1. 開啟命令提示字元。

  2. 使用 kubectl run 命令,在 Kubernetes 叢集中執行您的容器。 在 Kubernetes 中為您的應用程式命名服務名稱及完整的圖像名稱。 例如:

    kubectl run gs-spring-boot-docker --image=wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest
    

    在此命令中:

    • 你在指令run後立即指定容器名稱gs-spring-boot-docker。

    • 該 --image 參數指定合併的登入伺服器與影像名稱為 wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest。

  3. 使用 kubectl expose 命令,在外部公開 Kubernetes 叢集。 指定您的服務名稱、用來存取應用程式的公開 TCP 連接埠,以及應用程式接聽的內部目標埠。 例如:

    kubectl expose pod gs-spring-boot-docker --type=LoadBalancer --port=80 --target-port=8080
    

    在此命令中:

    • 你在指令expose pod後立即指定容器名稱gs-spring-boot-docker。

    • --type 參數會指定叢集使用負載平衡器。

    • --port 參數會指定 80 的公用 TCP 連接埠。 您可以在此埠上存取應用程式。

    • --target-port 參數會指定 8080 的內部 TCP 連接埠。 負載平衡器會將要求轉送至此埠上的應用程式。

  4. 部署應用程式到叢集後,查詢外部 IP 位址並在瀏覽器中開啟:

kubectl get services -o=jsonpath='{.items[*].status.loadBalancer.ingress[0].ip}'

在 Azure 上瀏覽範例應用程式

使用 Kubernetes 資源檢視進行部署

  1. 從任何資源檢視中選取 [新增](命名空間、工作負載、服務和輸入、儲存裝置或組態)。

    Kubernetes 資源視圖。

  2. 將下列 YAML 貼入:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: gs-spring-boot-docker
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: gs-spring-boot-docker
      template:
        metadata:
          labels:
            app: gs-spring-boot-docker
        spec:
          containers:
          - name: gs-spring-boot-docker
            image: wingtiptoysregistry.azurecr.io/gs-spring-boot-docker:latest
    
  3. 選取 ,然後在 YAML 編輯器底部選擇 [新增],以部署應用程式。

    Kubernetes 資源檢視,請新增資源。

    部署 Deployment後,就像前一步一樣,請在 YAML 編輯器底部選擇 「新增 」,並使用以下 YAML 進行部署 Service :

    apiVersion: v1
    kind: Service
    metadata:
      name: gs-spring-boot-docker
    spec:
      type: LoadBalancer
      ports:
      - port: 80
        targetPort: 8080
      selector:
        app: gs-spring-boot-docker
    
  4. 一旦你加入 YAML 檔案,資源檢視器就會顯示你的 Spring Boot 應用程式。 外部服務包含連結的外部IP位址,讓您可以輕鬆地在瀏覽器中檢視應用程式。

    Kubernetes 資源檢視、服務清單。

    Kubernetes 資源檢視、服務清單、已醒目提示的外部端點。

  5. 選取 [外部IP]。 你會看到你的 Spring Boot 應用程式在 Azure 上運行。

    在 Azure 上瀏覽範例應用程式

後續步驟

若要深入瞭解 Spring 和 Azure,請繼續前往 Azure 上的 Spring 檔中心。

另請參閱

如需在 Azure 上使用 Spring Boot 的詳細資訊,請參閱下列文章:

如需搭配 Java 使用 Azure 的詳細資訊,請參閱 適用於 Java 開發人員的 Azure,以及 使用 Azure DevOps 和 Java。

如需使用 Visual Studio Code 將 Java 應用程式部署至 Kubernetes 的詳細資訊,請參閱 Visual Studio Code Java 教學課程。

如需 Docker 上 Spring Boot 範例項目的詳細資訊,請參閱 Docker 快速入門上的 Spring Boot。

以下連結提供更多關於建立 Spring Boot 應用程式的資訊:

  • 如需建立簡單 Spring Boot 應用程式的詳細資訊,請參閱 https://start.spring.io/的 Spring Initializr。

以下連結提供更多關於使用 Kubernetes 與 Azure 的相關資訊:

欲了解更多使用 Kubernetes 命令列介面的資訊,請參閱 kubectl 使用者指南。https://kubernetes.io/docs/reference/kubectl/

Kubernetes 網站有數篇文章,討論如何在私人鏡像庫中使用鏡像:

想了解更多如何在 Azure 使用自訂 Docker 映像的範例,請參見「在 Linux 上為 Azure Web App 使用自訂 Docker 映像」。

如需進一步了解如何使用 Java 搭配 Azure Dev Spaces,直接在 Azure Kubernetes Service (AKS) 中反覆執行及偵錯容器,請參閱使用 Java 開始使用 Azure Dev Spaces。