使用 Jetbrains IDEA 在 OpenShift 中实时比较和更新 Quarkus 部署
先决条件
IntelliJ Kubernetes 插件
本文将展示 Jetbrains IDEA 的Kubernetes 插件在将 Quarkus 应用部署到 OpenShift 时是多么出色的伴侣。要在 Jetbrains IDEA 中安装该插件,请导航至 Settings,转到 Plugins 部分,然后搜索“Kubernetes by Red Hat”以启动安装过程。
通过使用该插件,您的 IDEA 界面左侧将出现一个额外的工具窗口。该窗口显示了您在 ~/.kube/config 中的 Kubernetes 配置中指定的 Kubernetes 集群。如果您尚未定义任何集群,列表将为空。
为 OpenShift 准备您的 Quarkus 应用程序
成功安装 IDEA 的 Kubernetes 插件后,我们现在可以继续准备源代码以部署到 OpenShift。您可以从 GitHub 获取源代码,使用您现有的源代码,或从头开始创建一个新的 Quarkus 应用程序。
-
假设您有自己的源代码,我们需要准备它以在 OpenShift 上部署。Quarkus 提供了许多扩展来完成大部分工作。我们需要 OpenShift 扩展和 jib 扩展。您可以使用 Quarkus 命令行启用它们,或手动将它们添加到您的 pom 文件中。
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-openshift</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-container-image-jib</artifactId>
</dependency>
-
如果您想从头开始生成 Quarkus 应用,您可以使用 quarkus 命令行实用程序来为您配置这些。
quarkus create app org.acme:openshift-quickstart \
--extension='resteasy-reactive,openshift,quarkus-container-image-jib'
-
现在您的源代码已准备就绪,您可以在 Jetbrains IDEA 中打开它,然后继续进行部署步骤。
将镜像发布到 Docker Hub
Quarkus 命令行工具生成的项目在 src/main/docker/Dockerfile.jvm 目录中包含一个 Dockerfile。如果您决定使用自己的源代码,可以轻松地从提供的 GitHub 存储库(包含示例源代码)中复制 Dockerfile。
Dockerfile 用于生成 Docker 镜像,OpenShift(或 Kubernetes)使用该镜像来运行您的应用程序。为了让 OpenShift 能够访问和使用该镜像,它需要存储在 Docker 注册表中。
虽然大多数 OpenShift 或 Kubernetes 安装都提供自己的 Docker 注册表,但 Red Hat Developer Sandbox 没有。因此,我们将为此目的使用 Docker Hub。为此,我们将配置构建过程以将镜像推送到 Docker Hub。尽管可以通过命令行指定这些设置,但为了简单起见,我们将使用 src/main/resources/application.properties 文件。
提示 |
---|
我们将 Docker 镜像推送到 Docker Hub。因此,我们需要通过 quarkus.container-image.group 提供我们的帐户 ID。 |
quarkus.container-image.build=true
quarkus.openshift.jvm-dockerfile=src/main/Dockerfile.jvm
quarkus.container-image.builder=jib
quarkus.container-image.push=true
quarkus.container-image.group=<your Docker Hub account> # use your Docker Hub account
quarkus.container-image.name=openshift-quickstart
quarkus.openshift.route.expose=true
首先,我们指示 Maven 构建来构建 Docker 镜像。
quarkus.container-image.build=true
然后,我们将构建指向我们的 Docker 文件。
quarkus.openshift.jvm-dockerfile=src/main/Dockerfile.jvm
此外,我们告诉 Maven 使用 jib 扩展来创建 Docker 镜像。
quarkus.container-image.builder=jib
我们还指示构建将 Docker 镜像推送到注册表。请为此设置使用您的 Docker Hub 帐户。
quarkus.container-image.push=true
我们提供我们在 Docker Hub 上的帐户。
quarkus.container-image.group=<your Docker Hub account> # use your Docker Hub account
我们配置最终 Docker 镜像的名称以便于识别。
quarkus.container-image.name=openshift-quickstart
最后,我们指示构建创建一个 Route,以便应用程序可以从互联网访问。
quarkus.openshift.route.expose=true
成功设置构建配置后,我们现在可以执行构建过程了。只需运行 Maven package 命令即可将应用程序打包成 JAR 文件,使用 JAR 创建 Docker 镜像,并将镜像推送到 Docker Hub。要启动构建,请找到 IDEA 右侧的 Maven 工具箱,然后双击 package 命令。
或者,您也可以在命令行上启动 Maven
./mvnw clean package
在构建过程中,您将看到上述所有步骤在输出中执行。
[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] LogEvent [level=INFO, message=trying docker-credential-desktop for registry.hub.docker.com] [INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Using base image with digest: sha256:f921cf1f9147e4b306908f3bcb61dd215b4a51970f8db560ede02ee6a492fa99 [INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] LogEvent [level=LIFECYCLE, message=Using credentials from Docker config (/Users/andredietisheim/.docker/config.json) for adietish/openshift-quickstart:1.0.0-SNAPSHOT] [INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Container entrypoint set to [java, -Djava.util.logging.manager=org.jboss.logmanager.LogManager, -jar, quarkus-run.jar] [INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] Pushed container image adietish/openshift-quickstart:1.0.0-SNAPSHOT (sha256:bfba9dd104b363e828a61bde800cd2299fae8b65fc9a5ffcd4c322061b3a8c0e)
获取您的免费 Red Hat Developer Sandbox
接下来,让我们关注我们打算部署到的集群。Red Hat 为有兴趣探索其功能的个人提供了免费的 OpenShift 集群。要获取您自己的集群,只需访问 https://developers.redhat.com/developer-sandbox 并请求一个实例。完成快速简单的注册过程后,您可以启动集群并访问其 Web 控制台。在控制台中,您的用户名将显示在标题的右上角。单击它将显示一个菜单,其中有一个名为“复制登录命令”的选项。通过选择此选项,您将把 Red Hat Developer Sandbox 配置为当前集群,并存储一个本地可访问的令牌用于身份验证。
现在复制、粘贴并将此命令在您的终端 shell 中运行。
oc login --token=sha256~XXXXXXXXXXXXXXXX --server=https://api.sandbox-m3.1530.p1.openshiftapps.com:6443
提示 |
---|
如果您已经有 Red Hat Developer Sandbox,很可能您的令牌已过期。当无法列出项目时,您会注意到这一点。 |
IntelliJ Kubernetes 是您的朋友
在 IntelliJ 中,您可以导航到 Kubernetes 工具窗口,在那里您会发现 Red Hat Developer Sandbox 已设置为活动集群。通过展开集群,您可以探索各种资源类别,这些类别显示了您集群中的现有资源。例如,您可以查看您当前的项目或命名空间。需要注意的是,通过插件执行的任何操作都将在该项目的上下文中执行,并且更改会立即可见。无需手动刷新。
创建集群资源
执行 Maven 构建后,会在 target/kubernetes 目录中生成一个文件。该文件包含了部署应用程序所需的 OpenShift 资源。这是由 Quarkus Kubernetes 扩展完成的。Intellij 插件使用此文件,因此您可以同时用于自动化和通过 IDE。
如果您打开此文件,您可以了解应用程序是如何部署的。该文件包含以下 OpenShift 资源
-
DeploymentConfig
-
ImageStream
-
Service
-
Route
DeploymentConfig 将负责创建 Pod,Pod 是运行托管您应用程序的容器的环境。这些容器将使用您已构建并发布到 Docker Hub 的 Docker 镜像。
kind: DeploymentConfig
...
image: openshift-quickstart:1.0.0-SNAPSHOT
为了使 Docker 镜像可供集群访问,将使用 ImageStream。此 ImageStream 被配置为引用存储在 Docker Hub 上的镜像。
kind: ImageStream
...
dockerImageRepository: docker.io/adietish/openshift-quickstart
为了在集群中公开您的应用程序,将使用 Service。此 Service 负责将容器端口映射到集群内部可访问的端口。
kind: Service
...
- name: https
port: 443
protocol: TCP
targetPort: 8443
最后,将使用 Route 将 Service 公开到互联网,使您的应用程序可以从外部源访问。
kind: Route
...
port:
targetPort: http
to:
kind: Service
name: openshift-quickstart
要部署您的应用程序,只需在集群上创建这些资源。编辑器将提示您将文件推送到集群并生成必要的资源。或者,您可以使用工具栏最左侧的第一个图标“push”图标。
Kubernetes 工具箱窗口中的资源树是高度动态的,会持续反映集群资源的存在和缺失。当您推送资源文件时,相应的资源会在集群上创建,并立即出现在资源树中。我们当前正在交互的特定资源可以在资源树的 Workloads 和 Network 类别下找到。
资源树中的 Pod 由显示红色或绿色点的图标表示。绿色点表示 Pod 当前正在运行,而红色点表示 Pod 正在初始化或终止过程中。通过展开树中的 Pod,可以显示更多信息,包括其内部集群 IP 和其容器的状态。在提供的截图中,Pod 包含一个当前正在运行的容器。
浏览应用程序
为了通过浏览器访问应用程序,我们需要其 URL。在我们的配置中,我们让 OpenShift 为我们生成主机名。这是通过将 Route 配置为主机值为空或不存在来实现的。
kind: Route
...
host: ""
因此,我们有必要确定集群生成的 hostname。要做到这一点,我们可以利用编辑器中提供的 Diff 功能,它显示了我们文件中的资源与集群中当前存在的资源之间的差异。
单击工具栏中的 Diff 操作将打开一个拆分对话框。对话框的左侧显示本地文件,而右侧显示集群中当前存在的资源。此时,您可以搜索主机值,找到后进行复制。
现在您可以将其粘贴到浏览器中,查看我们的应用程序在查询时显示的 Quarkus 框架页面。该页面显示应用程序在 /hello 处有一个 REST 服务。
点击 hello-link,您就可以看到此服务的响应。
Quarkus,请记录所有内容
Quarkus 框架会记录至少 INFO 级别的任何事件。要更改这一点,我们可以通过 application.properties 中的 配置 quarkus.log.level 属性。或者,也可以通过环境变量设置。当您部署到 OpenShift 或 Kubernetes 集群时,这一点尤其有用。在 OpenShift 中,DeploymentConfig 允许您为其 Pod 设置环境。在您的 openshift.yml 文件中,您会发现一个环境变量。它将 KUBERNETES_NAMESPACE 环境变量设置为您的命名空间名称。我们可以添加我们的属性并配置 quarkus 日志级别。转到 DeploymentConfig > template > spec > containers > env 并添加以下内容
- name: QUARKUS_LOG_LEVEL
value: ALL
编辑器会持续监控您的修改,并在资源更改后提醒您推送。虽然通常可以继续将更改推送到集群,但我们建议先删除现有的 DeploymentConfig,然后再推送更新后的版本。在修改环境变量时尤其重要,因为“正在运行”的 DeploymentConfig 不会受到更改的影响,导致 Pod 没有更新的环境变量。因此,请使用 DeploymentConfig 上下文菜单中提供的“Delete”选项。
然后,插件会通知您 DeploymentConfig 已成功删除。
编辑器然后会提示您推送并重新创建它。
删除现有的 DeploymentConfig 会终止现有的 Pod。它们从资源树中消失了。当您重新创建它时,新的 Pod 会被创建。当它们被生成时,它们也重新出现。该树是完全动态的,并反映了资源更改的发生。
跟踪日志
现在我们已经告诉 quarkus 记录所有内容,我们可以验证我们的更改是否有效。我们可以从新 Pod 的上下文菜单中选择 Follow Log。
这会在 IDE 的下半部分显示 Log 控制台。它会按接收顺序打印日志条目。
您可以看到 quarkus 应用程序正在记录从 FATAL 到 TRACE 的所有事件。默认情况下,Quarkus 应用仅记录 INFO 及以上级别的日志。我们添加的环境变量导致了更精细日志的发生。
日志控制台被分成两半。右侧显示日志,左侧显示容器。我们的 Pod 只包含一个容器,因此我们只看到一个条目。由多个容器组成的 Pod 会列出这些容器,包括 init 容器。然后,您可以访问其中任何一个的终端,并通过单击列出的容器在它们之间切换。
终端
当然,我们也可以在终端中验证环境是否按照 DeploymentConfig 中的定义设置。为此,我们可以从 Pod 的上下文菜单中选择 Terminal。
在命令提示符下,我们可以 echo 我们的环境变量,并查看我们在资源文件中配置的值。
结论
在本文中,我们演示了将 Quarkus 应用程序部署到 OpenShift 集群的过程,特别是免费的 Red Hat Developer Sandbox。我们强调了我们的 Jetbrains IDEA 的 Kubernetes 插件在促进此任务中的作用。
+ 使用编辑器,您可以轻松创建和更新应用程序部署所需的资源。动态资源树提供对这些资源的实时可见性,因为它们被创建。通过使用编辑器中的 diff 功能,您可以观察集群在创建过程中如何操作您的资源,从而使您能够识别重要详细信息,例如生成的 hostname。最后,我们展示了该插件的其他功能,包括监控应用程序日志和访问正在运行的容器内的终端 shell 的能力。
如果您喜欢这篇博文并尝试了我们的插件,请在我们的 GitHub 页面上告诉我们有关错误和缺失功能的反馈。我们很乐意听到您的声音 ❤️