NFS-PV、NFS 上的 hostPath-PV 和部署中的 hostPath 挂载之间的区别

raz*_*azr 5 nfs kubernetes persistent-volumes

我有一个 Kubernetes 集群设置(本地),它在/exports/backup每个节点上安装了一个 NFS 共享 (my-nfs.internal.tld) 以在此处创建备份。

现在我正在设置我的日志记录堆栈,我想让数据持久化。所以我想我可以先将索引存储在 NFS 上。

现在我发现了三种不同的方法来实现这一目标:

NFS-PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: logging-data
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: my-nfs.internal.tld
    path: /path/to/exports/backup/logging-data/
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: logging-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: logging-data
  resources:
    requests:
      storage: 10Gi
Run Code Online (Sandbox Code Playgroud)
apiVersion: apps/v1
kind: Deployment
...
spec:
  ...
  template:
    ...
    spec:
      ...
      volumes:
        - name: logging-data-volume
          persistentVolumeClaim:
            claimName: logging-data-pvc
Run Code Online (Sandbox Code Playgroud)

当然,这需要我的集群能够访问 NFS(而不是仅访问当前设置的节点)。

主机路径PV

apiVersion: v1
kind: PersistentVolume
metadata:
  name: logging-data
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /exports/backup/logging-data/
Run Code Online (Sandbox Code Playgroud)
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: logging-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: logging-data
  resources:
    requests:
      storage: 10Gi
Run Code Online (Sandbox Code Playgroud)
apiVersion: apps/v1
kind: Deployment
...
spec:
  ...
  template:
    ...
    spec:
      ...
      volumes:
        - name: logging-data-volume
          persistentVolumeClaim:
            claimName: logging-data-pvc
Run Code Online (Sandbox Code Playgroud)

部署中的hostPath挂载

由于 nfs 已安装到我的所有节点,因此我也可以直接在部署中使用主机路径,而无需固定任何内容。

apiVersion: apps/v1
kind: Deployment
...
spec:
  ...
  template:
    ...
    spec:
      ...
      volumes:
        - name: logging-data-volume
          hostPath:
            path: /exports/backup/logging-data
            type: DirectoryOrCreate
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:这三者之间真的有什么区别吗?我很确定这三个都有效。我已经测试了第二个和第三个。不过,我还无法测试第一个(至少在这个特定设置中)。特别是第二个和第三个解决方案对我来说非常相似。我认为,第二个可以更轻松地在多个集群上重用部署文件,因为您可以使用不同类型的持久卷,而无需更改volumes部署的部分。但除此之外还有什么区别吗?也许是性能?或者其中之一已被弃用并将很快被删除?

我发现一个教程提到,hostPath-PV 仅适用于单节点集群。但我确信它也适用于我的情况。也许评论是关于:“在多节点集群上,当部署到不同节点时,数据会发生变化。”

通过阅读大量文档和操作方法,我了解到第一个是首选解决方案。我可能也会选择它,因为它是最容易复制到云设置的一种。但我真的不明白为什么这个比其他两个更受欢迎。

预先感谢您对此事的意见!

OhH*_*ark 1

NFS确实首选解决方案:

nfs允许将现有的 NFS(网络文件系统)共享挂载到 Pod 中。emptyDir与删除 Pod 时会被擦除的不同,nfs卷的内容会被保留,而卷只是被卸载。这意味着 NFS 卷可以预先填充数据,并且数据可以在 Pod 之间共享。NFS 可以由多个写入器同时挂载。

因此,NFS 很有用,原因有两个:

  • 数据是持久的。

  • 可以同时从多个Pod访问,并且可以在Pod之间共享数据。

请参阅 NFS示例有关更多详细信息,

而主机路径

AhostPath将主机节点文件系统中的文件或目录挂载到 Pod 中。

由于节点上的文件不同,具有相同配置的 Pod(例如从 PodTemplate 创建的 Pod)在不同节点上的行为可能会有所不同

在底层主机上创建的文件或目录只能由 root 写入。您需要在特权容器中以 root 身份运行进程,或者修改主机上的文件权限以便能够写入hostPath

hostPath不推荐,有以下几个原因:

  • 您无法直接控制 pod 将在哪个节点上运行,因此无法保证 pod 实际上会调度到具有数据量的节点上。

  • 您使集群面临安全威胁。

  • 如果某个节点出现故障,您需要将 pod 调度到本地配置的卷不可用的其他节点上。

例如hostPath,如果您想将它用于在DaemonSet. 除此之外,最好使用 NFS。