我正在尝试将Google Filestore备份到GCS存储桶。我还想将主要区域中的文件存储的内容重新同步到次要区域中的另一个文件存储。
为此,我创建了一个 bash 脚本,该脚本在计算引擎 VM 中运行良好。我已经将其转换为一个 docker 容器,我在 GKE 集群中作为 kubernetes cronjob 运行。
但是当我在 GKE pod 中运行脚本时,它给了我以下错误:
root@filestore-backup-1594023480-k9wmn:/# mount 10.52.219.10:/vol1 /mnt/filestore-primary
mount.nfs: access denied by server while mounting 10.52.219.10:/vol1
我能够从容器连接到文件存储:
root@filestore-backup-1594023480-k9wmn:/# telnet 10.52.219.10 111
Trying 10.52.219.10...
Connected to 10.52.219.10.
Escape character is '^]'.
容器 IP 范围也会添加到 VPC IP 范围。文件存储已被授予完全访问权限以允许 VPC。相同的脚本在计算引擎 VM 中工作正常。
为什么在 GKE pod 中挂载谷歌文件存储不起作用?
>bash脚本用于备份Google FileStore:#!/bin/bash
# Create the GCloud Authentication file if set
touch /root/gcloud.json
echo "$GCP_GCLOUD_AUTH" > /root/gcloud.json
gcloud auth activate-service-account --key-file=/root/gcloud.json
#backup filestore to GCS
DATE=$(date +"%m-%d-%Y-%T")
mkdir -p /mnt/$FILESHARE_MOUNT_PRIMARY
mount $FILESTORE_IP_PRIMARY:/$FILESHARE_NAME_PRIMARY /mnt/$FILESHARE_MOUNT_PRIMARY
gsutil rsync -r /mnt/$FILESHARE_MOUNT_PRIMARY/ gs://$GCP_BUCKET_NAME/$DATE/
#rsync filestore to secondary region
mkdir -p /mnt/$FILESHARE_MOUNT_SECONDARY
mount $FILESTORE_IP_SECONDARY:/$FILESHARE_NAME_SECONDARY /mnt/$FILESHARE_MOUNT_SECONDARY
rsync -avz /mnt/$FILESHARE_MOUNT_PRIMARY/ /mnt/$FILESHARE_MOUNT_SECONDARY/
所有变量都作为环境变量在 yaml 中传递。
无法访问它的原因是 GKE 使用文件存储的方法与其他 GCP 实例不同,为了能够挂载,您必须创建持久卷和持久卷声明。
-
如果只需要对文件存储进行一次静态访问,则可以按照本指南手动设置 PV 和 PVC 以附加到应用程序:
- 文件存储 - 从 GKE 群集访问文件共享
-
如果要使其更加动态并准备好更广泛地使用,请考虑使用 NFS 客户端配置程序。它将创建一个可以在您的 yaml 上引用的存储类。简而言之,
storageClass
为每个访问动态地配置 PV 和 PVC。您可以遵循本指南:- 如何使用 GKE + Helm 部署 GCP 文件存储
-
此外,您还可以使用文件存储 CSI 驱动程序使 GKE 工作负载能够动态创建和挂载文件存储卷,而无需使用 helm。但是,CSI 驱动程序不是受支持的 Google Cloud 产品,因此您应该考虑它是否适合您的生产环境:
- Kubernetes - GCP 文件存储 CSI 驱动程序
选择您的路径,如果您有任何问题,请在评论中告诉我。