工作节点之间的 Kubernetes 卷复制

Kubernetes volume duplication between worker nodes

我有一个简单的 Web 应用程序,它使用 volume/persistent volume claim 从那里提供静态数据。 Pods 仅安排在卷所在的第一个工作节点上。 如果我想扩展 pods 并将它们分配给所有可用节点,如何处理节点之间的 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.

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

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

附带说明一下,您尝试做的事情对我来说就像一种反模式。 Docker 应用程序的图像应该是独立的。在您的情况下,拥有一个服务于静态网站的容器应该包含它需要的所有静态文件,以便完全可移植。这将完全消除对具有数据的外部卷的需要。

是的,您是对的,一种选择是使用 NFS。您必须实施 ReadWriteManyReadOnlyMany

如果您有 ReadOnlyMany 场景,您可以在 GCP 中创建 PVC GKEhttps://cloud.google.com/kubernetes-engine/docs/how-to/persistent-volumes/readonlymany-disks

但是,如果您希望执行 write 操作,那么可用的选项是使用 FileSystemNFS.

您还可以结帐实施 Minio if not want to use any managed service and following cloud-agnostic : https://min.io/

网络存储:https://github.com/minio/charts#nas-gateway

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