我们的目标是使用 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 共享存储,但您必须记住,此解决方案在写入存储桶时会很慢。