Kubernetes emptyDir and symlinks



上下文

我有一个带有两个容器的 pod:

  • main其简单工作是显示目录的内容
  • 负责将 Blob 存储的内容同步到预定义目录中sidecar

为了使同步是原子同步,sidecar将 Blob 存储内容下载到新的临时目录中,然后在目标目录中切换符号链接。

目标目录使用emptyDir卷在两个容器之间共享。

问题

main具有符号链接,但无法列出后面的内容。

问题

如何访问最新的同步数据?

其他信息

原因

我尝试使用 Git-Sync 实现 Apache Airflow 正在完成的工作,但我需要从 Azure Blob 存储同步文件,而不是使用 Git。这是必要的,因为 (1) 我的内容主要是动态的,(2)azureFile卷类型存在一些严重的性能问题。

同步例程

declare -r container='https://mystorageaccount.dfs.core.windows.net/mycontainer'
declare -r destination='/shared/container'
declare -r temp_dir="$(mktemp -d)"
azcopy copy --recursive "$container/*" "$temp_dir"
declare -r temp_file="$(mktemp)"
ln -sf "$temp_dir" "$temp_file"
mv -Tf "$temp_file" "$destination"

我们最终得到的结果:

$ ls /shared
container -> /tmp/tmp.doGz2U0QNy
$ ls /shared/container
file1.txt file2.txt

溶液

我最初的尝试有两个错误:

  1. 卷中不存在符号链接目标
  2. 符号链接目标指向挎斗容器中的绝对路径,因此,从主容器的角度来看,该文件夹不存在

以下是修改后的例程:

declare -r container='https://mystorageaccount.dfs.core.windows.net/mycontainer'
declare -r destination='/shared/container'
declare -r cache_dir="$(dirname $destination)"
declare -r temp_dir="$(mktemp -d -p $cache_dir)"
azcopy copy --recursive "$container/*" "$temp_dir"
ln -sf "$(basename $temp_dir)" "$cache_dir/symlink"
mv -Tf "$cache_dir/symlink" "$destination"

符号链接只是一种包含文件名的特殊文件;它实际上并不以任何有意义的方式包含文件内容,也不必指向存在的文件。默认情况下,mktemp(1) 会在/tmp中创建目录,而该目录可能不在共享卷中。

想象一下,将一个物理文件夹放在物理文件柜中,在便利贴上写the third drawer at the very front,然后开车到另一栋楼,然后将便笺交给同事。 便利贴(符号链接)仍然存在,但在其他建筑物(容器文件系统)的上下文中,它命名的位置并不是特别有意义。

解决此问题的最简单方法是要求mktemp直接在目标卷中创建文件,然后创建相对路径符号链接。

# extract the volume location (you may already have this)
volume_dir=$(dirname "$destination")
# force the download location to be inside the volume
# (mktemp --tmpdir option)
temp_dir=$(mktemp -d --tmpdir "$volume_dir")
# actually do the download
azcopy copy --recursive "$container/*" "$temp_dir"
# set the symlink to a relative-path symlink, since the directory
# and the link are in the same place; avoids problems if the volume
# is mounted in different places in the two containers
ln -sf $(basename "$temp_dir") "$destination"

相关内容

  • 没有找到相关文章

最新更新