教程:将应用程序部署到 minikube 集群
在本教程中,将了解如何直接从 IntelliJ IDEA 使用 minikube 启动本地 Kubernetes 集群,并将示例应用程序部署到该集群。 在此过程中,将构建应用程序、创建 Docker 镜像,并将其部署到 minikube。
在本地运行 Kubernetes 对于原型设计、测试部署以及学习 Kubernetes 工作流尤其有用。 借助 IntelliJ IDEA 中提供的 Docker 和 Kubernetes 支持,可以在不离开 IDE 的情况下启动集群、部署资源并检查应用程序。
开始之前
开始之前,请确保已安装并配置以下项:
启用必需插件
本教程中使用的功能性依赖于以下插件:
这些插件默认在 IntelliJ IDEA 中捆绑并启用。 如果相关功能不可用,请确保未禁用任何插件。
按 Ctrl+Alt+S 打开设置,然后选择 。
找到所需插件并将其开启。
克隆示例项目
要开始,请从 GitHub 克隆 Spring PetClinic 应用程序,或者如果本机上已有该项目,则在 IntelliJ IDEA 中打开它。
该应用程序的源代码托管在 GitHub 上,地址为 https://github.com/spring-projects/spring-petclinic。
在主菜单中,前往 。
指定仓库的 URL,然后点击 克隆。
在 打开或导入项目 对话框中,选择 Gradle 项目 以使用 Gradle 作为项目的主要构建系统。
如有必要,请同意在新窗口中打开克隆的项目。
构建应用程序
在将应用程序部署到 Kubernetes 之前,需要构建它并将其打包到容器镜像中。 在本教程中,将使用 Gradle 任务编译应用程序源代码、运行测试,并生成一个 JAR 可执行文件。 此 JAR 文件稍后将在创建 Docker 镜像时使用。
打开 Gradle 工具窗口。
展开项目节点 ( spring-petclinic ),然后展开 任务 节点,并点击 构建 任务两次以运行它。

等待 IntelliJ IDEA 完成任务。 因此,IDE 会在项目根目录中创建包含工件的 构建 目录。

将应用程序容器化
在此步骤中,将把构建的应用程序打包到 Docker 镜像中。 Kubernetes 稍后会将此镜像作为 Pod 中的容器运行。
创建 Dockerfile
在 项目 工具窗口 Alt+1 中,右键点击项目根目录,指向 新建 ,然后点击 文件。
在 新建文件… 对话框中,输入 Dockerfile 并按 Enter。
如出现提示,请同意将该文件添加到 Git。
请将以下代码粘贴到新的 Dockerfile 中:
FROM eclipse-temurin:17-jre WORKDIR /app COPY build/libs/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
创建的 Dockerfile 包含用于构建 Docker 镜像的指令,该镜像基于 eclipse-temurin:17-jre 镜像,后者提供轻量级 Java 17 运行时环境。
构建镜像时,Docker 会将 Gradle 构建生成的 JAR 可执行文件从项目的 build/libs 目录复制到容器内的 /app 目录。
从镜像启动容器时,Docker 会运行 java -jar app.jar 命令,该命令会启动 Spring Petclinic 应用程序。
构建 Docker 镜像
在 Dockerfile 内侧边栏中,点击
并选择 新建运行配置。

在 编辑运行配置 对话框中,在 镜像标记 字段中指定
petclinic-app,并在 容器名称 字段中指定petclinic。 然后,点击 运行。
IntelliJ IDEA 创建一个 Dockerfile 运行配置 ,该配置从 Dockerfile 构建一个镜像,然后基于该镜像运行一个容器。 要跟踪整个过程,请打开 服务 工具窗口中的 日志 选项卡。

