创建应用
1. 在 开发者中心 单击创建应用,填写应用的名称、介绍,上传 Logo,来完成应用的登记。
![](https://qcloudimg.tencent-cloud.cn/image/document/e394b025f1b49ba728811e84fbc7b4e4.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/e394b025f1b49ba728811e84fbc7b4e4.png)
2. 应用创建完成后,单击目标应用操作栏下的版本管理进入应用包版本管理界面。
![](https://qcloudimg.tencent-cloud.cn/image/document/c90e2a13756833ffa741fe97fdb3d16f.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/c90e2a13756833ffa741fe97fdb3d16f.png)
登录开发者工具
1. 在版本管理界面中,单击 CLI 工具使用指引,唤出工具安装和登录指引。
![](https://qcloudimg.tencent-cloud.cn/image/document/2356bf51ac1a45e9a8e98fc90b8ca8d3.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/2356bf51ac1a45e9a8e98fc90b8ca8d3.png)
说明:
2. 根据指引安装好开发者工具后,使用
cloudapp
命令可以查看工具的使用说明:![](https://qcloudimg.tencent-cloud.cn/image/document/29bc905f09f9ddc442b3dbf639c0f460.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/29bc905f09f9ddc442b3dbf639c0f460.png)
3. 安装好工具后,请使用
cloudapp login
命令在本地开发者中心登录,您需要使用开发者的 CAM 密钥进行登录。cloudapp login $SECRET_ID@$SECRET_KEY
应用包初始化
使用
cloudapp init
命令可以生成一个示例应用包:# 初始化本地项目,可通过 -t 指定初始模板,支持的模板参考 Github 模板清单(默认模板:CVM实例 + 公网IP)cloudapp init hello-world# 示例# cloudapp init hello-world -t CT_001
技术预览版功能:
应用包组成
应用包由开发方交付的内容组成(分为 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,对应开发者中心中的应用 IDid: pkg-8lve2gn1# 应用参数,定义允许客户在安装过程中设置的参数,例如所属网络、应用规格、付费方式等args:- name: app_targetlabel: 目标网络widget: subnet-select# 云 API 权限声明(可选),如果应用内需调用云 API,需这里进行声明scopes:cloudAPI:cvm: DescribeInstance
注意:
请提供正确的应用包 ID。开发者工具在推送应用的时候,会根据 package.yaml 中记录的应用包 ID 来鉴权并推送,如果应用未登记,或者当前登录的开发者,不是对应的应用开发者,将推送失败。
资源和变量声明
资源声明
resource "tencentcloud_eks_cluster" "eks" {availability_zone = var.app_target.subnet.zonek8s_version = "1.20.6"vpc_id = var.app_target.vpc.idsubnet_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 = stringregion_id = stringvpc = object({id = stringcidr_block = string})subnet = object({id = stringzone = string})})}
跟资源块类似,我们使用变量块
variable
声明一个变量,上面的声明中 app_target
为变量名,在资源块中用 var.app_target
即可引用。镜像托管
CVM 镜像
说明:
当您制作好 CVM 镜像后,需要将镜像托管到云应用制品管理中心,以便于在用户安装时,云应用自动将对应镜像共享给用户。
在云应用开发者中,选择应用的制品管理。
![](https://qcloudimg.tencent-cloud.cn/image/document/39b5e32fe480a72692a81a6aec4f4c80.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/39b5e32fe480a72692a81a6aec4f4c80.png)
在制品管理中心选择当前应用需要托管的 CVM 镜像。
![](https://qcloudimg.tencent-cloud.cn/image/document/f3e4a42f9c434aaf4fda2e00c28f416b.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/f3e4a42f9c434aaf4fda2e00c28f416b.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/027e1cb11b87ee4fd3a8ef05c97836b8.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/027e1cb11b87ee4fd3a8ef05c97836b8.png)
根据应用允许安装的地域,调整镜像可用地域。
![](https://qcloudimg.tencent-cloud.cn/image/document/b5a58f8fccbabcce304ddd5c50ec1387.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/b5a58f8fccbabcce304ddd5c50ec1387.png)
容器镜像
说明:
云应用提供 TCR 仓库为需要托管容器镜像的应用提供镜像托管服务。该仓库客户在安装是从内网拉取,无需外网支持。
使用
cloudapp docker
命令获得仓库登录命令。![](https://qcloudimg.tencent-cloud.cn/image/document/3e2d623d80ba27110cecd6fc5f7dec0e.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/3e2d623d80ba27110cecd6fc5f7dec0e.png)
使用
cloudapp docker --url
获得仓库推送地址。![](https://qcloudimg.tencent-cloud.cn/image/document/fa48334f0da5b7a507a34448337421e7.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/fa48334f0da5b7a507a34448337421e7.png)
使用
cloudapp docker --auth
单独获得 Docker 授权文件,适用于 CI 构建的场景。![](https://qcloudimg.tencent-cloud.cn/image/document/52e2b08ce7daa683665a51b6fe1b99c7.png)
![](https://qcloudimg.tencent-cloud.cn/image/document/52e2b08ce7daa683665a51b6fe1b99c7.png)
Docker 仓库登录后,就可以将镜像推送到托管的仓库中了。
仓库票据有效期和权限
cloudapp docker 命令拿到的仓库票据,只能用于应用方推送软件容器镜像。该票据有效期 2 个小时,所以不应该存储下来使用,建议 CI 流程构建完之后,再实时通过 cloudapp docker 命令获取票据。
客户安装时使用的安装票据是只读的,而 cloudapp docker 拿到的票据则可以操作应用开发方的软件镜像。
服务编排(容器部署)
通过声明
cloudapp_helm_app
类型的资源,可以声明容器服务编排。resource "cloudapp_helm_app" "helm_charts" {cluster_id = tencentcloud_eks_cluster.eks.idchart_src = "../software/chart"chart_username = var.cloudapp_repo_usernamechart_password = var.cloudapp_repo_passwordchart_values = {SUBNET_ID = var.app_target.subnet.idIMAGE_CREDENTIALS = {REGISTRY = var.cloudapp_repo_serverUSERNAME = var.cloudapp_repo_usernamePASSWORD = 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 Serviceresource_manager = "helm"chart_config = {cluster_id = tencentcloud_eks_cluster.eks.idchart_id = cloudapp_helm_app.helm_charts.idservice_name = "hello-service"}}resource "cloudapp_api_handler" "api_gateway" {# 接口网关,使用上面声明的接口后端vpc_id = var.app_target.vpc.idhost = cloudapp_tke_service.api_service.hosthandler_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 公网服务的参考实例,正在实现中。
下一步