如何使用Heketi和GlusterFS配置Kubernetes动态卷配置

时间:2020-02-23 14:30:17  来源:igfitidea点击:

Kubernetes中的动态卷配置允许按需创建存储卷,而无需管理员手动干预。当开发人员在没有动态配置的情况下进行部署时,群集管理员必须手动调用其云或者存储提供程序以创建新的存储卷,并从中创建PersistentVolume。

本教程将讨论如何使用GlusterFS分布式存储解决方案和Heketi RESTful管理界面在Kubernetes上实现动态卷配置。预计我们已经部署了Heketi和GlusterFS横向扩展网络添加存储文件系统。

对于Ceph,请检查:

使用Cephfs的Kubernetes的Ceph持久存储

使用Ceph RBD持久存储Kubernetes

如何在Kubernetes中配置Dynamic Provisioning

在Kubernetes中,动态卷供应基于API组storage.k8s.io中的API对象StorageClass。作为集群管理员,我们将根据需要定义尽可能多的StorageClass对象,每个对象都指定一个用于配置卷的卷插件(配置器)以及在配置时传递给该配置器的参数集。

因此,以下是我们使用Gluster和Heketi API在Kubernetes上配置动态卷配置的步骤。

设置GlusterFS和Heketi

在继续在Kubernetes端进行配置之前,预计我们将具有正在运行的Gluster和Heketi。请参阅下面的教程进行设置。

在CentOS 8/CentOS 7上使用Heketi设置GlusterFS存储

目前,我们只有CentOS教程,但是正在为Ubuntu/Debian系统编写部署教程。

对于容器化设置,请检查:使用GlusterFS和Heketi设置Kubernetes/OpenShift动态持久卷配置

安装完成后,请继续执行:

在Kubernetes上创建StorageClass对象

我们需要创建一个StorageClass对象以为容器平台用户启用动态预配置。 StorageClass对象定义在调用动态预配置时应使用哪个预配置器以及应将哪些参数传递给该预配置器。检查Heketi群集ID

$heketi-cli cluster list
Clusters:
Id:b182cb76b881a0be2d44bd7f8fb07ea4 [file][block]

创建Kubernetes秘密

获取Heketi管理员用户密码的base64格式。

$echo -n "PASSWORD" | base64

然后使用密码访问Heketi创建一个秘密。

$vim gluster-secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: heketi-secret
  namespace: default
type: "kubernetes.io/glusterfs"
data:
  # echo -n "PASSWORD" | base64
  key: cGFzc3dvcmQ=

其中:cGFzc3dvcmQ =是echo命令的输出。

通过运行以下命令创建密钥:

$kubectl create -f gluster-secret.yaml

确认秘密创建。

$kubectl get secret
NAME                                               TYPE                                  DATA   AGE
heketi-secret                                      kubernetes.io/glusterfs               1      1d

创建存储类

以下是使用Heketi的GlusterFS的示例StorageClass。

$cat glusterfs-sc.yaml
 kind: StorageClass
 apiVersion: storage.k8s.io/v1beta1
 metadata:
   name: gluster-heketi
 provisioner: kubernetes.io/glusterfs
 reclaimPolicy: Delete
 volumeBindingMode: Immediate
 allowVolumeExpansion: true
 parameters:
   resturl: "http://heketiserverip:8080" 
   restuser: "admin" 
   secretName: "heketi-secret"
   secretNamespace: "default"
   volumetype: "replicate:2"
   volumenameprefix: "k8s-dev"
   clusterid: "b182cb76b881a0be2d44bd7f8fb07ea4"

其中:gluster-heketi是要创建的StorageClass的名称。回收策略的有效选项是Retain,Delete或者Recycle。删除策略意味着当用户删除相应的PersistentVolumeClaim时,将自动删除动态预配置的卷。volumeBindingMode字段控制何时应进行卷绑定和动态预配置。有效选项是Instant&WaitForFirstConsumer。立即模式指示一旦创建PersistentVolumeClaim,便发生卷绑定和动态预配置。 WaitForFirstConsumer模式会延迟PersistentVolume的绑定和供应,直到创建使用PersistentVolumeClaim的Pod。resturl是heketi端点的URLheketi-secret是为Heketi凭据创建的密码。default是创建了secret的名称空间的名称。 2表示创建的Gluster卷的默认复制因子。要获得更多的HA,请使用3.volumenameprefix:默认情况下,动态预配置的卷具有vol_UUID格式的命名架构。我们从storageclass提供了所需的卷名。因此命名方案将是:volumenameprefix_Namespace_PVCname_randomUUIDb182cb76b881a0be2d44bd7f8fb07ea4是从命令" heketi-cli cluster list"获得的集群的ID。

可以设置的另一个参数是:

volumeoptions: "user.heketi.zone-checking strict"

默认设置/行为是:

volumeoptions: "user.heketi.zone-checking none"

这迫使Heketi严格将复制砖放置在不同区域。如果副本值设置为3,则必须在不同区域中存在的最小节点数为3.

创建文件后,运行以下命令创建StorageClass对象。

$kubectl create -f gluster-sc.yaml

确认创建StorageClass。

$kubectl get sc
NAME                            PROVISIONER                    AGE
glusterfs-heketi                kubernetes.io/glusterfs        1d
local-storage                   kubernetes.io/no-provisioner   30d

创建PersistentVolumeClaim对象

当用户请求动态预配置存储时,PersistentVolumeClaim中应包含一个存储类。

让我们创建一个1GB的存储请求:

$vim glusterfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: gluster-pvc
 annotations:
   volume.beta.kubernetes.io/storage-class: gluster-heketi
spec:
 accessModes:
  - ReadWriteMany
 resources:
   requests:
     storage: 1Gi

创建对象:

$kubectl create --save-config -f glusterfs-pvc.yaml

确认:

$kubectl get  pvc
NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
glusterfs-pvc    Bound     pvc-34b9b5e9-fbde-11e9-943f-00505692ee7e   1Gi        RWX            glusterfs-heketi  1d

创建后,可以在部署中使用它。要使用该卷,我们可以在任何Pod/Deployment的YAML文件中引用PVC,例如:

apiVersion: v1
kind: Pod
metadata:
  name: gluster-pod
  labels:
    name: gluster-pod
spec:
  containers:
  - name: gluster-pod
    image: busybox
    command: ["sleep", "60000"]
    volumeMounts:
    - name: gluster-vol
      mountPath: /usr/share/busybox 
      readOnly: false
  volumes:
  - name: gluster-vol
    persistentVolumeClaim:
      claimName: glusterfs-pvc