Kubernetes dynamic provisioning 及 glusterfs 对接

简介: 引言 传统的运维中,往往需要管理员手动先在存储集群分配空间,然后才能挂载到应用中去。Kubernetes 的最新版中,dynamic provisioning 升级到了 beta ,并支持多种存储服务的动态预配置,从而可以更有效地利用存储环境中的存储容量,达到按需使用存储空间的目的。

引言

传统的运维中,往往需要管理员手动先在存储集群分配空间,然后才能挂载到 应用中去。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/v1beta1
kind: Deployment
metadata:
name: heketi
labels:
app: heketi
spec:
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/v1beta1
kind: StorageClass
metadata:
name: glusterfs-rep3
provisioner: kubernetes.io/glusterfs
parameters:
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: v1
kind: PersistentVolumeClaim
metadata:
name: gluster-pvc-10G
annotations:
volume.beta.kubernetes.io/storage-class: glusterfs-rep3 // 指定storageclass
spec:
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: v1
kind: Pod
metadata:
name: gluster-tester
spec:
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 找到。

本文转自中文社区-在阿里云上部署生产级别Kubernetes集群

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
存储 Kubernetes 对象存储
Kubernetes版本对接对象存储几种方案
Kubernetes版本对接对象存储几种方案
201 0
|
5月前
|
存储 Kubernetes API
k8s教程(Volume篇)-动态存储管理案例(GlusterFS)
k8s教程(Volume篇)-动态存储管理案例(GlusterFS)
74 0
|
存储 Kubernetes API
k8s 动态存储管理案例(GlusterFS)
k8s GlusterFS动态存储管理案例
551 0
|
存储 JSON Kubernetes
k8s配置glusterFS详解
k8s配置glusterFS详解
|
Kubernetes 开发工具 git
基于drone的CI/CD,对接kubernetes实践教程
CI 概述 用一个可描述的配置定义整个工作流 程序员是很懒的动物,所以想各种办法解决重复劳动的问题,如果你的工作流中还在重复一些事,那么可能就得想想如何优化了 持续集成就是可以帮助我们解决重复的代码构建,自动化测试,发布等重复劳动,通过简单一个提交代码的动作,解决接下来要做的很多事。
3532 0
|
Kubernetes 容器 Perl
阿里云自建k8s对接SLB
参考链接:https://github.com/kubernetes/cloud-provider-alibaba-cloud/blob/master/docs/getting-started.md
|
存储 Kubernetes Dubbo
Dubbo 3.0 前瞻之对接 Kubernetes 原生服务
Dubbo 与 Kubernetes 的调度体系的结合,可以让原本需要管理两套平台的运维成本大大减低,而且 Dubbo 适配了 Kubernetes 原生服务也可以让框架本身更加融入云原生体系。基于 Dubbo 3.0 的全新应用级服务发现模型可以更容易对齐 Kubernetes 的服务模型。
Dubbo 3.0 前瞻之对接 Kubernetes 原生服务
|
Web App开发 存储 算法
Rainbond 5.0正式发布, 支持对接管理已有Kubernetes集群
Rainbond 5.0正式发布, 支持对接管理已有Kubernetes集群 ​ 今天非常高兴向大家宣布Rainbond v5.0正式发布,Rainbond是开源的企业应用云操作系统,支撑企业应用开发、架构、交付和运维的全流程,通过无侵入架构,无缝衔接各类企业应用,底层资源可以对接和管理IaaS、虚拟机和物理服务器。
|
存储 Kubernetes 应用服务中间件
k8s使用glusterfs实现动态持久化存储
简介 本文章介绍如何使用glusterfs为k8s提供动态申请pv的功能。glusterfs提供底层存储功能,heketi为glusterfs提供restful风格的api,方便管理glusterfs。
2439 0