简介

本文章介绍如何使用glusterfs为k8s提供动态申请pv的功能。glusterfs提供底层存储功能,heketi为glusterfs提供restful风格的api,方便管理glusterfs。支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ,ReadWriteMany

访问模式只是能力描述,并不是强制执行的,对于没有按pvc声明的方式使用pv,存储提供者应该负责访问时的运行错误。例如如果设置pvc的访问模式为ReadOnlyMany ,pod挂载后依然可写,如果需要真正的不可写,申请pvc是需要指定 readOnly: true 参数

安装

实验用的Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :ENV["LC_ALL"] = "en_US.UTF-8"Vagrant.configure("2") do |config|(1..3).each do |i|config.vm.define "lab#{i}" do |node|node.vm.box = "centos-7.4-docker-17"node.ssh.insert_key = falsenode.vm.hostname = "lab#{i}"node.vm.network "private_network", ip: "11.11.11.11#{i}"node.vm.provision "shell",inline: "echo hello from node #{i}"node.vm.provider "virtualbox" do |v|v.cpus = 2v.customize ["modifyvm", :id, "--name", "lab#{i}", "--memory", "3096"]file_to_disk = "lab#{i}_vdb.vdi"unless File.exist?(file_to_disk)# 50GBv.customize ['createhd', '--filename', file_to_disk, '--size', 50 * 1024]endv.customize ['storageattach', :id, '--storagectl', 'IDE', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', file_to_disk]endendend
end
复制代码

环境配置说明

# 安装 glusterfs 每节点需要提前加载 dm_thin_pool 模块
modprobe dm_thin_pool# 配置开启自加载
cat >/etc/modules-load.d/glusterfs.conf<<EOF
dm_thin_pool
EOF# 安装 glusterfs-fuse
yum install -y glusterfs-fuse
复制代码

安装glusterfs与heketi

# 安装 heketi client
# https://github.com/heketi/heketi/releases
# 去github下载相关的版本
wget https://github.com/heketi/heketi/releases/download/v7.0.0/heketi-client-v7.0.0.linux.amd64.tar.gz
tar xf heketi-client-v7.0.0.linux.amd64.tar.gz
cp heketi-client/bin/heketi-cli /usr/local/bin# 查看版本
heketi-cli -v# 如下部署步骤都在如下目录执行
cd heketi-client/share/heketi/kubernetes# 在k8s中部署 glusterfs
kubectl create -f glusterfs-daemonset.json# 查看 node 节点
kubectl get nodes# 给提供存储 node 节点打 label
kubectl label node lab1 lab2 lab3 storagenode=glusterfs# 查看 glusterfs 状态
kubectl get pods -o wide# 部署 heketi server
# 配置 heketi server 的权限
kubectl create -f heketi-service-account.json
kubectl create clusterrolebinding heketi-gluster-admin --clusterrole=edit --serviceaccount=default:heketi-service-account# 创建 cofig secret
kubectl create secret generic heketi-config-secret --from-file=./heketi.json# 初始化部署
kubectl create -f heketi-bootstrap.json# 查看 heketi bootstrap 状态
kubectl get pods -o wide
kubectl get svc# 配置端口转发 heketi server
HEKETI_BOOTSTRAP_POD=$(kubectl get pods | grep deploy-heketi | awk '{print $1}')
kubectl port-forward $HEKETI_BOOTSTRAP_POD 58080:8080# 测试访问
# 另起一终端
curl http://localhost:58080/hello# 配置 glusterfs
# hostnames/manage 字段里必须和 kubectl get node 一致
# hostnames/storage 指定存储网络 ip 本次实验使用与k8s集群同一个ip
cat >topology.json<<EOF
{"clusters": [{"nodes": [{"node": {"hostnames": {"manage": ["lab1"],"storage": ["11.11.11.111"]},"zone": 1},"devices": [{"name": "/dev/sdb","destroydata": false}]},{"node": {"hostnames": {"manage": ["lab2"],"storage": ["11.11.11.112"]},"zone": 1},"devices": [{"name": "/dev/sdb","destroydata": false}]},{"node": {"hostnames": {"manage": ["lab3"],"storage": ["11.11.11.113"]},"zone": 1},"devices": [{"name": "/dev/sdb","destroydata": false}]}]}]
}
EOF
export HEKETI_CLI_SERVER=http://localhost:58080
heketi-cli topology load --json=topology.json# 使用 Heketi 创建一个用于存储 Heketi 数据库的 volume
heketi-cli setup-openshift-heketi-storage
kubectl create -f heketi-storage.json# 查看状态
# 等所有job完成 即状态为 Completed
# 才能进行如下的步骤
kubectl get pods
kubectl get job# 删除部署时产生的相关资源
kubectl delete all,service,jobs,deployment,secret --selector="deploy-heketi"# 部署 heketi server
kubectl create -f heketi-deployment.json# 查看 heketi server 状态
kubectl get pods -o wide
kubectl get svc# 查看 heketi 状态信息
# 配置端口转发 heketi server
HEKETI_BOOTSTRAP_POD=$(kubectl get pods | grep heketi | awk '{print $1}')
kubectl port-forward $HEKETI_BOOTSTRAP_POD 58080:8080
export HEKETI_CLI_SERVER=http://localhost:58080
heketi-cli cluster list
heketi-cli volume list
复制代码

