如何使同一 pod 上的其他容器可以访问 gcsfuse 挂载路径

如何使同一 pod 上的其他容器可以访问 gcsfuse 挂载路径

我们的目标是使用 gcsfuse 将 google bucket 内容挂载到某个路径,并与 pod 的其余部分共享此路径,因此我尝试以特权模式运行我们的 initContainer 来运行 gcsfuse 将 bucket 挂载到我们的 path1,在这个 initcontainer 内部,我可以在执行 ls -l 时看到 $path1 的内容

但是,如果我声明此路径 1 为 VolumnMounts 和 Volumn,其他容器将无法看到该路径 1 下的内容

除非我效仿https://github.com/ageapps/k8s-storage-buckets/tree/master/gcsfuse-init复制到其他文件夹并将该文件夹挂载为 VolumnMount

但是抄袭并不是我们的偏好,我们有更好的方法吗?

答案1

我并没有在 Kubernetes 中运行它,而是直接在 gcp vm 上运行容器。为了查看 gcsfuse 容器中的挂载,我还需要运行带有选项的第二个容器 --privileged --cap-add SYS_ADMIN

此外,当启动我的保险丝容器时,我通过添加此标志将挂载共享回主机--device /dev/fuse -v /data:/data:shared

希望这能够对您有所帮助,因为关于在容器中运行 gcsfuse 的信息并不多。

答案2

所以......在网上搜索不同的解决方案后,我相信这是最好的方法,有一个Github 问题以便稍后实现 PersistentVolume 保险丝挂载,但我们不知道什么时候才能实现。

基本上,链接上的解决方案描述了一种解决方法,我们使用 kubernetes 生命周期事件 postStart 和 preStop 来为我们执行挂载和卸载。

第一步是确保我们的容器中安装了 gcsfuse 二进制文件。

执行此操作的方法是首先创建 gcsfuse.repo 文件。

[gcsfuse]
name=gcsfuse (packages.cloud.google.com)
baseurl=https://packages.cloud.google.com/yum/repos/gcsfuse-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0

然后在你的docker文件中:

COPY gcsfuse.repo /etc/yum.repos.d/
RUN dnf -y install gcsfuse
RUN mkdir -p /etc/letsencrypt 

为了在 kubernetes 上执行 mount 命令,我们需要以 --privileged 身份运行 pod,并添加 SYS_ADMIN 功能

spec:
  ...
  template:
  ...
    spec:
    ... 
      containers:
      - name: my-container
        securityContext:
          privileged: true
          capabilities:
            add:
              - SYS_ADMIN
        lifecycle:
          postStart:
            exec:
              command: ["gcsfuse", "-o", "nonempty", "your-bucket-name", "/etc/letsencrypt"]
          preStop:
            exec:
              command: ["fusermount", "-u", "/etc/letsencrypt"]

要设置身份验证,你只需确保你的 GKE 集群是使用 OAuth 范围创建的https://www.googleapis.com/auth/devstorage.read_write,其余一切都将自动处理。

您的 GCS 存储将安装在您的 pod 的所有实例中,作为 ReadWriteMany,通过 fuse 共享存储,但您必须记住,此解决方案在写入存储桶时会很慢。

相关内容