这是官方 GlusteFS for Kubernetes 存储库的link。此方法中使用了两个主要组件:GlusterFS 本身和 Heketi。
GlusterFS 是一个可扩展的分布式文件系统,它将来自多个服务器的磁盘存储资源聚合到一个全局命名空间中。 GlusterFS 中的卷由称为 Bricks 的块组成。砖块根据卷的类型位于不同的服务器上,卷有多种类型,有关它们的更多信息,您可以访问this link。
Heketi 提供了一个接口,可用于管理 GlusterFS 卷的生命周期。 Heketi 在 Kubernetes 中用于动态配置 GlusterFS 卷。
在存储库的示例中,使用了 3 个用于 GlusterFS 的节点,每个节点都有块设备。 topology.json Heketi 文件中提到的所有内容:
{
"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 卷
2. Kubernetes 将创建一个配置为使用 GlusterFS 卷的 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、Pods 等中使用 PersistentVolumeClaim。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 上查看此示例。