【问题标题】:Difference between NFS-PV, hostPath-PV on NFS and hostPath mount in deploymentNFS-PV、NFS 上的 hostPath-PV 和部署中的 hostPath 挂载之间的区别
【发布时间】:2021-01-04 19:48:16
【问题描述】:

我有一个 Kubernetes 集群设置(本地),它在每个节点上都有一个 NFS 共享 (my-nfs.internal.tld) 挂载到 /exports/backup 以在那里创建备份。

现在我正在设置我的日志堆栈,我想让数据持久化。所以我想我可以先将索引存储在 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/
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: logging-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: logging-data
  resources:
    requests:
      storage: 10Gi
apiVersion: apps/v1
kind: Deployment
...
spec:
  ...
  template:
    ...
    spec:
      ...
      volumes:
        - name: logging-data-volume
          persistentVolumeClaim:
            claimName: logging-data-pvc

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

hostPath-PV

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

部署中的hostPath挂载

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

apiVersion: apps/v1
kind: Deployment
...
spec:
  ...
  template:
    ...
    spec:
      ...
      volumes:
        - name: logging-data-volume
          hostPath:
            path: /exports/backup/logging-data
            type: DirectoryOrCreate

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

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

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

提前感谢您对此事的意见!

【问题讨论】:

    标签: kubernetes nfs persistent-volumes


    【解决方案1】:

    NFS 确实是首选解决方案:

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

    因此,NFS 之所以有用有两个原因:

    • 数据是持久的。

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

    有关详细信息,请参阅 NFS example

    hostPath

    hostPath 卷从主机节点的 文件系统到你的 Pod 中。

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

    在底层主机上创建的文件或目录仅 根可写。您要么需要以 root 身份运行您的进程 特权容器或修改主机上的文件权限为 能够写入hostPath

    不推荐hostPath有几个原因:

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

    • 您将集群暴露在安全威胁之下。

    • 如果一个节点出现故障,您需要将该 pod 安排在其他节点上,您的本地配置卷将不可用。

    hostPath 会很好,例如,如果您想将它用于在 DaemonSet 中运行的日志收集器。除此之外,最好使用 NFS。

    【讨论】:

    • 好的,但正如您从我的帖子中看到的,我在所有三种情况下都使用 NFS。只有在两种情况下,我安装了主机安装 NFS 共享的路径。因此,您的两点 (i) 数据是持久的,并且 (ii) 可以从多个 pod 访问(也 (iii) 可以预先填充)对于所有三个都是正确的。此外,由于 NFS 安装在所有工作节点上,我规避了“您不能保证 Pod 将实际安排在具有数据量的节点上”的问题。
    • 是的,但是没有必要同时使用 NFS 和 hostPath,而且可能会浪费资源。此外,它仍然容易受到安全威胁。更推荐的方法是简单地使用 dynamic volume provisioner 为您创建匹配的 PersistentVolume。您提到了 Cloud,例如 GCP 有 Persistent volumes and dynamic provisioning
    • 嗯。我知道云提供商有他们提供持久卷的方法。我已经使用了很多安静的方法。对于 NFS 与 NFS-on-hostPath:这正是我所说的“我不知道为什么”的意思。我总是阅读声明,这是更好的解决方案。我只是不明白为什么 :( 例如,为什么这可能会浪费资源。以及为什么我的集群容易受到安全威胁。您能详细说明一下吗?或提供一些进一步的阅读材料?
    • 例如,如果您的 pod 被黑客入侵,并且黑客通过写入 hostPath 访问您的主机,那么您的整个集群实际上都被黑客入侵了。此外,您可以使用 NFS-on-hostPath,当然,但为什么呢?直接使用 NFS 共享而不是将其用作hostPath,这样您就不必自己管理在主机上安装 NFS 或管理本地卷。一般来说,这更容易,因此您会发现许多意见指向该解决方案。
    • 我为什么选择 NFS-on-host 的一个例子是,我不负责 NFS。它只能从主机访问,而不能从 K8s 访问。另一个可能是,也许我的主机 NFS 实现比 K8s 更好/更快/更高性能。不是说是,但谁知道呢。我没试过:)
    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 2019-09-27
    • 2021-06-09
    • 2021-06-19
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多