基于Jenkins+Git在Azure Linux VMSS部署Spring Boot应用及日志备份咨询
针对Azure VMSS部署Spring Boot应用的问题解答
1. VMSS上构建并部署Spring Boot应用的最优方案
结合你已有的自定义镜像、Jenkins+Git架构,推荐分层落地的最优方案:
- 基础环境固化到自定义镜像:把JDK、systemd应用管理配置、固定应用目录(如
/opt/spring-apps)、azcopy/git等工具都打包进镜像,避免每次部署重复安装依赖。同时在镜像中预置标准化启动脚本(如/opt/spring-apps/start-app.sh),通过systemd设为开机自启。 - Jenkins CI/CD流程优化:
- 拉取Git源码构建Spring Boot Jar包后,上传到带SAS权限的Azure Blob存储容器(避免公开访问)。
- 触发VMSS更新时采用滚动更新策略:通过自定义脚本扩展(CSE)向每个实例下发命令,用
azcopy拉取最新Jar到指定目录,再调用systemctl restart spring-app.service重启应用。这种方式无需替换VM实例,更新速度快、downtime极低。 - 若涉及基础环境变更(如JDK版本升级),重新制作自定义镜像后更新VMSS镜像版本,触发滚动升级替换旧实例。
- 额外安全与效率优化:给VMSS实例分配系统托管身份,授权访问Blob存储,避免脚本硬编码密钥;在Jenkins中集成Azure CLI插件,直接调用VMSS命令完成部署。
2. 手动重启超出最小实例数的VM后,CSE无法触发执行的处理方法
自定义脚本扩展(CSE)默认仅在VM创建/重新部署时执行,手动重启不会触发,可通过以下方式解决:
- 手动触发CSE重执行:用Azure CLI针对目标实例或整个VMSS重新运行CSE:
# 针对整个VMSS执行 az vmss extension set --resource-group <你的资源组名> --vmss-name <你的VMSS名> --name CustomScript --version 2.1 --settings '{"commandToExecute": "你的原脚本命令"}' # 针对单个实例执行 az vmss extension set --resource-group <你的资源组名> --vmss-name <你的VMSS名> --name CustomScript --version 2.1 --settings '{"commandToExecute": "你的原脚本命令"}' --instance-id <实例ID> - 将脚本加入系统启动流程:把CSE核心逻辑(如拉取应用包、配置环境)加入Linux启动项,确保重启后自动执行:
- 对于systemd发行版(Ubuntu 18.04+、CentOS 7+),创建
post-start.service配置文件,指定ExecStart为脚本路径并设为启用状态。 - 对于传统SysVinit系统,将脚本路径加入
/etc/rc.local(确保文件有可执行权限)。
- 对于systemd发行版(Ubuntu 18.04+、CentOS 7+),创建
- 脚本幂等性改造:确保脚本重复执行不会产生异常(如检查Jar包是否已存在、服务是否已启动等),适配手动触发或自动启动的场景。
3. VM自动缩放解除分配时,日志备份到存储的低成本方案
核心思路是利用VM关机信号触发备份,结合低成本存储层级实现最优成本控制:
- 关机钩子触发备份:在自定义镜像中配置systemd关机服务,捕获VM终止信号执行备份:
- 创建
backup-log.service文件:[Unit] Description=Backup application logs on shutdown DefaultDependencies=no Before=shutdown.target reboot.target halt.target [Service] Type=oneshot ExecStart=/opt/scripts/backup-logs.sh TimeoutStartSec=300 [Install] WantedBy=shutdown.target reboot.target halt.target - 在
/opt/scripts/backup-logs.sh中用azcopy同步日志目录到Blob存储:azcopy sync /var/log/spring-apps https://<你的存储账户名>.blob.core.windows.net/logs/app-logs --recursive - 启用服务:
systemctl enable backup-log.service
- 创建
- 低成本存储配置:
- 使用Azure Blob存储的冷存储层存储日志(成本约为标准热层的1/3);若日志无需频繁访问,可进一步使用归档存储层(成本最低,但访问需提前解冻)。
- 配置Blob存储生命周期规则:自动将30天以上日志移至冷层,90天以上移至归档层,180天以上自动删除,进一步压缩成本。
- 权限优化:给VMSS系统托管身份分配Blob存储的
Storage Blob Data Contributor权限,避免脚本中存储账户密钥,提升安全性。
内容的提问来源于stack exchange,提问作者Jacob
相关产品推荐
相关产品推荐

