写点什么

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:45165

评论

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

实战案例丨GaussDB for DWS如何识别坏味道的SQL

华为云开发者社区

数据库 sql 算子

Spring-boot 单元测试

陈靓-哲露

数字资产钱包开发方案,区块链数字钱包软件源码

13530558032

本以为自己MySQL够牛逼了,直到亲自去阿里受虐了一次!

Java架构师迁哥

为什么企业需要CRM系统?CRM的作用及其重要性分析

力软.net/java开发平台

软件开发 信息化 CRM

QPS、TPS、RT、并发数、吞吐量理解和性能优化深入思考

艾小仙

架构 编程语言

从想当亿万富翁到职场、创业、爱情、抑郁、学医学武,我的程序人生

陆陆通通

Java 创业 程序员 爱情 程序员生活

LeetCode题解:622. 设计循环队列,使用双向链表,JavaScript,详细注释

Lee Chen

LeetCode 前端进阶训练营

Spring Boot CLI 介绍

hungxy

Spring Boot Spring Boot CLI

DDD+微服务实战:什么是DDD?

AI代笔

微服务 领域驱动设计 DDD

易观方舟Argo+CRM | 让企业数据发挥更大价值

易观大数据

面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

小林coding

乐观锁 高并发 操作系统 计算机基础

git的几种实用操作(合并代码与暂存复原代码)

良知犹存

git

跨专业学习6个月,成功上岸阿里|滴滴,分享学习路线供大家参考

小Q

Java 学习 架构 面试 基础

数字货币交易所技术开发,交易所源码

13530558032

银行数仓体系发展之路

易观大数据

数字经济时代来临 区块链护航数字资产安全

CECBC区块链专委会

金融 数字时代

入行架构师之前,这7项技能你要先了解一下

华为云开发者社区

架构 架构设计 架构师

智慧公安重点人员管控系统平台开发,智慧警务系统

13530558032

Java-技术专题-AQS和Volatile和Synchronized实现原理

李浩宇/Alex

TCP和HTTP中的KeepAlive机制总结

陈德伟

nginx TCP 性能 网络 HTTP

赞!腾讯T4分享web性能笔记,竟包含大量网络协议的优化技巧

周老师

Java 编程 程序员 架构 面试

Java程序员博客系统推荐!我调研了100来个 Java 开源博客系统,发现这 5 个最好用!

云流

Java 项目管理 计算机 框架设计

HTTP必知必会

陈靓-哲露

当代开发者的好帮手,浅析.NET敏捷开发框架的优势与特点

Philips

敏捷开发 软件开发 .net core 开发工具

未来已来!全球一流科技盛会——云栖大会9月17日线上隆重举办

北柯

区块链支付系统开发技术方案,USDT支付系统搭建

13530558032

Java异常面试题(2020最新版)

Java架构师迁哥

天猫成立房产部门,利用区块链承载交易多项服务功能

CECBC区块链专委会

区块链 房地产

区块链技术智能合约有哪些实际的应用场景

CECBC区块链专委会

智能合约 区块链技术

Java-技术专题-JMX超详细解读

李浩宇/Alex

NLP领域的2020年大事记及2021展望

NLP领域的2020年大事记及2021展望

Kubernetes dynamic provisioning 及 glusterfs 对接-InfoQ