在Kubernetes中导出的​​NFS目录中创建和挂载子目录

时间:2020-07-07 08:00:29

标签: kubernetes nfs

我有一个带有文件夹/mnt/kubernetes-volumes/的文件服务器。在此文件夹中,我为应用程序的每个用户提供子目录:

  • /mnt/kubernetes-volumes/customerA
  • /mnt/kubernetes-volumes/customerB
  • /mnt/kubernetes-volumes/customerC

在每个客户文件夹中,我有两个文件夹用于数据存储的应用程序:

  • /mnt/kubernetes-volumes/customerA/elastic
  • /mnt/kubernetes-volumes/customerA/postgres

我有一个Kubernetes配置文件,该文件指定了持久卷和声明。它们会安装到elasticpostgres文件夹中。

# Create a volume on the NFS disk that the postgres db can use. 
apiVersion: v1
kind: PersistentVolume
metadata:
  namespace: customerA
  name: postgres-pv
  labels:
    name: postgres-volume 
spec:
  storageClassName: manual 
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 1.2.3.4 # ip addres of nfs server
    path: "/mnt/kubernetes-volumes/customerA/postgres" 

---

# And another persistent volume for Elastic

当前,我的/etc/exports文件如下所示:

/mnt/kubernetes-volumes/customerA/postgres 10.0.0.1(rw,sync,no_subtree_check,no_root_squash)
/mnt/kubernetes-volumes/customerA/elastic 10.0.0.1(rw,sync,no_subtree_check,no_root_squash)
/mnt/kubernetes-volumes/customerA/postgres 10.0.0.2(rw,sync,no_subtree_check,no_root_squash)
/mnt/kubernetes-volumes/customerA/elastic 10.0.0.2(rw,sync,no_subtree_check,no_root_squash)


/mnt/kubernetes-volumes/customerB/postgres 10.0.0.1(rw,sync,no_subtree_check,no_root_squash)
/mnt/kubernetes-volumes/customerB/elastic 10.0.0.1(rw,sync,no_subtree_check,no_root_squash)
/mnt/kubernetes-volumes/customerB/postgres 10.0.0.2(rw,sync,no_subtree_check,no_root_squash)
/mnt/kubernetes-volumes/customerB/elastic 10.0.0.2(rw,sync,no_subtree_check,no_root_squash)

对于每个客户,我分别为Kubernetes集群中的每个节点分别导出postgreselastic文件夹。这按预期工作。但是,现在我必须为每个新客户将行手动添加到etc/exports文件中。可能只有两行是这样的吗?

/mnt/kubernetes-volumes/ 10.0.0.1(rw,sync,no_subtree_check,no_root_squash)
/mnt/kubernetes-volumes/ 10.0.0.2(rw,sync,no_subtree_check,no_root_squash)

并自动让Kubernetes在kubernetes-volumes目录内创建正确的子目录(客户,postgres和elastic)并挂载它们?

1 个答案:

答案 0 :(得分:1)

Kubernetes本身不能在节点上执行系统命令,您需要使用一些外部工具,例如bash脚本。

您只能在容器中使用路径/mnt/kubernetes-volumes/,并且可以使用环境变量来传递客户名称,但这将使所有其他Pod都可以访问所有数据,这不是一个好主意。

此外,您可以尝试使用HELM templates使用客户名称作为变量来创建persistentVolumes