应用程序部署:从Kubernetes到Fly.io
1. 部署应用到Kubernetes
1.1 创建集群配置清单
集群配置清单是Kubernetes用于为应用程序生成所需资源的文件,通常是YAML文件,包含Kubernetes对象的声明性描述。编写和维护这些文件需要对不同的Kubernetes对象有深入了解,不过Eclipse JKube可以帮助我们创建这些文件,并提供了一些默认配置。
由于应用有特殊需求,如连接PostgreSQL数据库,我们需要对默认配置进行一些调整。Eclipse JKube提供了多种覆盖默认配置的方法,包括在项目的 pom.xml 文件中设置属性或提供部分YAML文件(片段)。
1.2 从项目的pom.xml调整集群清单
首先,编辑 pom.xml 文件,将项目的 artifactId 值改为 task-manager :
<artifactId>task-manager</artifactId>
Eclipse JKube默认使用项目的 artifactId 来命名生成的资源和对象,所以将其改为能正确标识应用的名称是很有必要的。
接下来,在 pom.xml 文件中设置以下属性:
<properties>
<jkube.createExternalUrls>true</jkube.createExternalUrls>
<jkube.domain>192.168.49.2.nip.io</jkube.domain>
<postgresql.serviceName>postgresql</postgresql.serviceName>
<jkube.enricher.jkube-project-label.group>${project.artifactId}</jkube.enricher.jkube-project-label.group>
</properties>
这些属性的作用如下:
| 属性 | 作用 |
| ---- | ---- |
| jkube.createExternalUrls | 配置Eclipse JKube为应用生成Kubernetes Ingress对象,使应用可以通过可访问的URL公开访问。 |
| jkube.domain | 作为生成的Ingress的主机后缀,应用的访问URL为 http://task-manager.192.168.49.2.nip.io ,需将IP地址替换为 minikube ip 的输出结果。 nip.io 是一个免费的DNS服务。 |
| postgresql.serviceName | 作为模板变量,用于定义部署开发用PostgreSQL数据库时创建的Kubernetes对象的名称。 |
| jkube.enricher.jkube-project-label.group | 配置Eclipse JKube为创建的对象添加更具体的标签 group: task-manager 。 |
1.3 Kubernetes Ingress
Kubernetes Ingress是用于配置外部访问和路由(通常是HTTP)到集群中部署的服务的对象,提供了可外部访问的URL、基于名称的虚拟主机、SSL终止、负载均衡等功能,是外部暴露集群服务的推荐方法。
由于应用依赖PostgreSQL数据库,我们需要提供额外的配置设置,将数据库凭证和URL信息传递给容器应用。可以通过Eclipse JKube片段来实现。
1.4 使用片段调整集群清单
Eclipse JKube会根据项目配置自动生成YAML集群配置文件,并提供一些默认配置。但每个应用都有其特殊性,因此可以使用片段来调整生成的YAML文件。
片段是Kubernetes对象的部分定义,可以在项目的 src/main/jkube 目录中创建YAML文件来提供这些片段,Eclipse JKube会将其与自动生成的文件合并。此外,还可以在 src/main/jkube/raw 目录中创建完整的Kubernetes对象定义文件,这些文件将与应用一起部署。
我们的任务管理应用需要PostgreSQL数据库才能正常工作。在生产环境中,运维团队可能已经为我们配置好了数据库,但在本地的minikube集群中,我们需要自己完成这个任务。可以在 这里 找到所需的Kubernetes清单。
下面分析 postgresql-secret.yml 文件:
metadata:
labels:
app: ${postgresql.serviceName}
group: ${project.artifactId}
name: ${postgresql.serviceName}
stringData:
username: quarkus-db
password: the-s3cre7
该文件包含了PostgreSQL部署初始化数据库和应用登录数据库服务所需的凭证(用户名和密码),以及用于在集群中标识资源的标签。标签使用了占位符变量,Eclipse JKube会在生成最终集群资源时替换这些变量。
Kubernetes Secret是用于存储机密数据的键值对对象,Pod可以将其作为环境变量、命令行参数或挂载为文件使用。默认情况下,Kubernetes Secret以未加密的方式存储数据。
为了将应用部署到Kubernetes,Eclipse JKube会自动生成一个Deployment对象,但如果不进行进一步修改,应用将无法连接到本地的PostgreSQL数据库。
Kubernetes Deployment是用于定义Kubernetes中的工作负载和应用程序的对象,它会运行多个相同的Pod副本,并负责替换失败或无响应的实例,确保应用始终有至少配置数量的副本可用。
在 src/main/jkube 目录中创建一个新的 deployment.yml 片段文件,用于向运行应用容器的Pod提供数据库信息。以下是该文件的部分内容分析:
containers:
- env:
- name: QUARKUS_DATASOURCE_USERNAME
valueFrom:
secretKeyRef:
name: ${postgresql.serviceName}
key: username
上述代码为Deployment资源中的第一个容器添加了一个环境变量,该变量的值将从名为 ${postgresql.serviceName} (即 postgresql )的Secret中读取。Quarkus在初始化应用时会读取这个值,并覆盖 quarkus.datasource.username 应用属性。同样的模式也用于覆盖 quarkus.datasource.password 属性。
- name: QUARKUS_DATASOURCE_REACTIVE_URL
value: postgresql://${postgresql.serviceName}:5432/postgres
该代码覆盖了数据源URL,使Quarkus能够连接到本地的PostgreSQL服务。当Eclipse JKube处理这个片段时, ${postgresql.serviceName} 占位符将被替换为 postgresql ,这个名称与 src/main/jkube/raw/postgresql-svc.yml 中定义的Kubernetes Service名称匹配,Kubernetes DNS服务会解析该名称,并将流量路由到对应的Pod。
Kubernetes Service是用于将运行在Pod上的应用作为集群中的网络服务暴露的对象,通过Service访问Pod网络是推荐的方式,这样客户端无需知道单个Pod的位置或地址,应用可以通过与Service名称匹配的DNS名称访问。
- name: QUARKUS_HIBERNATE_ORM_DATABASE_GENERATION
value: create
该环境变量覆盖了 quarkus.hibernate-orm.database.generation 属性,配置为仅执行数据库创建命令,确保应用启动或重启时,数据库在不存在的情况下只创建一次。
imagePullPolicy: Always
imagePullPolicy 字段配置了Kubernetes从外部注册表拉取容器镜像的频率。由于我们还处于开发阶段,没有提供容器镜像的稳定版本,因此将其设置为 Always ,以确保Kubernetes始终部署应用的最新版本。
1.5 使用Eclipse JKube创建集群配置清单
使用Eclipse JKube的Kubernetes Maven插件生成集群清单非常简单,只需执行以下Maven命令:
./mvnw k8s:resource
执行该命令后,Maven应该会成功完成,我们可以看到Eclipse JKube的日志消息。
1.6 将任务管理器部署到minikube
Eclipse JKube的Kubernetes Maven插件还提供了一个目标,可以直接从生成的YAML文件将应用部署到Kubernetes,无需使用其他工具(如 kubectl )。执行以下命令进行部署:
./mvnw k8s:apply
部署完成后,应用应该可以通过 http://task-manager.192.168.49.2.nip.io 访问。
测试完成后,可以使用以下命令移除应用部署并清理本地集群:
./mvnw k8s:undeploy
2. 部署应用到Fly.io
2.1 技术要求
- 最新的Java JDK LTS版本(撰写本文时为Java 17)。
- 最新的Node.js LTS版本(撰写本文时为16.15)。
- 一个可用的Docker环境,用于创建容器镜像。可以在大多数Linux发行版上安装Docker包,在Windows或macOS上可以安装Docker Desktop。
可以从 这里 下载本章的完整源代码。
2.2 介绍Fly.io
之前我们学习了如何将应用容器化并部署到Kubernetes,但如果使用的是本地的Minikube集群,应用只能在本地访问。现在我们将学习如何将应用部署到Fly.io,这是一个新的云PaaS提供商,因其免费计划而变得非常受欢迎。
Fly.io专注于将全栈应用及其依赖服务部署到靠近目标用户的位置,在全球多个城市运行物理服务器,能够提高应用的响应速度和性能。它在2022年年中Heroku停止提供免费计划后变得更加重要,与Heroku类似,Fly.io可以轻松部署和扩展基于容器的镜像,提供了良好的开发体验,是Heroku的理想替代品。
Heroku成立于2007年,2009年公开推出,最初只支持Ruby,后来逐渐支持更多编程语言。由于其简单性、对开发者友好、易于扩展和免费计划,它曾经是部署应用的热门选择。但随着Kubernetes和其他平台的兴起,其受欢迎程度逐渐下降,到2022年底,Heroku不再提供免费计划。
Fly.io提供了免费套餐,在撰写本文时,可以免费运行小型应用(如我们的任务管理器)和持久化服务(如PostgreSQL)。不过,其免费套餐的计费要求在过去几个月有所变化,可能需要提供信用卡信息,但不会产生费用。
接下来,我们将学习如何配置项目,以便将应用部署到Fly.io。
graph LR
A[开始] --> B[创建集群配置清单]
B --> C[调整pom.xml]
C --> D[使用片段调整清单]
D --> E[生成集群配置清单]
E --> F[部署到minikube]
F --> G[部署到Fly.io]
G --> H[结束]
应用程序部署:从Kubernetes到Fly.io
2.3 配置项目以部署到Fly.io
要将应用部署到Fly.io,我们需要对项目进行一些配置。以下是具体的步骤和相关配置说明:
2.3.1 安装Fly.io CLI
首先,我们需要安装Fly.io的命令行界面(CLI),它可以帮助我们在本地完成应用部署的相关操作。可以根据不同的操作系统,按照Fly.io官方文档的指引进行安装。
2.3.2 创建Fly.io应用
安装好CLI后,在项目根目录下打开终端,执行以下命令来创建一个新的Fly.io应用:
fly apps create <app-name>
将 <app-name> 替换为你想要的应用名称。执行该命令后,Fly.io会为你的应用分配一个唯一的名称和URL。
2.3.3 配置Fly.io应用
在项目根目录下创建一个 fly.toml 文件,该文件用于配置Fly.io应用的相关参数。以下是一个示例配置:
app = "<app-name>"
kill_signal = "SIGINT"
kill_timeout = 5
processes = []
[env]
# 配置环境变量,例如数据库连接信息
DATABASE_URL = "postgresql://<username>:<password>@<host>:<port>/<database>"
[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
在上述配置中,需要将 <app-name> 替换为之前创建的应用名称,同时根据实际情况配置数据库连接信息。 internal_port 指定了应用在容器内部监听的端口,这里假设应用监听的是8080端口。
2.3.4 配置Dockerfile
由于Fly.io是基于容器镜像进行部署的,我们需要确保项目中有一个合适的 Dockerfile 来构建容器镜像。以下是一个简单的 Dockerfile 示例:
# 使用基础镜像
FROM openjdk:17-jdk-slim
# 设置工作目录
WORKDIR /app
# 复制项目文件
COPY target/<your-jar-file>.jar app.jar
# 暴露端口
EXPOSE 8080
# 启动应用
CMD ["java", "-jar", "app.jar"]
将 <your-jar-file> 替换为你项目打包生成的JAR文件名称。
2.4 部署任务管理器到Fly.io
完成项目配置后,就可以将任务管理器应用部署到Fly.io了。具体步骤如下:
2.4.1 构建并推送容器镜像
在项目根目录下执行以下命令,使用Fly.io CLI构建并推送容器镜像到Fly.io的镜像仓库:
fly deploy
该命令会自动读取 Dockerfile 和 fly.toml 文件,构建容器镜像并推送到Fly.io的镜像仓库,然后部署到Fly.io平台。在部署过程中,Fly.io会根据配置创建应用实例,并将其暴露在公网上。
2.4.2 验证部署结果
部署完成后,可以通过Fly.io为应用分配的URL访问应用,验证部署是否成功。如果一切正常,你应该能够看到任务管理器应用的界面,并正常使用其功能。
以下是部署过程的步骤总结表格:
| 步骤 | 操作 | 命令示例 |
| ---- | ---- | ---- |
| 1 | 安装Fly.io CLI | 根据官方文档安装 |
| 2 | 创建Fly.io应用 | fly apps create <app-name> |
| 3 | 配置Fly.io应用 | 编辑 fly.toml 文件 |
| 4 | 配置Dockerfile | 编写合适的 Dockerfile |
| 5 | 构建并推送容器镜像 | fly deploy |
| 6 | 验证部署结果 | 通过Fly.io分配的URL访问应用 |
2.5 测试应用
部署完成后,我们需要对应用进行全面的测试,确保其在Fly.io平台上能够正常运行。以下是一些测试的要点和建议:
2.5.1 功能测试
- 检查应用的基本功能是否正常,例如任务的创建、编辑、删除等操作。
- 验证数据库连接是否正常,确保数据能够正确存储和读取。
2.5.2 性能测试
- 使用性能测试工具(如JMeter)对应用进行压力测试,评估其在高并发情况下的性能表现。
- 检查应用的响应时间和吞吐量,确保其能够满足用户的需求。
2.5.3 安全性测试
- 检查应用是否存在安全漏洞,例如SQL注入、跨站脚本攻击(XSS)等。
- 验证应用的身份验证和授权机制是否正常工作。
2.6 总结
通过以上步骤,我们成功地将任务管理器应用从本地的minikube集群部署到了Fly.io平台。在这个过程中,我们学习了如何使用Eclipse JKube创建Kubernetes集群配置清单并部署到minikube,以及如何配置项目并将应用部署到Fly.io。
部署应用到多个平台可以为我们提供更多的选择和灵活性,使应用能够更好地满足不同用户的需求。同时,我们也对Kubernetes和Fly.io这两个平台有了更深入的了解,掌握了相关的部署和配置技巧。
在未来的开发过程中,我们可以根据项目的需求和特点,选择合适的平台进行应用部署,并不断优化和改进应用的性能和稳定性。
graph LR
A[安装Fly.io CLI] --> B[创建Fly.io应用]
B --> C[配置Fly.io应用]
C --> D[配置Dockerfile]
D --> E[构建并推送镜像]
E --> F[部署到Fly.io]
F --> G[测试应用]
G --> H[完成部署]
超级会员免费看
410

被折叠的 条评论
为什么被折叠?



