工作节点之间的 Kubernetes 卷复制

问题描述

我有一个简单的网络应用,它使用 volume/persistent volume claim 从那里提供静态数据。 Pod 仅在卷所在的第一个工作节点上进行调度。 如果我想扩展 Pod 并将它们分配到所有可用节点,如何处理节点之间的 shared 卷?

      - name: app-Nginx
        image: Nginx:1.20.0
        command: ["/usr/sbin/Nginx","-g","daemon off;"]
        volumeMounts:
        - name: static-volume
          mountPath: "/opt/static"

      volumes:
      - name: static-volume
        persistentVolumeClaim:
          claimName: pvc-static

一种选择是使用 NFS 而不是在 EC2 实例上物理分配卷。 另一种方法是为每个 pod 复制静态文件(使用 init 容器将它们填充到适当的目录中),但这需要额外的时间并且对于大量静态数据不可行。

在 Kubernetes 中处理这种情况的正确方法是什么?有没有办法声明将使用逻辑上相同的卷但物理上位于不同节点上的不同实例的部署?

解决方法

您正在寻找的是支持 ReadOnlyManyReadWriteMany Access Mode

按照文档链接获取官方支持的列表。

如果您使用的是 AWS,那么通过 EFS 插件使用 NFS 可能是最简单的解决方案,但请考虑到它是基于 NFS 的解决方案这一事实,并且您可能会受到性能损失。

顺便说一句,您尝试做的事情对我来说就像是一种反模式。 应用程序的 Docker 映像应该是自包含的。在您的情况下,为静态网站提供服务的容器应该包含它需要的所有静态文件,以便完全可移植。这将完全不需要外部卷来存储数据。

,

是的,您说得对,一种选择是使用 NFS。您必须实现 ReadWriteManyReadOnlyManyhttps://stackoverflow.com/a/57798369/5525824

如果您有 ReadOnlyMany 的方案,您可以使用 GKEGCP 中创建 PVChttps://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/readonlymany-disks

但是,如果您希望进行写入操作,也可以选择使用文件系统NFS

如果不想使用任何托管服务并遵循 cloud-agnosticMinio

,您还可以签出实施 https://min.io/

NAS:https://github.com/minio/charts#nas-gateway

仅供仅供参考https://github.com/ctrox/csi-s3 性能可能不佳。