在Kubernetes集群中存储数据的位置

3

由复制控制器控制并“隐藏”在Kubernetes服务后面的Pod如何写入/读取数据?如果我有一个需要持久保存用户上传图片的应用程序,那么我该把它存储在哪里?由于服务在前面,如果我使用卷,则无法控制其存储在哪个节点上。

3个回答

4
我认为对于你的问题,“简单”的答案是,你需要在Kubernetes集群下拥有共享存储,这样每个pod都可以访问相同的数据。然后,无论pod在何处运行以及哪个pod实际执行服务都不重要。
也许另一种解决方案是Flocker,他们简要地描述了自己:
“Flocker是一个数据卷管理器和多主机Docker集群管理工具。通过利用Linux上ZFS的强大功能,您可以使用与无状态应用程序相同的工具来控制数据。”
总之,我认为在Kubernetes或任何其他docker化基础架构中的存储问题非常有趣。
看起来Google App Engine默认情况下不支持在应用程序之间共享数据存储,正如他们在SO Question中指出的那样。

我该如何在Kubernetes下设置共享存储?多个Pod如何将数据读写到同一个存储中? - LuckyLuke
我对Hadoop了解不多,但我是否应该使用类似的东西?Google没有提供解决方案吗?或者是NFS值得考虑的东西? - LuckyLuke
我认为你需要将这两个东西解耦,这样你就可以拥有一个共享存储(如Hadoop、Ceph等),并且你可以运行你的服务。你可以通过NFS轻松地挂载相同的卷作为示例。在这种情况下,有趣的是如何处理多个服务的访问控制。那么像Google Cloud Storage这样的东西怎么样?你也可以使用NFS,因为你可以保证每个pod都可以访问相同的存储。 - joh.scheuer

3
如果您正在使用Google Compute Engine,您可以使用绑定到Pod并随Pod移动的Compute Engine持久磁盘(网络附加存储)。

https://kubernetes.io/docs/concepts/storage/volumes/#gcepersistentdisk

我们希望支持其他类型的网络附加存储(iSCSI,NFS等),但我们还没有机会构建它们。欢迎提交拉取请求!;)

0

GKE 允许您创建磁盘来存储数据,并且此存储区域可以链接到多个 Pod。请注意,您的集群和磁盘必须在同一区域/地区。

gcloud compute disks create disk1 --zone=zone_name

现在您可以使用此磁盘来存储来自Pod的数据。 这是一个简单的MongoDB ReplicationController YAML文件,它使用Disk1。这可能不是最有效的方法,但这是我知道的最简单的方法。

apiVersion: v1
kind: ReplicationController
metadata:
  labels:
    name: mongo
  name: mongo-controller
spec:

 replicas: 1
  template:
    metadata:
      labels:
        name: mongo
    spec:
      containers:
      - image: mongo
       name: mongo
        ports:
        - name: mongo
          containerPort: 27017
          hostPort: 27017
        volumeMounts:
            - name: mongo-persistent-storage
              mountPath: /data/db
      volumes:
        - name: mongo-persistent-storage
          gcePersistentDisk:
            pdName: disk1
            fsType: ext4

即使您的 Pod 被删除或替换,磁盘 1 仍将存在。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接