22、应用程序部署:从Kubernetes到Fly.io

应用程序部署:从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[完成部署]
内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
在科技快速演进的时代背景下,移动终端性能持续提升,用户对移动应用的功能需求日益增长。增强现实、虚拟现实、机器人导航、自动驾驶辅助、手势识别、物体检测与距离测量等前沿技术正成为研究与应用的热点。作为支撑这些技术的核心,双目视觉系统通过模仿人类双眼的成像机制,同步获取两路图像数据,并借助图像处理与立体匹配算法提取场景深度信息,进而生成点云并实现三维重建。这一技术体系对提高移动终端的智能化程度及优化人机交互体验具有关键作用。 双目视觉系统需对同步采集的两路视频流进行严格的时间同步与空间校正,确保图像在时空维度上精确对齐,这是后续深度计算与立体匹配的基础。立体匹配旨在建立两幅图像中对应特征点的关联,通常依赖复杂且高效的计算算法以满足实时处理的要求。点云生成则是将匹配后的特征点转换为三维空间坐标集合,以表征物体的立体结构;其质量直接取决于图像处理效率与匹配算法的精度。三维重建基于点云数据,运用计算机图形学方法构建物体或场景的三维模型,该技术在增强现实与虚拟现实等领域尤为重要,能够为用户创造高度沉浸的交互环境。 双目视觉技术已广泛应用于多个领域:在增强现实与虚拟现实中,它可提升场景的真实感与沉浸感;在机器人导航与自动驾驶辅助系统中,能实时感知环境并完成距离测量,为路径规划与决策提供依据;在手势识别与物体检测方面,可精准捕捉用户动作与物体位置,推动人机交互设计与智能识别系统的发展。此外,结合深度计算与点云技术,双目系统在精确距离测量方面展现出显著潜力,能为多样化的应用场景提供可靠数据支持。 综上所述,双目视觉技术在图像处理、深度计算、立体匹配、点云生成及三维重建等环节均扮演着不可或缺的角色。其应用跨越多个科技前沿领域,不仅推动了移动设备智能化的发展,也为丰富交互体验提供了坚实的技术基础。随着相关算法的持续优化与硬件性能的不断提升,未来双目视觉技术有望在各类智能系统中实现更广泛、更深层次的应用。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值