测试

# 创建 StorageClass
# 由于没有开启认证
# restuser restuserkey 可以随意写
HEKETI_SERVER=$(kubectl get svc | grep heketi | head -1 | awk '{print $3}')
echo $HEKETI_SERVER
cat >storageclass-glusterfs.yaml<<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: gluster-heketi
provisioner: kubernetes.io/glusterfs
parameters:resturl: "http://$HEKETI_SERVER:8080"restauthenabled: "false"restuser: "will"restuserkey: "will"gidMin: "40000"gidMax: "50000"volumetype: "replicate:3"
EOF
kubectl create -f storageclass-glusterfs.yaml# 查看
kubectl get sc# 创建pvc测试
cat >gluster-pvc-test.yaml<<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: gluster1annotations:volume.beta.kubernetes.io/storage-class: gluster-heketi
spec:accessModes:- ReadWriteOnceresources:requests:storage: 5Gi
EOF
kubectl apply -f gluster-pvc-test.yaml# 查看
kubectl get pvc
kubectl get pv# 创建 nginx pod 挂载测试
cat >nginx-pod.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:name: nginx-pod1labels:name: nginx-pod1
spec:containers:- name: nginx-pod1image: nginx:alpineports:- name: webcontainerPort: 80volumeMounts:- name: gluster-vol1mountPath: /usr/share/nginx/htmlvolumes:- name: gluster-vol1persistentVolumeClaim:claimName: gluster1
EOF
kubectl apply -f nginx-pod.yaml# 查看
kubectl get pods -o wide# 修改文件内容
kubectl exec -ti nginx-pod1 -- /bin/sh -c 'echo Hello World from GlusterFS!!! > /usr/share/nginx/html/index.html'# 访问测试
POD_ID=$(kubectl get pods -o wide | grep nginx-pod1 | awk '{print $(NF-1)}')
curl http://$POD_ID# node 节点查看文件内容
GLUSTERFS_POD=$(kubectl get pod | grep glusterfs | head -1 | awk '{print $1}')
kubectl exec -ti $GLUSTERFS_POD /bin/sh
mount | grep heketi
cat /var/lib/heketi/mounts/vg_56033aa8a9131e84faa61a6f4774d8c3/brick_1ac5f3a0730457cf3fcec6d881e132a2/brick/index.html
复制代码

参考文档

  • github.com/heketi/heke…
  • github.com/gluster/glu…
  • github.com/gluster/glu…
  • jimmysong.io/kubernetes-…
  • kubernetes.io/docs/concep…
  • docs.openshift.com/enterprise/…

