GlusterFS 在 Kubernetes 集群中究竟是如何工作的?

How the GlusterFS exactly working in Kubernetes cluster?

我在使用 DaemonSet Ubuntu 安装的 GlusterFS 上的 Kubernetes 集群中使用 GlusterFS 卷插件。

我不知道数据是怎么挂载的? PVC 或 PV 是否复制到每个 kubernetes worker 或在 topology.json 中为每个 worker 节点配置的磁盘是否可在集群中共享?看了文档,没搞清楚

GlusterFS 是如何工作的?

这是官方 GlusteFS for Kubernetes 存储库的 link。这种方法使用了两个主要组件:GlusterFS 本身和 Heketi。

GlusterFS 是一个可扩展的分布式文件系统,它将来自多个服务器的磁盘存储资源聚合到一个全局命名空间中。 GlusterFS 中的卷由称为 Brick 的块组成。根据 Volume 的类型,Brick 位于不同的服务器上,有多种类型的 Volume,有关它们的更多信息,您可以访问 this link.

Heketi 提供了一个接口,可用于管理 GlusterFS 卷的生命周期。 Heketi 在 Kubernetes 中用于动态配置 GlusterFS 卷。

在存储库的示例中,使用了 3 个 GlusterFS 节点,每个节点都有块设备。 Heketi 的 topology.json 文件中提到的所有内容:

{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "node0"
              ],
              "storage": [
                "192.168.10.100"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdb",
            "/dev/vdc",
            "/dev/vdd"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "node1"
              ],
              "storage": [
                "192.168.10.101"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdb",
            "/dev/vdc",
            "/dev/vdd"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "node2"
              ],
              "storage": [
                "192.168.10.102"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/vdb",
            "/dev/vdc",
            "/dev/vdd"
          ]
        }
      ]
    }
  ]
}

这些节点也是 Kubernetes 节点,您可以将所有 Kubernetes 节点用作 GlusterFS 的服务器,但节点的最小数量是三个。

Heketi 将格式化发布在 topology.json 文件中的块设备并将它们包含到 GlusterFS 集群中。

之后,您需要创建一个 Kuberntes StorageClass 来动态提供 GlusterFS 卷。 Kubernetes 的 Yaml 文件示例:

apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: gluster-heketi
provisioner: kubernetes.io/glusterfs
parameters: #Here are the setting for access to Heketi RESTapi
  resturl: "http://10.42.0.0:8080" 
  restuser: "joe" 
  restuserkey: "My Secret Life"  

现在您可以使用对 StorageClass 的请求来创建 PersistentVolumeClaim。此操作将触发三个进程:
1. Kubernetes 将使用 Heketi
创建一个 GlusterFS Volume 2. Kubernetes 将创建一个配置为使用 GlusterFS Volume
的 PersistentVolume 3. Kubernetes会将PersistentVolume分配给PersistentVolumeClaim

示例如下:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: gluster1
 annotations:
   volume.beta.kubernetes.io/storage-class: gluster-heketi 
spec:
 accessModes:
  - ReadWriteOnce
 resources:
   requests:
     storage: 5Gi

之后可以在Kubernetes Deployments中使用PersistentVolumeClaim,Pods等Pod配置示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod1
  labels:
    name: nginx-pod1
spec:
  containers:
  - name: nginx-pod1
    image: gcr.io/google_containers/nginx-slim:0.8
    ports:
    - name: web
      containerPort: 80
    volumeMounts:
    - name: gluster-vol1
      mountPath: /usr/share/nginx/html
  volumes:
  - name: gluster-vol1
    persistentVolumeClaim:
      claimName: gluster1 <1>

有关详细信息,您可以在 link.

上查看此示例