制作应用包

最近更新时间:2024-08-15 14:19:51

我的收藏

创建应用

1. 开发者中心 单击创建应用,填写应用的名称、介绍,上传 Logo,来完成应用的登记。



2. 应用创建完成后,单击目标应用操作栏下的版本管理进入应用包版本管理界面。




登录开发者工具

1. 在版本管理界面中,单击 CLI 工具使用指引,唤出工具安装和登录指引。



说明:
需要 NodeJS 环境。云应用开发者工具基于 NodeJS 开发,安装前请确认开发环境已安装 NodeJS。如未安装,请前往 NodeJS 官网下载安装。
2. 根据指引安装好开发者工具后,使用 cloudapp 命令可以查看工具的使用说明:



3. 安装好工具后,请使用cloudapp login命令在本地开发者中心登录,您需要使用开发者的 CAM 密钥进行登录。
cloudapp login $SECRET_ID@$SECRET_KEY
SecretId 和 SecretKey 为注册应用开发方主体身份时,提交的开发者信息中,对应的 CAM 密钥。登录成功会显示开发方和开发者名称。如果您忘记了密钥信息,可以到 CAM 控制台 查询。

应用包初始化

快速理解应用包:
应用包在开发者的本地体现为一个文件系统目录,一般建议采用项目根目录下的 .cloudapp 目录作为应用包目录。
推荐通过阅读 最小应用包的 Demo 源码,来理解应用包的组成。
使用 cloudapp init 命令可以生成一个示例应用包:
# 初始化本地项目,可通过 -t 指定初始模板,支持的模板参考 Github 模板清单(默认模板:CVM实例 + 公网IP)
cloudapp init hello-world

# 示例
# cloudapp init hello-world -t CT_001
技术预览版功能:
cloudapp init 命令当前为预览版功能,后续可能会调整其用法和参数。当前 cloudapp init 只在本地下载模板代码,更多的模板代码可以在云应用的 GitHub 仓库 中查看。

应用包组成

应用包由开发方交付的内容组成(分为 CVM 部署、容器部署两种模式),具体差异见下表:
CVM 部署
容器部署
说明:
如果您的应用采用的是「容器部署」,请切换到 「容器部署」 查看需要交付的内容。
内容
位置
说明
应用包元信息
.cloudapp/package.yaml
应用包的元信息描述文件。
包含应用包 ID、应用安装参数、云 API 权限等信息声明。
资源和变量声明
.cloudapp/infrastructure/**/*.tf
资源和变量声明,采取 Terraform 语法。
资源采用资源块的方式声明;变量为资源部署时可使用的变量,使用前需声明。
CVM 镜像(制品)
云应用制品托管中心
云应用提供 CVM 镜像托管
说明:
如果您的应用采用的是「CVM 部署」,请切换到 「CVM 部署」 查看需要交付的内容。
内容
位置
说明
应用包元信息
.cloudapp/package.yaml
应用包的元信息描述文件。
包含应用包 ID、应用安装参数、云 API 权限等信息声明。
资源和变量声明
.cloudapp/infrastructure/**.tf
资源和变量声明,采取 Terraform 语法。
资源采用资源块的方式声明;变量为资源部署时可使用的变量,使用前需声明。
容器镜像(制品)
云应用 TCR 仓库
云应用提供 TCR 仓库为需要托管容器镜像的应用提供镜像托管服务。
服务编排
.cloudapp/software/charts/**/*.yaml
服务编排,采用 Helm Chart 编排规范。
编排容器集群中的 StatefulSet、Service、Job、Secret 等内容。

应用包元信息

应用包元信息在 package.yaml 中声明,包含应用包 ID、应用安装参数、云 API 权限等信息声明。
# 应用包 ID,对应开发者中心中的应用 ID
id: pkg-8lve2gn1

# 应用参数,定义允许客户在安装过程中设置的参数,例如所属网络、应用规格、付费方式等
args:
- name: app_target
label: 目标网络
widget: subnet-select

# 云 API 权限声明(可选),如果应用内需调用云 API,需这里进行声明
scopes:
cloudAPI:
cvm: DescribeInstance
注意:
请提供正确的应用包 ID。开发者工具在推送应用的时候,会根据 package.yaml 中记录的应用包 ID 来鉴权并推送,如果应用未登记,或者当前登录的开发者,不是对应的应用开发者,将推送失败。

资源和变量声明

资源声明

应用包中的资源声明,是应用包的核心内容。云应用借用 Terraform 语法 来声明软件依赖的云资源。
resource "tencentcloud_eks_cluster" "eks" {
availability_zone = var.app_target.subnet.zone
k8s_version = "1.20.6"
vpc_id = var.app_target.vpc.id
subnet_ids = [var.app_target.subnet.id]
service_subnet_id = var.app_target.subnet.id
}
上面就是一个资源块的声明语法,resource 表示声明资源块,"tencentcloud_eks_cluster" 表示资源类型,"eks" 为资源名称。
说明:
应用包支持声明的资源大致分为两类:
腾讯云 IaaS / SaaS 资源,资源类型前缀为 tencentcloud
云应用封装的资源,资源前缀cloudapp
支持的资源类型及资源参数,请参考 资源类型手册

变量声明

上面声明的 EKS 资源,其关联的 VPC、子网等信息,是从 变量 中获取的。应用包中,所有用到的变量,都需要进行声明才能使用:
# 使用 variable 关键字声明变量,app_target 为「变量名」,通过 var.app_target 可使用该变量
variable "app_target" {
type = object({
region = string
region_id = string
vpc = object({
id = string
cidr_block = string
})
subnet = object({
id = string
zone = string
})
})
}
跟资源块类似,我们使用变量块 variable 声明一个变量,上面的声明中 app_target为变量名,在资源块中用 var.app_target 即可引用。
变量可用于获取用户的安装参数,也可以用于获取系统的安装参数,详情请参考 安装参数、变量和输出 文档说明。

