如何将文件从本地磁盘复制到 AKS VMSS(所有 Azure 虚拟机规模集)

How to copy a file from local disk to AKS VMSS (All Azure Virtual Machine Scale Sets)

需要将本地文件(临时文件或在发布过程中)复制到 VMSS/Node 或至少是 VMSS 的附加磁盘。

如何将本地文件复制到 VMSS/Node 上的远程目录位置?特别是从命令行,以便它可以在发布管道(PowerShell 等)中发生。

我已经阅读了使用 SCP 的示例,但没有关于如何在 Azure 中使用 VMSS 具体执行此操作的信息。 username@hostname 在这里并不适用,还是我遗漏了什么?

我想每次扩展时,之前复制的文件将在每个 VM 中可用,所以这不需要在每个扩展事件中都发生?

您可以使用特权容器 pod here 详细设置到 AKS 节点的 SSH。将 SSH-d 连接到节点后,对于 Linux 个节点,从不同的终端 shell 您可以使用以下命令将文件从本地计算机复制到 AKS 节点:

kubectl get pods
NAME                                                    READY   STATUS    RESTARTS   AGE
node-debugger-aks-nodepool1-xxxxxxxx-vmssxxxxxx-xxxxx   1/1     Running   0          21s

kubectl cp /source/path node-debugger-aks-nodepoolname-xxxxxxxx-vmssxxxxxx-xxxxx:/host/path/to/destination

[注意: 在目标中请记住在主机上添加所需的目标路径 /host]

如果是 Windows 个节点,一旦按照 here 详细设置了 SSH 连接,您可以使用以下方法将文件从本地机器复制到 Windows 节点:

scp -o 'ProxyCommand ssh -p 2022 -W %h:%p azureuser@127.0.0.1' /source/path azureuser@<node-private-IP>:/path/to/destination

Reference for kubectl cp command


I imagine every time it scales, the file previously copied will be available in every VM so this does not need to happen on every scale event?

相反,当 AKS 节点池横向扩展时,VMSS 实例 是从 VMSS 模型创建的。该模型由 Microsoft.ContainerService 资源提供者定义。有关 VMSS 模型和实例视图的更多信息 here.

当您对节点的文件系统进行任何更改时,更改应仅适用于相应的 VMSS 实例。如果节点进行节点映像升级、Kubernetes 版本升级或协调操作,则此类手动更改不会持久化。此外,如果此节点被 AKS 群集缩小,更改将丢失。

相反,我们建议使用 DaemonSets with Read-Write hostPath volume mounts where it can add files to on the host node. Since Daemonset is a Kubernetes construct and the Daemonset controller creates one replica of the Daemonset on each node (except virtual nodes; Reference),即使节点进行更新或协调操作,也应始终可用。当节点池扩展时,每个新节点也应获得 DaemonSet 的副本。


对于一般的 Azure 虚拟机规模集,在本地计算机和 Azure VMSS 实例之间复制文件的最简单方法是:

  • SCP:如果 VMSS 是使用 az vmss create 命令的 --public-ip-per-vm 参数创建的,或者使用 API 版本的 Microsoft.Compute/virtualMachineScaleSets 资源至少为 2017-03- 30,并向比例集 ipConfigurations 部分添加了 publicIpAddressConfiguration JSON 属性。例如:
     "publicIpAddressConfiguration": {
         "name": "pub1",
         "properties": {
          "idleTimeoutInMinutes": 15
         }
     }
    
  • 如果 VMSS 实例没有自己的 public IP 或从 Azure 负载均衡器(将 VMSS 作为其后端池)分配的 public IP 地址,则创建一个与 VMSS 在同一虚拟网络中的 jumpbox VM。您现在可以使用 jumpbox VM 的 public IP 在本地计算机和 jumpbox VM 之间以及使用私有 IP 地址在 jumpbox VM 和 VMSS 实例之间进行 SCP。