如何使用Heketi和GlusterFS配置Kubernetes动态卷配置
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