k8s使用glusterfs实现动态持久化存储相关推荐

  1. k8s glusterfs mysql_k8s使用glusterfs实现动态持久化存储

    简介 本文章介绍如何使用glusterfs为k8s提供动态申请pv的功能.glusterfs提供底层存储功能,heketi为glusterfs提供restful风格的api,方便管理glusterfs ...

  2. AKS使用Azure File实现动态持久化存储

    本文作者|搪瓷小娃娃 本文来源|搪瓷小娃娃博客园 如我们所知,Kubernetes通过 Volume 为集群中的容器提供存储,通过Persistent Volume 和 Persistent Volu ...

  3. K8S持久化存储:NFS+StorageClass实现动态供给

    K8S持久化存储:NFS+StorageClass实现动态供给 一.简介:K8S中的持久化存储 二.部署nfs-provisioner 三.创建StorageClass 四.实验 实验1:部署depl ...

  4. 部署k8s(15):持久化存储方案

    一.ConfigMap 1.概念 ConfigMap的功能在k8s1.2版本中引入的,许多应用程序会从配置文件,命令行参数或环境变量中读取配置信息.ConfigMap API会给我们提供了向容器中注入 ...

  5. K8s 或 K3s 集群中持久化存储方案选型

    存储架构 1 三个概念: pv , pvc ,storageclass pv - 持久化卷, 支持本地存储和网络存储, 例如hostpath,ceph rbd, nfs等,只支持两个属性, capac ...

  6. k8s之持久化存储PV、PVC

    目录 前言 一.k8s 容器磁盘 1.1 Volume(存储卷) 1.2 emptyDir 存储卷 1.3  hostPath存储卷 二.PV和PVC 1.PV 概念 2.PVC概念 3.PV 与 P ...

  7. 一文读懂 K8s 持久化存储流程

    作者 | 孙志恒(惠志)  阿里巴巴开发工程师 **导读:**众所周知,K8s 的持久化存储(Persistent Storage)保证了应用数据独立于应用生命周期而存在,但其内部实现却少有人提及.K ...

  8. k8s学习-持久化存储(Volumes、hostPath、emptyDir、PV、PVC)详解与实战

    目录 概念 Volumes ConfigMap && Secret hostPath 模版 emptyDir 模版 PV 模版 PVC 模版 实战 volumes - hostPath ...

  9. 【k8s的持久化存储】PV、PVC、StorageClass讲解

    一.PV和PVC的引入 Volume 提供了非常好的数据持久化方案,不过在可管理性上还有不足. Pod 通常是由应用的开发人员维护,而 Volume 则通常是由存储系统的管理员维护.开发人员要获得上面 ...

最新文章

  1. 活动|跟着微软一起,拥抱开源吧!
  2. Qt运行时中文乱码的解决办法
  3. 程序升级触发阿里云自身安全机制导致的莫名问题
  4. 信息学奥赛一本通 1958:【12NOIP普及组】寻宝 | OpenJudge NOI 1.12 06 | 洛谷 P1076 [NOIP2012 普及组] 寻宝
  5. 计算机软件理论基础集合论,从数理逻辑观点看计算机专业的理论基础探讨
  6. linux打印jvm内存堆栈_jvm内存堆栈监控之jmap篇
  7. 利用zabbix自动发现监控mongo数据库
  8. 我的世界pe开服务器网站,我的世界pe服务器怎么开 开服图文教程
  9. IIS Express URL Rewrite无效
  10. Mac 使用命令行工具解压和压缩 rar 文件
  11. 深度 | 机器学习敲门砖:任何人都能看懂的TensorFlow介绍【转】
  12. 计算机桌面无法新建文件夹,桌面新建的文件、文件夹都无法显示
  13. SuperMap iClient3D for WebGL实现三维管线分析
  14. 机器学习(周志华)读书笔记 1
  15. 测试必经之路(探索性测试)
  16. 国五条催生末班车效应 郑州二手房交易量激增
  17. 【Adobe Illustrator 教程】4. 认识渐变工具
  18. V-REP笔记:导出自己的机器人模型
  19. 阿里云企业邮箱2019
  20. Ubuntu20.04浏览器上网慢解决方法——体验优化

热门文章

  1. Java23个设计模式的简明教程
  2. ZooKeeper Web UI -- Shovel
  3. 首富带你畅谈:蓝绿部署、滚动发布、灰度发布/金丝雀发布
  4. 智慧楼宇物联网公司En-trak获Pre-A 轮融资
  5. springboot学习笔记-5 springboot整合shiro
  6. [20170828]grep过滤技巧.txt
  7. 张高兴的 Xamarin.Android 学习笔记:(二)“Hello World”
  8. [DNS]ACL、also-notify、视图服务器及安全设置
  9. awbeci—一个帮助你快速处理日常工作的网址收集网站
  10. Nginx Upload Module 上传模块