连接到 minikube
现在已有包含应用程序的 Docker 镜像,需要启动本地 Kubernetes 集群以将其部署到该集群。 将使用 minikube 直接从 IntelliJ IDEA 运行本地单节点 Kubernetes 集群。
使用 Docker 驱动程序启动 minikube
打开 终端 工具窗口:转到 或按 Alt+F12。
运行以下命令以启动本地 Kubernetes 集群,并指示 minikube 使用 Docker 作为虚拟化驱动程序:
minikube start --driver=docker使用以下命令验证集群是否已启动并正在运行:
minikube status
使用 Docker 驱动程序会在 Docker 容器内运行 minikube 集群,提供非常适合本地开发的轻量级环境。
将 minikube 集群添加到 IntelliJ IDEA
打开 服务 工具窗口:转到 或按 Alt+8。
选择 Kubernetes 节点,点击 添加集群 按钮,然后从上下文菜单中选择 来自默认目录。

在 添加集群 对话框中,选择 minikube 并点击 添加集群。
添加的集群将在 服务 工具窗口中可用。
在 服务 工具窗口中,右键点击 minikube 集群并选择 连接集群。

此时,IntelliJ IDEA 已连接到正在运行的 minikube 集群,并可以显示其 Kubernetes 资源。 可以直接从 服务 工具窗口浏览命名空间、节点和其他集群对象。
部署应用程序
在本教程前面,已经 在本地构建了应用程序镜像。 但是,minikube 集群无法自动访问本地 Docker 守护进程中的镜像。 需要将镜像加载到 minikube,使其可用。
将 Docker 镜像加载到 minikube
打开 终端 工具窗口:转到 或按 Alt+F12。
运行以下命令以在 minikube 中构建容器镜像:
minikube image load petclinic-app通过运行以下命令,验证
petclinic-app镜像在集群中可用:minikube image ls | grep petclinic-app应在输出中看到
docker.io/library/petclinic-app:latest。
现在镜像已在 minikube 中可用,下一步是描述 Kubernetes 将如何运行它。 让我们创建两个 Kubernetes 清单:
部署,有助于你在 Pod 中运行容器
Service,用于暴露应用,使你能够从本地访问它。
创建部署清单
在 项目 工具窗口 (Alt+1) 中,右键点击项目名称并选择 。
在 新建 Kubernetes 资源 对话框中,选择 部署 文件类型,指定
petclinic-deployment作为清单名称,然后按 Enter。
如出现提示,请同意将该文件添加到 Git。
将生成的 petclinic-deployment.yaml 文件的内容替换为以下代码:
apiVersion: apps/v1 kind: Deployment metadata: name: petclinic spec: replicas: 1 selector: matchLabels: app: petclinic template: metadata: labels: app: petclinic spec: containers: - name: petclinic image: petclinic-app:latest imagePullPolicy: IfNotPresent ports: - containerPort: 8080在 浮动工具栏上,选择当前集群和命名空间,然后点击
应用 以将更改交付到本地集群。

创建 Service 清单
在 项目 工具窗口 (Alt+1) 中,右键点击项目名称并选择 。
在 新建 Kubernetes 资源 对话框中,选择 服务 文件类型,指定
petclinic-service作为清单名称,然后按 Enter。如出现提示,请同意将该文件添加到 Git。
将生成的 petclinic-service.yaml 文件的内容替换为以下代码:
apiVersion: v1 kind: Service metadata: name: petclinic spec: type: NodePort selector: app: petclinic ports: - port: 8080 targetPort: 8080在 浮动工具栏上,选择当前集群和命名空间,然后点击
应用 以将更改交付到本地集群。
访问应用程序
在编辑器中打开 petclinic-deployment.yaml 文件。
点击
- containerPort: 8080属性旁边的 转发端口 嵌入提示。
在 转发端口 对话框中,保留默认值并点击 前进。
在 petclinic-deployment.yaml 文件中,点击 在浏览器中打开 嵌入提示。

IntelliJ IDEA 会重定向到默认浏览器,可在其中检查部署在本地 minikube 集群中的 Spring Petclinic 应用程序。
已了解如何使用 minikube 和 IntelliJ IDEA 将 Spring 应用程序部署到本地 Kubernetes 集群。 这种方法可启用对 Kubernetes 的快速本地测试和试验,而无需远程集群。
后续步骤
通过以下主题了解如何使用 Kubernetes:
完整教程列表请参阅 IntelliJ IDEA 教程。