写点什么

Kubernetes dynamic provisioning 及 glusterfs 对接

2020 年 3 月 06 日

Kubernetes dynamic provisioning 及 glusterfs 对接

引言

传统的运维中,往往需要管理员手动先在存储集群分配空间,然后才能挂载到应用中去。Kubernetes 的最新版中,dynamic provisioning 升级到了 beta ,并支持多种存储服务的动态预配置,从而可以更有效地利用存储环境中的存储容量,达到按需使用存储空间的目的。本文将介绍 dynamic provisioning 这一特性,并以 GlusterFS 为例,说明存储服务与 k8s 的对接。


dynamic provisioning:

存储是容器编排中非常重要的一部分。Kubernetes 从 v1.2 开始,提供了 dynamic provisioning 这一强大的特性,可以给集群提供按需分配的存储,并能支持包括 AWS-EBS、GCE-PD、Cinder-Openstack、Ceph、GlusterFS 等多种云存储。非官方支持的存储也可以通过编写 plugin 方式支持。


在没有 dynamic provisioning 时,容器为了使用 Volume,需要预先在存储端分配好,这个过程往往是管理员手动的。在引入 dynamic provisioning 之后,Kubernetes 会根据容器所需的 volume 大小,通过调用存储服务的接口,动态地创建满足所需的存储。


Storageclass:

管理员可以配置 storageclass,来描述所提供存储的类型。以 AWS-EBS 为例,管理员可以分别定义两种 storageclass:slow 和 fast。slow 对接 sc1(机械硬盘),fast 对接 gp2(固态硬盘)。应用可以根据业务的性能需求,分别选择两种 storageclass。


Glusterfs:

一个开源的分布式文件系统,具有强大的横向扩展能力,通过扩展能够支持数 PB 存储容量和处理数千客户端。GlusterFS 借助 TCP/IP 或 InfiniBandRDMA 网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。


Heketi:

Heketi(https://github.com/heketi/heketi),是一个基于 RESTful API 的 GlusterFS 卷管理框架。


Heketi 可以方便地和云平台整合,提供 RESTful API 供 Kubernetes 调用,实现多 glusterfs 集群的卷管理。另外,heketi 还有保证 bricks 和它对应的副本均匀分布在集群中的不同可用区的优点。


部署基于 GlusterFS 的 dynamic provisioning

1、安装 GlusterFS。可以参见官方文档,在此不赘述。


2、部署 heketi。本文将以容器化的形式部署 heketi。heketi 的 yaml 如下:


apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: heketi  labels:    app: heketispec:  replicas: 1  template:    metadata:      labels:        app: heketi    spec:      containers:      - name: heketi        image:caicloud: heketi        ports:        - containerPort: 8080        volumeMounts:        - mountPath: /etc/heketi          name: heketi-volume        - mountPath: /root/.ssh          name: ssh-volume      volumes:      - name: ssh-volume        hostPath:          path: /root/.ssh # This node must be able to ssh to other nodes.      - name: heketi-volume        hostPath:          path: /root/heketi      nodeName: {{heketi_node}} # Pinned to node
复制代码


等 heketi 开始成功运行后,需要将 glusterfs 集群的配置载入,可以通过 curl api 的形式,也可以通过 heketi 的客户端来载入,如 ./heketi-cli load --json=new-cluster.json。new-cluster.json 中定义了 glusterfs 集群的各个节点 IP、可用分区等信息。典型的配置例子:https://github.com/heketi/heketi/blob/master/client/cli/go/topology-sample.json


注意事项:

Heketi 需要使用能够免密 ssh 到 glusterfs 集群所有节点的私钥,并且 heketi 会在 glusterfs 集群将指定的分区格式化, 并调用 pvcreate 和 lvcreate 将分区组装成 volume group。


3、部署 StorageClass


apiVersion: storage.k8s.io/v1beta1kind: StorageClassmetadata: name: glusterfs-rep3provisioner: kubernetes.io/glusterfsparameters: resturl: "http://192.168.1.111:8081" //heketi地址,也可以填域名 clusterid: "630372ccdc720a92c681fb928f27b53f" // 可选,要使用的集群id restuser: "admin" // 可选,authentication 的用户名 secretNamespace: "default" // 可选,authentication 的密码所在的 secret 所在的namespace secretName: "heketi-secret" // 可选,authentication 的密码所在的 secret gidMin: "40000" // 能够使用的最小gid,可选,每个 gluster volume 都有唯一的 gid gidMax: "50000" // 能够使用的最大gid,可选 volumetype: "replicate:3" // 可选,glusterfs 的 volume 类型,数字为副本的数量
复制代码


这里 volumetype 填了 replicate:3,同理,我们也可以定义其他卷类型的 storageclass,比如 disperse:4:2,表示使用纠错卷(disperse),每 4 份 brick 做 2 份冗余。volumetype: none 将会默认使用分布式卷。


4、创建 PVC(Persistent Volume Claim),指定 storageclass,并声明所需存储大小。


apiVersion: v1kind: PersistentVolumeClaimmetadata: name: gluster-pvc-10G annotations:   volume.beta.kubernetes.io/storage-class: glusterfs-rep3 // 指定storageclassspec: accessModes:  - ReadWriteMany // 可以被多个pod挂载读写 resources:   requests:     storage: 10Gi // 指定使用10G大小的存储
复制代码


创建 pvc 后,Kubernetes 会调用 heketi 的 create volume API。之后 heketi 将会去检查 glusterfs 集群的可用空间。本文指定了 rep3 的 storageclass, 所以需要 3 个节点有至少 10G 的可用磁盘空间。如果满足条件,Kubernetes 则会创建相应大小的 PV (Persistent Volume),并绑定该 PVC。否则,该 PVC 将一直停留在 pending 状态。


本文指定了 3 个副本的 gluster 存储,其实只要将 annotations 中的 storageclass 换个名字,应用就可以使用其他类型的存储,非常方便。


5、验证


PVC 成功绑定 PV 后,可以让应用使用该 PVC 作为存储。我们可以新建一个 debian 的 pod,用来验证,yaml 如下:


apiVersion: v1kind: Podmetadata:  name: gluster-testerspec:  containers:  - name: glusterfs    image: cargo.caicloud.io/caicloud/debian:jessie    volumeMounts:    - mountPath: "/mnt/gluster"      name: test-vol    args:    - tail    - "-f"    - "/dev/null"  volumes:  - name: test-vol    persistentVolumeClaim:      claimName: gluster-pvc-10G
复制代码


通过 kubectl exec 进入该容器的终端后,就可以在 /mnt/glusterfs 目录下使用 10G 的 glusterfs 存储。因为 gluster-pvc-10G 是 ReadWriteMany(可以被多个 pod 挂载读写)的,所以可以在其他应用中也使用这个 PVC,达到数据共享的目的。


总结

可以看到,有使用存储需求的应用,都只需要声明大小,指定 storageclass,Kubernetes 就可以动态地配置相应大小的存储,应用完全的不需要底层存储的细节。


最后,glusterfs/heketi 相关的 yaml 和部署说明可以在 https://github.com/heketi/heketi/tree/master/extras/kubernetes 找到。


本文转载自才云 Caicloud 公众号。


原文链接:https://mp.weixin.qq.com/s/5U1w4z-l5JTPgAeb1pp8pA


2020 年 3 月 06 日 20:45213

评论

发布
暂无评论
发现更多内容

集成融云小程序 SDK 遇到的问题

融云 RongCloud

通过融云 WebSDK 简单了解 WebSocket

融云 RongCloud

融云 CallLib 集成遇到的问题

融云 RongCloud

融云 AMR(Aduio) 播放 AMR 格式 Base64 码音频

融云 RongCloud

关于融云 SDK 在使用 p8 证书的坎坷~

融云 RongCloud

作为小白接融云 IM SDK 新路体验~

融云 RongCloud

提醒小程序的产品文档——大作业心得总结

Sicolas Flamel

产品经理 随笔杂谈 产品经理训练营 极客大学产品经理训练营

区块链农产品溯源方案,区块链溯源平台

13530558032

区块链版权保护平台--催生版权保护新格局

13530558032

融云发送语音消息

融云 RongCloud

如何利用融云 IMLib 来实现一个阅后即焚功能

融云 RongCloud

结合融云 WebSDK 了解 WebSocket 基本原理

融云 RongCloud

Web 端使用融云 SDK 集成实现滑动加载历史消息

融云 RongCloud

融云IM SDK web 端集成 — 表情采坑篇

融云 RongCloud

使用融云 IM SDK 实现 H5 直播聊天

融云 RongCloud

使用融云 Web SDK 撤回消息

融云 RongCloud

SDK 兼容 JSON

融云 RongCloud

融云自定义消息不显示

融云 RongCloud

融云 Web SDK 如何实现语音的收发 ?

融云 RongCloud

融云 Web SDK 删除历史消息

融云 RongCloud

加快数字化发展 建设数字中国

CECBC区块链专委会

大数据

几张图解释明白 Istio!

xcbeyond

Service Mesh istio 3月日更

融云会话页面刷新不及时问题

融云 RongCloud

融云 RTC SDK 集成实现直播,趟坑之旅~~~

融云 RongCloud

集成融云 SDK 怎么实现多端同步未读数

融云 RongCloud

Web 端集成融云 SDK 如何发送正确图片消息给移动端展示?

融云 RongCloud

平安智慧社区解决方案,平安社区综合管理平台

13530558032

集成融云 Web 音视频通话踩坑之旅

融云 RongCloud

融云 Web SDK 如何实现表情的收发 ?

融云 RongCloud

如何开好每日晨会?

石云升

项目管理 28天写作 职场经验 管理经验 3月日更

微信小程序集成融云 SDK (即时通讯) 集成必备条件

融云 RongCloud

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

Kubernetes dynamic provisioning 及 glusterfs 对接-InfoQ