概述
ZStack Cloud应用市场是基于IaC (Infrastructure as Code,基础设施即代码) 的开发平台,提供标准化IaC编排和简单易用的开发框架,具有强兼容性、可扩展性和混合云部署特点,帮助ISV合作伙伴、渠道和客户快速将复杂的企业级应用接入ZStack Cloud并一键部署使用,根据业务需求灵活扩展云平台能力,或将运维部署的最佳实践应用于生产。
本文档详细介绍应用制作、应用发布、应用部署的规范流程。
应用制作
背景信息
本章节介绍如何准备应用镜像和应用包,包括以下步骤:- 获取应用包模板
- 配置应用文件
- 制作应用镜像
操作步骤
-
获取应用包模板
应用包源目录结构如下:
├── applications │ ├── index.json │ ├── zstack_io_grafana │ │ └── aarch64 │ │ └── 11.2.0 │ │ ├── application.json │ │ ├── input.json │ │ ├── logo.png │ │ ├── output.json │ │ └── src │ │ ├── main.tf │ │ ├── output.tf │ │ ├── scripts │ │ │ └── check-health.sh │ │ ├── variables.tf │ │ └── version.tf │ │ └── x86_64 │ │ └── 11.2.0 │ │ ├── application.json │ │ ├── input.json │ │ ├── logo.png │ │ ├── output.json │ │ └── src │ │ ├── main.tf │ │ ├── output.tf │ │ ├── scripts │ │ │ └── check-health.sh │ │ ├── variables.tf │ │ └── version.tf目录结构说明:- zstack_io_grafana:应用ID,请根据实际情况重命名,需和application.json中的appId值一致
- aarch64/x86_64:应用架构,如应用只适配一种架构,可将其他架构路径删除
- 11.2.0:应用版本号,请根据实际情况重命名
- application.json:定义应用名称、应用描述、应用appId、应用类型、连接类型的文件
- input.json:UI渲染文件,用于定义用户通过应用市场UI界面部署应用时需填写的表单参数
- logo.png:应用的Logo图片
- output.json:用于定义该应用在应用市场部署完成后,在UI界面上展示的详情字段
- src: 存放内容为Terraform (OpenTofu) 编排的IaC文件
- main.tf:OpenTofu执行文件入口,请参考Terraform语法编写,详见https://developer.hashicorp.com/terraform/language
- output.tf:执行main后的结果输出,请参考Terraform语法编写,详见https://developer.hashicorp.com/terraform/language
- script:存放应用执行脚本,脚本可以通过data导入数据,或remote-exec到运行该应用的云主机执行
- variables.tf:OpenTofu格式的引入变量
- version.tf:导入的Provider信息
-
配置应用文件
-
制作应用镜像
应用镜像需基于KVM qcow2格式的云主机镜像,可以通过Packer Qemu插件代码化制作镜像。如云主机镜像包含QGA插件,可以使用User Data参数传入,User Data内容需经过Base64编码。以下示例为格式化数据云盘的User Data,用户可按实际情况编写自己的User Data:编码前:
#cloud-config runcmd: - | pv_list=$(pvs --noheadings -o pv_name) pv_count=$(echo "$pv_list" | wc -l) pv_name=$(echo "$pv_list" | tr -d ' ') vg_name=$(pvs --noheadings -o vg_name $pv_name | tr -d ' ') growpart $(echo $pv_name | sed 's/[0-9]*$//') $(echo $pv_name | grep -o '[0-9]*$') pvresize $pv_name lv_name=$(lvs --noheadings -o lv_name --sort -size | tail -1 | tr -d ' ') lvextend -l +100%FREE /dev/$vg_name/$lv_name lv_path="/dev/$vg_name/$lv_name" mapper_name=$(readlink -f $lv_path | awk -F '/' '{print $3}') lv_mapper_name=$(ls -l /dev/mapper/ | grep "$mapper_name" | awk '{print $9}') blkid | grep "/dev/mapper/$lv_mapper_name" | grep -q xfs if [ $? -eq 0 ]; then xfs_growfs /dev/mapper/$lv_mapper_name else resize2fs /dev/mapper/$lv_mapper_name fi partprobe编码传入:user_data = "I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSB8CiAgICBwdl9saXN0PSQocHZzIC0tbm9oZWFkaW5ncyAtbyBwdl9u \ YW1lKQogICAgcHZfY291bnQ9JChlY2hvICIkcHZfbGlzdCIgfCB3YyAtbCkKICAgIHB2X25hbWU9JChlY2hvICIkcHZfbGlzdCIgfCB0ciAtZCAnI \ CcpCgogICAgdmdfbmFtZT0kKHB2cyAtLW5vaGVhZGluZ3MgLW8gdmdfbmFtZSAkcHZfbmFtZSB8IHRyIC1kICcgJykKCiAgICBncm93cGFydCAkKG \ VjaG8gJHB2X25hbWUgfCBzZWQgJ3MvWzAtOV0qJC8vJykgJChlY2hvICRwdl9uYW1lIHwgZ3JlcCAtbyAnWzAtOV0qJCcpCiAgICBwdnJlc2l6ZSA \ kcHZfbmFtZQoKICAgIGx2X25hbWU9JChsdnMgLS1ub2hlYWRpbmdzIC1vIGx2X25hbWUgLS1zb3J0IC1zaXplIHwgdGFpbCAtMSB8IHRyIC1kICcg \ JykKCiAgICBsdmV4dGVuZCAtbCArMTAwJUZSRUUgL2Rldi8kdmdfbmFtZS8kbHZfbmFtZQoKICAgIGx2X3BhdGg9Ii9kZXYvJHZnX25hbWUvJGx2X \ 25hbWUiCiAgICBtYXBwZXJfbmFtZT0kKHJlYWRsaW5rIC1mICRsdl9wYXRoIHwgYXdrIC1GICcvJyAne3ByaW50ICQzfScpCgogICAgbHZfbWFwcG \ VyX25hbWU9JChscyAtbCAvZGV2L21hcHBlci8gfCBncmVwICIkbWFwcGVyX25hbWUiIHwgYXdrICd7cHJpbnQgJDl9JykKCiAgICBibGtpZCB8IGd \ yZXAgIi9kZXYvbWFwcGVyLyRsdl9tYXBwZXJfbmFtZSIgfCBncmVwIC1xIHhmcwoKICAgIGlmIFsgJD8gLWVxIDAgXTsgdGhlbgogICAgICAgIHhm \ c19ncm93ZnMgL2Rldi9tYXBwZXIvJGx2X21hcHBlcl9uYW1lCiAgICBlbHNlCiAgICAgICAgcmVzaXplMmZzIC9kZXYvbWFwcGVyLyRsdl9tYXBwZ \ XJfbmFtZQogICAgZmkKICAgIHBhcnRwcm9iZQ=="
应用发布
本章节介绍如何将准备好的应用包和镜像发布到应用市场,包括以下三种发布方式:
- 单独发布:将应用包和镜像上传至本地云环境,仅供自己使用。
- 指定共享发布:将应用包和镜像上传至自己的CDN,允许自己和伙伴用户使用。
- 共享发布:将应用包和镜像上传至ZStack Cloud官方CDN,允许所有用户使用。
单独发布
- 执行python package_repo.py 脚本,生成images目录。
- 将应用镜像存放在images目录下,并重命名为image.qcow2。
- 执行以下命令,生成应用bin包:
python package_bin --${AppId} --${Version} --${Arch} --include_images - 在以下路径查看生成的bin包:target/application_bins/${AppID}/${Arch}/${Version}/${PackageName}.bin
- 将bin包上传至ZStack Cloud管理节点,并执行以下命令:
[root@localhost~] bash ${PackageName}.binNote: 如使用双管理节点,需在两个管理节点分别上传bin包并执行该命令 - 在ZStack Cloud主菜单,点击,在默认应用界面,点击同步应用,即可看到发布的应用。
指定共享发布
- 执行python package_repo.py 脚本,生成application.tar.gz和新的index.json。
- 在以下路径查看application.tar.gz:target/application_bins/${app_id}/${arch}/${version}/xxx.bin
- 将应用镜像重命名为image.qcow2
- 将application.tar.gz和image.qcow2按以下目录结构上传到自己的CDN:
├── index.json ├── ${AppId} │ └── ${Arch} │ └── ${Version} │ └── application.tar.gz │ └── image.qcow2 - 登录ZStack Cloud管理节点,执行以下命令,将CDN链接嵌入repositories中:
[root@localhost~]zstack-cli #进入CLI命令行 - >>>LogInByAccount accountName=admin password=${AdminPassword} #登录admin账号 admin >>>UpdateGlobalConfig name=repositories category=marketplace value="file:///opt/zstack-marketplace-repo;${CustomCDNAddress}" #将CDN链接嵌入repositories admin >>>exit #退出CLI命令行 - 执行以下命令,重启管理节点:
[root@localhost~] zstack-ctl restart_node - 检查marketplace-server/config/config.yaml文件中的repositories是否如下:
repositories: - file:///opt/zstack-marketplace-repo - ${CustomCDNAddress} - 在ZStack Cloud主菜单,点击,在默认应用界面,点击同步应用,即可看到发布的应用。
共享发布
- 执行python package_repo.py 脚本,生成application.tar.gz和新的index.json。
- 在以下路径查看application.tar.gz:target/application_bins/${app_id}/${arch}/${version}/xxx.bin
- 将应用镜像重命名为image.qcow2
- 将application.tar.gz和image.qcow2交付给ZStack Cloud官方技术支持,由技术支持将应用包和镜像上传到ZStack官方CDN。
- 在ZStack Cloud主菜单,点击,在默认应用界面,点击同步应用,即可看到发布的应用。
应用部署
背景信息
本章节介绍如何部署已发布到应用市场的应用,主要包括以下步骤:- 上传应用镜像(可选)
- 安装应用
- 访问应用
- 调试应用(可选)
操作步骤
-
上传应用镜像(可选)
安装应用时,系统会自动从CDN下载应用镜像,镜像下载需要一定时间。如需加快应用安装速度或当前环境未连接公网,请提前获取应用镜像,并上传到指定位置:
- 下载地址:
- ZStack Cloud CDN:点击此处
- 未发布到ZStack Cloud CDN的应用:请联系开发方获取
- 上传方法:
- 将镜像命名为image.qcow2,并分别存放在管理节点和镜像仓库的以下路径 (如没有则新建):/opt/zstack-marketplace-repo/{appName}/{Architecture}/{version},例如:/opt/zstack-marketplace-repo/zstack_io_grafana/x86_64/11.2.0/image.qcow2
- 为确保上传路径及文件名正确,建议联系官方技术支持执行本步骤。
- 下载地址:
- 安装应用
-
访问应用
在ZStack Cloud主菜单,点击,选择需要访问的应用,点击访问地址后的链接,即可跳转访问。
如图 4所示:图 4. 访问应用 
-
调试应用(可选)
如需进行应用调试,可参考以下信息:
- 查看应用UUID:在ZStack Cloud主菜单右上角点击任务,点击展开安装该应用的任务详情,查看application_uuid字段。如图 5所示:
图 5. 应用UUID 
- 查看应用日志:在管理节点查看/var/lib/zstack/marketplace-server/server.log
- 查看应用目录:在管理节点进入/var/lib/zstack/marketplace-server/apps/${application_uuid}/instance/${instance_uuid},可以查看对应的terraform.tfstate状态文件,如需手工调试请执行以下命令:
```bash export TF_CLI_CONFIG_FILE=/var/lib/zstack/marketplace-server/.terraformrc && /var/lib/zstack/marketplace-server/tools/tofu apply -var "host=cloud api endpoint" -var "port=8080" -var "session_id=xxxxx" ```
- 查看应用UUID:在ZStack Cloud主菜单右上角点击任务,点击展开安装该应用的任务详情,查看application_uuid字段。