镜像托管

CVM 镜像托管
容器镜像托管

CVM 镜像

说明:
当您制作好 CVM 镜像后,需要将镜像托管到云应用制品管理中心,以便于在用户安装时,云应用自动将对应镜像共享给用户。
在云应用开发者中,选择应用的制品管理



在制品管理中心选择当前应用需要托管的 CVM 镜像。






根据应用允许安装的地域,调整镜像可用地域。




容器镜像

说明:
云应用提供 TCR 仓库为需要托管容器镜像的应用提供镜像托管服务。该仓库客户在安装是从内网拉取,无需外网支持。
使用 cloudapp docker 命令获得仓库登录命令。



使用 cloudapp docker --url 获得仓库推送地址。



使用 cloudapp docker --auth 单独获得 Docker 授权文件,适用于 CI 构建的场景。



Docker 仓库登录后,就可以将镜像推送到托管的仓库中了。
仓库票据有效期和权限
cloudapp docker 命令拿到的仓库票据,只能用于应用方推送软件容器镜像。该票据有效期 2 个小时,所以不应该存储下来使用,建议 CI 流程构建完之后,再实时通过 cloudapp docker 命令获取票据。
客户安装时使用的安装票据是只读的,而 cloudapp docker 拿到的票据则可以操作应用开发方的软件镜像。

服务编排(容器部署)

通过声明 cloudapp_helm_app 类型的资源,可以声明容器服务编排。
resource "cloudapp_helm_app" "helm_charts" {
cluster_id = tencentcloud_eks_cluster.eks.id
chart_src = "../software/chart"
chart_username = var.cloudapp_repo_username
chart_password = var.cloudapp_repo_password

chart_values = {
SUBNET_ID = var.app_target.subnet.id
IMAGE_CREDENTIALS = {
REGISTRY = var.cloudapp_repo_server
USERNAME = var.cloudapp_repo_username
PASSWORD = var.cloudapp_repo_password
}
}
}
需要指定编排的目标容器集群以及编排的 Helm Chart 源码位置(一般建议放在 .cloudapp/software/chart 上)。
通过 chart_values 将资源信息传递到 Helm Chart Values,这些信息在部署时,会传递给 Helm,因而编排的时候可以直接使用基础设施。参见上面的例子,将子网 ID 传给编排,在对 service 进行编排的时候,指定该子网 ID 从而生成内网的负载均衡类型。另一个常见的例子是,将 DB 实例化后的连接信息传入编排,从而让工作负载可以从环境变量中引用,或是生成到 configmap 中。
注意:
将 TF 中声明的资源属性,传递到 Helm Chart Values,是个很重要的特性。利用该特性,让软件编排的时候可以直接编排实际部署的硬件资源,而无需二次设置。

扩展

实现应用接口

应用如果想通过接口为客户提供软件的管理功能,则需要考虑权限控制、链路安全、限频控制等一系列问题。云应用提供了一个解决方案,让客户可以直接通过云 API 的方式调用到软件暴露的接口,并支持通过 CAM 来控制调用权限,实现接口更规范地使用。

步骤

应用接口的调用,需要 6 个步骤完成:
1. 客户安装软件。
2. 云应用部署引擎按照应用开发方的声明,部署并配置接口网关(API Gateway 资源)。
3. 云应用部署引擎登记应用网关信息,包括网关的公网地址和鉴权私钥。
4. 客户通过云 API 调用应用接口。
5. 上一步的请求给到云应用中枢网关处理,中枢网关根据请求的应用实例信息找到对应接口网关,通过公网签名并请求到接口网关。
6. 接口网关在内网将请求转发到接口后端处理。
对于应用开发方来说,只需要定义下列资源即可:
定义接口网关 cloudapp_api_handler
定义 K8s Service 作为接口后端 cloudapp_tke_service
定义具体的应用接口 cloudapp_api
# 声明 Hello World 应用包所暴露的应用接口,以及其对应的接口网关和接口后端
resource "cloudapp_tke_service" "api_service" {
# 接口后端使用在 Helm Chart 中已经声明的 TKE Service
resource_manager = "helm"
chart_config = {
cluster_id = tencentcloud_eks_cluster.eks.id
chart_id = cloudapp_helm_app.helm_charts.id
service_name = "hello-service"
}
}
resource "cloudapp_api_handler" "api_gateway" {
# 接口网关,使用上面声明的接口后端
vpc_id = var.app_target.vpc.id
host = cloudapp_tke_service.api_service.host
handler_protocol = "http"
handler_path = "/api/:api_name"
}
resource "cloudapp_api" "Hello" {
# 声明 Hello 接口,使用上面声明的接口网关
api_name = "Hello"
api_desc = "获取服务器 Hello 消息"
handler_id = cloudapp_api_handler.api_gateway.id
}

实现 HTTPS 公网服务

使用已有的腾讯云资源,可以来实现一个 HTTPS 公网服务,参考步骤如下:
声明一个证书选择表单,让客户安装的时候选择 SSL 证书。
声明一个域名解析表单,让客户安装的时候填写使用的公网域名(前提是客户云账号下已经申请有域名)。
声明一个公网类型的 CLB,后端指向要暴露到公网的 Service。
声明一个 HTTPS Listener,绑定客户选择的 SSL 证书。
声明一个 CNS 解析记录,将用户指定的公网域名解析记录添加到客户的域名解析记录中(这一步云应用引擎尚未支持,暂时需要手动操作)。
说明:
实现 HTTPS 公网服务的参考实例,正在实现中。

下一步

完成应用包的生产和上传后,需进行应用包的推送、验证和上架,详情参考 应用包管理