首页 > 解决方案 > 如何在 Kubernetes 中包含多个文件和文件夹的 pod 文件夹中挂载特定文件

问题描述

我正在尝试将包含 kubernetes pod 的多个文件和文件夹的文件夹中的特定文件挂载到主机的路径中作为备份。

我将 PersistentVolumeClaim 用作卷,并且能够挂载整个文件夹而不是该特定文件。并且可以通过主机路径访问此文件夹。

以下是我的部署、PVC 和 PV 文件。

部署文件:

containers:
- name: katana-db
  image: postgres:10.4
  imagePullPolicy: IfNotPresent
  envFrom:
  - configMapRef:
      name: war-config
  volumeMounts:
  - mountPath: /var/lib/postgresql/data
    name: katana-db
volumes:
- name: katana-db
  persistentVolumeClaim:
    claimName: katana-db-volume-claim

持久卷声明:

---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: katana-db-volume-claim
  namespace: {{ $.Values.namespace }}
  creationTimestamp: null
spec:
  storageClassName: manual
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 1Gi
  volumeName: "katana-db-volume"
---

持久卷:

---
kind: PersistentVolume
apiVersion: v1
metadata:
  name: katana-db-volume
  namespace: {{ $.Values.namespace }}
spec:
  storageClassName: manual
  capacity:
    storage: 2Gi
  persistentVolumeReclaimPolicy: Retain
  accessModes:
  - ReadWriteMany
  nfs:
    path: /mnt/k8sMount/data/local-persist/data/warrior/katana-db
    server: 167.254.204.64
---

我想挂载文件“/var/lib/postgresql/data/config.ini”而不是我在部署文件中提到的完整文件夹“/var/lib/postgresql/data”,以便我可以备份这个文件在我的主机中。

我找到了“hostpath”卷,但它似乎不适合 kubernetes 论坛建议的生产。

请让我知道我可以用来从 Pod 中的文件夹挂载特定文件的卷,以便我可以通过主机访问它。

标签: kubernetesnfs

解决方案


如果您的目标是将文件保存mounted到主机文件系统,那么hostPath使用它的主要缺点是,当您的 pod 终止时,它可能会被安排到不同的节点中。在这种情况下,数据将丢失。如果这很重要,您可以通过为节点设置适当的标签来解决此问题。

要挂载文件而不是目录,您可以subPath在此示例中使用:

    volumeMounts:
    - name: test
      mountPath: /var/lib/postgresql/data/config.ini
      subPath: config.ini

您还需要使用mountPath目录和文件名以及subPath带有文件名的字段。

hostPath您可以使用NFS服务器代替, 如果您必须在主机上安装它,您可以将其挂载nfs到其中。有了这个,您可以确保该卷的内容被保留。

然后就像在这个例子中那样安装服务器:

    volumeMounts:
    - name: test
      mountPath: /var/lib/postgresql/data/config.ini
      subPath: config.ini

  volumes:
    - name: nfs-volume
      nfs: 
        server: nfs.example.com # Change this to your NFS server
        path: /data # Change it to something relevant for your case

让我知道它是否有帮助。


推荐阅读