如何将本地磁盘文件复制到Azure AKS的虚拟机规模集(VMSS)实例
Azure VMSS 本地文件上传及扩容持久化问题解答
本地文件上传到VMSS指定目录的实现方案
你遇到的常规SCP的username@hostname格式无法使用的问题是正常现象,并非你遗漏配置:VMSS的单个实例默认没有独立的公网访问入口,通常是统一挂载在负载均衡后方,因此无法直接通过常规SSH/SCP的主机地址直连单个实例。
以下两种方案均支持命令行操作,可直接集成到PowerShell搭建的发布流水线中:
方案1:通过Azure管理平面执行命令拉取文件(生产环境推荐)
该方案无需开放VMSS的公网端口、无需配置SSH/WinRM对外暴露,完全走Azure官方管理通道,安全性和兼容性最高:
- 第一步:将本地需要上传的文件上传到任意Azure存储账户的容器中,生成有效期足够的SAS访问链接,示例Azure CLI命令如下(PowerShell环境可直接调用Azure CLI,也可以换成对应Azure PowerShell模块命令):
# 上传本地文件到存储容器 az storage blob upload --account-name <存储账户名> --container-name <临时容器名> --name <云端存储文件名> --file <本地文件路径> # 生成只读SAS链接,有效期可根据需求调整,输出结果就是可直接访问的文件URL az storage blob generate-sas --account-name <存储账户名> --container-name <临时容器名> --name <云端存储文件名> --permissions r --expiry <UTC过期时间,例如2024-12-31T23:59:59Z> --full-uri --output tsv - 第二步:调用VMSS的
run-command能力,让指定的VM实例主动拉取文件到目标路径:
针对Linux实例的示例命令:
针对Windows实例的示例命令:az vmss run-command invoke --resource-group <资源组名> --name <VMSS名称> --instance-id "*" --command-id RunShellScript --scripts "wget <上一步生成的SAS文件URL> -O <目标目录路径/文件名>"
其中az vmss run-command invoke --resource-group <资源组名> --name <VMSS名称> --instance-id "*" --command-id RunPowerShellScript --scripts "Invoke-WebRequest -Uri '<上一步生成的SAS文件URL>' -OutFile '<目标目录路径\文件名>'"--instance-id "*"代表对VMSS下所有现有实例执行操作,如果只需要上传到指定实例,替换为对应实例ID即可。
方案2:配置网络后使用SCP上传
如果必须使用SCP协议操作,需要先对VMSS网络做适配配置:
- 优先给VMSS实例配置实例级公网IP,或者在前端负载均衡上配置NAT规则,将不同的公网端口映射到不同VM实例的22(SSH)/5985/5986(WinRM)端口
- 配置完成后即可用常规SCP命令上传,示例:
该方案需要额外开放公网端口,安全性较低,不推荐生产流水线使用。scp -P <映射的公网端口号> <本地文件路径> <实例用户名>@<负载均衡公网IP/实例公网IP>:<目标目录路径>
VMSS扩容时的文件持久化说明
提前拷贝到现有VM实例本地磁盘的文件,新扩容的实例不会自动包含。VMSS的新实例始终是基于你配置的原始基础镜像生成,后续手动写入现有实例本地磁盘的内容不会同步到基础镜像中,因此扩容生成的新实例默认只有基础镜像的初始内容,不存在你之前拷贝的文件。
如果需要新扩容的实例自动包含所需文件,可选择以下两种方案:
- 将所需文件提前打包到自定义镜像中,VMSS配置为从该自定义镜像创建实例,所有新实例启动就自带对应文件
- 给VMSS配置自定义脚本扩展(Custom Script Extension),设置实例启动时自动从存储地址拉取所需文件到指定目录,所有新实例(包括扩容生成的实例)启动时会自动执行该脚本,无需每次手动拷贝。
内容的提问来源于stack exchange,提问作者BrutalDev
相关产品推荐
相关产品推荐

