将 Spring Boot 应用程序部署到 Azure Kubernetes 服务

本教程将指导用户将 Kubernetes 和 Docker 进行结合,从而将 Spring Boot 应用程序开发和部署到 Microsoft Azure。 具体而言,将使用 Spring Boot 进行应用程序开发,使用 Kubernetes 进行容器部署,使用 Azure Kubernetes 服务 (AKS) 来托管应用程序。

KubernetesDocker 是开放源代码解决方案,可帮助开发人员自动部署、缩放和管理在容器中运行的应用程序。

先决条件

注意

由于本教程中的虚拟化要求,无法在虚拟机上执行本文中的步骤;必须使用启用了虚拟化功能的物理计算机。

创建 Docker 上的 Spring Boot 入门 Web 应用

以下步骤将指导用户构建 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

    Browse Sample App Locally

使用 Azure CLI 创建 Azure 容器注册表

  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 容器注册表。

    # set the default name for Azure Container Registry, otherwise you will need to specify the name in "az acr login"
    az config set defaults.acr=wingtiptoysregistry
    az acr login
    
  2. 使用文本编辑器(例如 VS Code)打开 pom.xml 文件,。

    code pom.xml
    
  3. pom.xml 文件中的 <properties> 集合更新为你的 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. 更新 pom.xml 文件中的 <plugins> 集合,使 <plugin> 元素包含 jib-maven-plugin 的条目,如以下示例中所示。 请注意,我们将使用 Microsoft 容器注册表 (MCR) 中的基础映像:mcr.microsoft.com/java/jdk:8-zulu-alpine,其中包含 Azure 正式支持的 JDK。 有关包含正式支持的 JDK 的其他 MCR 基础映像,请参阅 Java SE JDKJava SE JREJava SE 无头 JRE 以及 Java SE JDK 和 Maven

    <plugin>
      <artifactId>jib-maven-plugin</artifactId>
      <groupId>com.google.cloud.tools</groupId>
      <version>${jib-maven-plugin.version}</version>
      <configuration>
         <from>
             <image>mcr.microsoft.com/java/jdk:8-zulu-alpine</image>
         </from>
         <to>
             <image>${docker.image.prefix}/${project.artifactId}</image>
         </to>
      </configuration>
    </plugin>
    
  5. 导航到 Spring Boot 应用程序的完成项目目录,然后运行以下命令以生成映像并将映像推送到注册表:

    az acr login && mvn compile jib:build
    

注意

由于 Azure Cli 和 Azure 容器注册表的安全性问题,创建的az acr login凭据有效期为 1 小时。 如果看到 401 未经授权的 错误,可以再次运行 az acr login -n <your registry name> 该命令以重新进行身份验证。 如果看到 读取超时 错误,可以尝试增加超时 mvn -Djib.httpTimeout=7200000 jib:dockerBuild,或者 -Djib.httpTimeout=0 无限超时。

使用 Azure CLI 在 AKS 上创建 Kubernetes 群集

  1. 在 Azure Kubernetes 服务中创建 Kubernetes 群集。 以下命令在 wingtiptoys-kubernetes 资源组中创建 kubernetes 群集(将 wingtiptoys-akscluster 作为群集名称,附加了 Azure 容器注册表 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 Web 界面和 kubectl 管理群集。

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

将映像部署到 Kubernetes 群集

本教程使用 kubectl 部署应用,以便你可通过 Kubernetes Web 界面浏览部署。

使用 kubectl 进行部署

  1. 打开命令提示符。

  2. 使用 kubectl run 命令在 Kubernetes 群集中运行容器。 指定 Kubernetes 中应用的服务名称和完整映像名称。 例如:

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

    在此命令中:

    • 容器名称 gs-spring-boot-docker 会立即在 run 命令后指定

    • --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
    

    在此命令中:

    • 容器名称 gs-spring-boot-docker 紧跟在 expose pod 命令后指定。

    • --type 参数指定此群集使用负载均衡器。

    • --port 参数指定面向公众的 TCP 端口 80。 在此端口访问应用。

    • --target-port 参数指定内部 TCP 端口 8080。 负载均衡器在此端口将请求转发到你的应用。

  4. 将应用部署到群集后,请查询外部 IP 地址并在 Web 浏览器中打开:

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

    Browse Sample App on Azure

使用 Kubernetes 资源视图进行部署

  1. 从任何资源视图(命名空间、工作负荷、服务和流入量、存储或配置)中选择“添加”。

    Kubernetes resources view.

  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 resources view, add resource.

    部署 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 resources view, services list.

    Kubernetes resources view, services list, external endpoints highlighted.

  5. 选择“外部 IP”。 然后将看到 Spring Boot 应用程序在 Azure 上运行。

    Browse Sample App on Azure

后续步骤

若要了解有关 Spring 和 Azure 的详细信息,请继续访问“Azure 上的 Spring”文档中心。

其他资源

有关在 Azure 上使用 Spring Boot 的详细信息,请参阅以下文章:

有关如何将 Azure 与 Java 配合使用的详细信息,请参阅面向 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 命令行接口的详细信息,请在 https://kubernetes.io/docs/user-guide/kubectl/ 处参阅 kubectl 用户指南。

Kubernetes 网站中有多篇文章讨论有关在私有注册表中使用映像的信息:

有关如何使用 Azure 的自定义 Docker 映像的其他示例,请参阅使用 Linux 上 Azure Web 应用的自定义 Docker 映像

有关使用 Azure Dev Spaces 直接在 Azure Kubernetes 服务 (AKS) 中迭代运行和调试容器的详细信息,请参阅通过 Java 开始使用 Azure Dev Spaces