附009.Kubernetes永久存储之GlusterFS独立部署
一 前期准备
1.1 基础知识
1.2 架构示意

1.3 相关规划
主机
|
IP
|
磁盘
|
备注
|
servera
|
172.24.8.41
|
sdb
|
glusterfs节点
|
serverb
|
172.24.8.42
|
sdb
|
glusterfs节点
|
serverc
|
172.24.8.43
|
sdb
|
glusterfs节点
|
heketi
|
172.24.8.44
|
Heketi主机
|
servera
|
serverb
|
serverc
|
|||||||
PV
|
sdb1
|
sdb1
|
sdb1
|
||||||
VG
|
vg0
|
vg0
|
vg0
|
||||||
LV
|
datalv
|
datalv
|
datalv
|
||||||
bricks目录
|
/bricks/data
|
/bricks/data
|
/bricks/data
|
1.4 其他准备
二 规划相应存储卷
2.1 划分LVM
1 [root@servera ~]# fdisk /dev/sdb #创建lvm的sdb1,过程略
2 [root@servera ~]# pvcreate /dev/sdb1 #使用/dev/vdb1创建PV
3 [root@servera ~]# vgcreate vg0 /dev/sdb1 #创建vg
4 [root@servera ~]# lvcreate -L 15G -T vg0/thinpool #创建支持thin的lv池
5 [root@servera ~]# lvcreate -V 10G -T vg0/thinpool -n datalv #创建相应brick的lv
6 [root@servera ~]# vgdisplay #验证确认vg信息
7 [root@servera ~]# pvdisplay #验证确认pv信息
8 [root@servera ~]# lvdisplay #验证确认lv信息
三 安装glusterfs
3.1 安装相应RPM源
1 [root@servera ~]# yum -y install centos-release-gluster
1 # CentOS-Storage.repo
2 #
3 # Please see http://wiki.centos.org/SpecialInterestGroup/Storage for more
4 # information
5
6 [centos-storage-debuginfo]
7 name=CentOS-$releasever - Storage SIG - debuginfo
8 baseurl=http://debuginfo.centos.org/$contentdir/$releasever/storage/$basearch/
9 gpgcheck=1
10 enabled=0
11 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage
3.2 安装glusterfs
1 [root@servera ~]# yum -y install glusterfs-server
3.3 启动glusterfs
1 [root@servera ~]# systemctl start glusterd
2 [root@servera ~]# systemctl enable glusterd
3.4 添加信任池
1 [root@servera ~]# gluster peer probe serverb
2 peer probe: success.
3 [root@servera ~]# gluster peer probe serverc
4 peer probe: success.
5 [root@servera ~]# gluster peer status #查看信任池状态
6 [root@servera ~]# gluster pool list #查看信任池列表

1 [root@servera ~]# firewallcmd permanent addservice=glusterfs
2 [root@servera ~]# firewallcmd permanent addservice=nfs
3 [root@servera ~]# firewallcmd permanent addservice=rpcbind
4 [root@servera ~]# firewallcmd permanent addservice=mountd
5 [root@servera ~]# firewallcmd permanent addport=5666/tcp
6 [root@servera ~]# firewallcmd reload
四 部署Heketi
4.1 安装heketi服务
1 [root@heketi ~]# yum -y install centos-release-gluster
2 [root@heketi ~]# yum -y install heketi heketi-client
4.2 配置heketi
1 [root@heketi ~]# vi /etc/heketi/heketi.json
2 {
3 "_port_comment": "Heketi Server Port Number",
4 "port": "8080", #默认端口
5
6 "_use_auth": "Enable JWT authorization. Please enable for deployment",
7 "use_auth": true, #基于安全考虑开启认证
8
9 "_jwt": "Private keys for access",
10 "jwt": {
11 "_admin": "Admin has access to all APIs",
12 "admin": {
13 "key": "admin123" #管理员密码
14 },
15 "_user": "User only has access to /volumes endpoint",
16 "user": {
17 "key": "xianghy" #普通用户
18 }
19 },
20
21 "_glusterfs_comment": "GlusterFS Configuration",
22 "glusterfs": {
23 "_executor_comment": [
24 "Execute plugin. Possible choices: mock, ssh",
25 "mock: This setting is used for testing and development.", #用于测试
26 " It will not send commands to any node.",
27 "ssh: This setting will notify Heketi to ssh to the nodes.", #ssh方式
28 " It will need the values in sshexec to be configured.",
29 "kubernetes: Communicate with GlusterFS containers over", #在GlusterFS由kubernetes创建时采用
30 " Kubernetes exec api."
31 ],
32 "executor": "ssh",
33
34 "_sshexec_comment": "SSH username and private key file information",
35 "sshexec": {
36 "keyfile": "/etc/heketi/heketi_key",
37 "user": "root",
38 "port": "22",
39 "fstab": "/etc/fstab"
40 },
41 ……
42 ……
43 "loglevel" : "warning"
44 }
45 }
4.3 配置免秘钥
1 [root@heketi ~]# ssh-keygen -t rsa -q -f /etc/heketi/heketi_key -N ""
2 [root@heketi ~]# chown heketi:heketi /etc/heketi/heketi_key
3 [root@heketi ~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@servera
4 [root@heketi ~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@serverb
5 [root@heketi ~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@serverc
4.4 启动heketi
1 [root@heketi ~]# systemctl enable heketi.service
2 [root@heketi ~]# systemctl start heketi.service
3 [root@heketi ~]# systemctl status heketi.service
4 [root@heketi ~]# curl http://localhost:8080/hello #测试访问
5 Hello from Heketi
4.5 配置Heketi拓扑
- 可以通过topology.json文件定义组建的GlusterFS集群;
- topology指定了层级关系:clusters --> nodes --> node/devices --> hostnames/zone;
- node/hostnames字段的manage建议填写主机ip,指管理通道,注意当heketi服务器不能通过hostname访问GlusterFS节点时不能填写hostname;
- node/hostnames字段的storage建议填写主机ip,指存储数据通道,与manage可以不一样,生产环境管理网络和存储网络建议分离;
- node/zone字段指定了node所处的故障域,heketi通过跨故障域创建副本,提高数据高可用性质,如可以通过rack的不同区分zone值,创建跨机架的故障域;
- devices字段指定GlusterFS各节点的盘符(可以是多块盘),必须是未创建文件系统的裸设备。
1 [root@heketi ~]# vi /etc/heketi/topology.json
2 {
3 "clusters": [
4 {
5 "nodes": [
6 {
7 "node": {
8 "hostnames": {
9 "manage": [
10 "172.24.8.41"
11 ],
12 "storage": [
13 "172.24.8.41"
14 ]
15 },
16 "zone": 1
17 },
18 "devices": [
19 "/dev/mapper/vg0-datalv"
20 ]
21 },
22 {
23 "node": {
24 "hostnames": {
25 "manage": [
26 "172.24.8.42"
27 ],
28 "storage": [
29 "172.24.8.42"
30 ]
31 },
32 "zone": 1
33 },
34 "devices": [
35 "/dev/mapper/vg0-datalv"
36 ]
37 },
38 {
39 "node": {
40 "hostnames": {
41 "manage": [
42 "172.24.8.43"
43 ],
44 "storage": [
45 "172.24.8.43"
46 ]
47 },
48 "zone": 1
49 },
50 "devices": [
51 "/dev/mapper/vg0-datalv"
52 ]
53 }
54 ]
55 }
56 ]
57 }
58
59 [root@heketi ~]# echo "export HEKETI_CLI_SERVER=http://heketi:8080" >> /etc/profile.d/heketi.sh
60 [root@heketi ~]# echo "alias heketi-cli='heketi-cli --user admin --secret admin123'" >> .bashrc
61 [root@heketi ~]# source /etc/profile.d/heketi.sh
62 [root@heketi ~]# source .bashrc
63 [root@heketi ~]# echo $HEKETI_CLI_SERVER
64 http://heketi:8080
65 [root@heketi ~]# heketi-cli --server $HEKETI_CLI_SERVER --user admin --secret admin123 topology load --json=/etc/heketi/topology.json

4.6 集群管理
1 [root@heketi ~]# heketi-cli cluster list #集群列表
2 [root@heketi ~]# heketi-cli cluster info aa83b0045fafa362bfc7a8bfee0c24ad #集群详细信息
3 Cluster id: aa83b0045fafa362bfc7a8bfee0c24ad
4 Nodes:
5 189ee41572ebf0bf1e297de2302cfb39
6 46429de5666fc4c6cc570da4b100465d
7 be0209387384299db34aaf8377c3964c
8 Volumes:
9
10 Block: true
11
12 File: true
13 [root@heketi ~]# heketi-cli topology info aa83b0045fafa362bfc7a8bfee0c24ad #查看拓扑信息

1 [root@heketi ~]# heketi-cli node list #卷信息
2 Id:189ee41572ebf0bf1e297de2302cfb39 Cluster:aa83b0045fafa362bfc7a8bfee0c24ad
3 Id:46429de5666fc4c6cc570da4b100465d Cluster:aa83b0045fafa362bfc7a8bfee0c24ad
4 Id:be0209387384299db34aaf8377c3964c Cluster:aa83b0045fafa362bfc7a8bfee0c24ad
5 [root@heketi ~]# heketi-cli node info 189ee41572ebf0bf1e297de2302cfb39 #节点信息
6 [root@heketi ~]# heketi-cli volume create --size=2 --replica=2 #默认为3副本的replica模式

1 [root@heketi ~]# heketi-cli volume list #卷信息
2 [root@heketi ~]# heketi-cli volume info 7da55685ebeeaaca60708cd797a5e391
3 [root@servera ~]# gluster volume info #通过glusterfs节点查看
4.7 测试验证
1 [root@heketi ~]# yum -y install centos-release-gluster
2 [root@heketi ~]# yum -y install glusterfs-fuse #安装glusterfs-fuse
3 [root@heketi ~]# mount -t glusterfs 172.24.8.41:vol_7da55685ebeeaaca60708cd797a5e391 /mnt

1 [root@heketi ~]# umount /mnt
2 [root@heketi ~]# heketi-cli volume delete 7da55685ebeeaaca60708cd797a5e391 #验证完毕删除
五 Kubernetes动态挂载glusterfs
5.1 StorageClass动态存储

- 集群管理员预先创建存储类(StorageClass);
- 用户创建使用存储类的持久化存储声明(PVC:PersistentVolumeClaim);
- 存储持久化声明通知系统,它需要一个持久化存储(PV: PersistentVolume);
- 系统读取存储类的信息;
- 系统基于存储类的信息,在后台自动创建PVC需要的PV;
- 用户创建一个使用PVC的Pod;
- Pod中的应用通过PVC进行数据的持久化;
- 而PVC使用PV进行数据的最终持久化处理。
5.2 定义StorageClass
- provisioner:表示存储分配器,需要根据后端存储的不同而变更;
- reclaimPolicy: 默认即”Delete”,删除pvc后,相应的pv及后端的volume,brick(lvm)等一起删除;设置为”Retain”时则保留数据,若需删除则需要手工处理;
- resturl:heketi API服务提供的url;
- restauthenabled:可选参数,默认值为”false”,heketi服务开启认证时必须设置为”true”;
- restuser:可选参数,开启认证时设置相应用户名;
- secretNamespace:可选参数,开启认证时可以设置为使用持久化存储的namespace;
- secretName:可选参数,开启认证时,需要将heketi服务的认证密码保存在secret资源中;
- clusterid:可选参数,指定集群id,也可以是1个clusterid列表,格式为”id1,id2”;
- volumetype:可选参数,设置卷类型及其参数,如果未分配卷类型,则有分配器决定卷类型;如”volumetype: replicate:3”表示3副本的replicate卷,”volumetype: disperse:4:2”表示disperse卷,其中‘4’是数据,’2’是冗余校验,”volumetype: none”表示distribute卷
1 [root@k8smaster01 ~]# kubectl create ns heketi #创建命名空间
2 [root@k8smaster01 ~]# echo -n "admin123" | base64 #将密码转换为64位编码
3 YWRtaW4xMjM=
4 [root@k8smaster01 ~]# mkdir -p heketi
5 [root@k8smaster01 ~]# cd heketi/
6 [root@k8smaster01 ~]# vi heketi-secret.yaml #创建用于保存密码的secret
7 apiVersion: v1
8 kind: Secret
9 metadata:
10 name: heketi-secret
11 namespace: heketi
12 data:
13 # base64 encoded password. E.g.: echo -n "mypassword" | base64
14 key: YWRtaW4xMjM=
15 type: kubernetes.io/glusterfs
16 [root@k8smaster01 heketi]# kubectl create -f heketi-secret.yaml #创建heketi
17 [root@k8smaster01 heketi]# kubectl get secrets -n heketi
18 NAME TYPE DATA AGE
19 default-token-5sn5d kubernetes.io/service-account-token 3 43s
20 heketi-secret kubernetes.io/glusterfs 1 5s
21 [root@kubenode1 heketi]# vim gluster-heketi-storageclass.yaml #正式创建StorageClass
22 apiVersion: storage.k8s.io/v1
23 kind: StorageClass
24 metadata:
25 name: gluster-heketi-storageclass
26 parameters:
27 resturl: "http://172.24.8.44:8080"
28 clusterid: "aa83b0045fafa362bfc7a8bfee0c24ad"
29 restauthenabled: "true" #若heketi开启认证此处也必须开启auth认证
30 restuser: "admin"
31 secretName: "heketi-secret" #name/namespace与secret资源中定义一致
32 secretNamespace: "heketi"
33 volumetype: "replicate:3"
34 provisioner: kubernetes.io/glusterfs
35 reclaimPolicy: Delete
36 [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-storageclass.yaml
1 [root@k8smaster01 heketi]# kubectl get storageclasses #查看确认
2 NAME PROVISIONER AGE
3 gluster-heketi-storageclass kubernetes.io/glusterfs 85s
4 [root@k8smaster01 heketi]# kubectl describe storageclasses gluster-heketi-storageclass

5.3 定义PVC
1 [root@k8smaster01 heketi]# cat gluster-heketi-pvc.yaml
2 apiVersion: v1
3 metadata:
4 name: gluster-heketi-pvc
5 annotations:
6 volume.beta.kubernetes.io/storage-class: gluster-heketi-storageclass
7 spec:
8 accessModes:
9 - ReadWriteOnce
10 resources:
11 requests:
12 storage: 1Gi
- ReadWriteOnce:简写RWO,读写权限,且只能被单个node挂载;
- ReadOnlyMany:简写ROX,只读权限,允许被多个node挂载;
- ReadWriteMany:简写RWX,读写权限,允许被多个node挂载。
1 [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-pvc.yaml
2 [root@k8smaster01 heketi]# kubectl get pvc
3 [root@k8smaster01 heketi]# kubectl describe pvc gluster-heketi-pvc
4 [root@k8smaster01 heketi]# kubectl get pv
5 [root@k8smaster01 heketi]# kubectl describe pv pvc-5f7420ef-082d-11ea-badf-000c29fa7a79

1 [root@k8smaster01 heketi]# kubectl describe endpoints glusterfs-dynamic-5f7420ef-082d-11ea-badf-000c29fa7a79

5.4 确认查看
- volume与brick已经创建;
- 主挂载点(通信)在172.24.8.41节点,其余两个节点备选;
- 三副本的情况下,所有节点都会创建brick。
1 [root@heketi ~]# heketi-cli topology info #heketi主机查看
2 [root@serverb ~]# lsblk #glusterfs节点查看
3 [root@serverb ~]# df -hT #glusterfs节点查看
4 [root@servera ~]# gluster volume list #glusterfs节点查看
5 [root@servera ~]# gluster volume info vol_e4c948687239df9833748d081ddb6fd5
5.5 Pod挂载测试
1 [root@xxx ~]# yum -y install centos-release-gluster
2 [root@xxx ~]# yum -y install glusterfs-fuse #安装glusterfs-fuse
1 [root@k8smaster01 heketi]# vi gluster-heketi-pod.yaml
2 kind: Pod
3 apiVersion: v1
4 metadata:
5 name: gluster-heketi-pod
6 spec:
7 containers:
8 - name: gluster-heketi-container
9 image: busybox
10 command:
11 - sleep
12 - "3600"
13 volumeMounts:
14 - name: gluster-heketi-volume #必须和volumes中name一致
15 mountPath: "/pv-data"
16 readOnly: false
17 volumes:
18 - name: gluster-heketi-volume
19 persistentVolumeClaim:
20 claimName: gluster-heketi-pvc #必须和5.3创建的PVC中的name一致
21 [root@k8smaster01 heketi]# kubectl create -f gluster-heketi-pod.yaml -n heketi #创建Pod
5.6 确认验证
1 [root@k8smaster01 heketi]# kubectl get pod -n heketi | grep gluster
2 gluster-heketi-pod 1/1 Running 0 2m43s
3 [root@k8smaster01 heketi]# kubectl exec -it gluster-heketi-pod /bin/sh #进入Pod写入测试文件
4 / # cd /pv-data/
5 /pv-data # echo "This is a file!" >> a.txt
6 /pv-data # echo "This is b file!" >> b.txt
7 /pv-data # ls
8 a.txt b.txt
9 [root@servera ~]# df -hT #在glusterfs节点查看Kubernetes节点的测试文件
10 [root@servera ~]# cd /var/lib/heketi/mounts/vg_47c90d90e03de79696f90bd94cfccdde/brick_721243c3e0cf8a2372f05d5085a4338c/brick/
11 [root@servera brick]# ls
12 [root@servera brick]# cat a.txt
13 [root@servera brick]# cat b.txt
5.7 删除资源
1 [root@k8smaster01 heketi]# kubectl delete -f gluster-heketi-pod.yaml
2 [root@k8smaster01 heketi]# kubectl delete -f gluster-heketi-pvc.yaml
3 [root@k8smaster01 heketi]# kubectl get pvc
4 [root@k8smaster01 heketi]# kubectl get pv
5 [root@servera ~]# gluster volume list
6 No volumes present in cluster

附009.Kubernetes永久存储之GlusterFS独立部署的更多相关文章
- 附010.Kubernetes永久存储之GlusterFS超融合部署
一 前期准备 1.1 基础知识 在Kubernetes中,使用GlusterFS文件系统,操作步骤通常是: 创建brick-->创建volume-->创建PV-->创建PVC--&g ...
- 附013.Kubernetes永久存储Rook部署
一 Rook概述 1.1 Ceph简介 Ceph是一种高度可扩展的分布式存储解决方案,提供对象.文件和块存储.在每个存储节点上,将找到Ceph存储对象的文件系统和Ceph OSD(对象存储守护程序)进 ...
- 附014.Kubernetes Prometheus+Grafana+EFK+Kibana+Glusterfs整合解决方案
一 glusterfs存储集群部署 注意:以下为简略步骤,详情参考<附009.Kubernetes永久存储之GlusterFS独立部署>. 1.1 架构示意 略 1.2 相关规划 主机 I ...
- 附014.Kubernetes Prometheus+Grafana+EFK+Kibana+Glusterfs整合性方案
一 glusterfs存储集群部署 注意:以下为简略步骤,详情参考<附009.Kubernetes永久存储之GlusterFS独立部署>. 1.1 架构示意 略 1.2 相关规划 主机 I ...
- 附024.Kubernetes全系列大总结
Kubernetes全系列总结如下,后期不定期更新.欢迎基于学习.交流目的的转载和分享,禁止任何商业盗用,同时希望能带上原文出处,尊重ITer的成果,也是尊重知识.若发现任何错误或纰漏,留言反馈或右侧 ...
- 独立部署GlusterFS+Heketi实现Kubernetes共享存储
目录 环境 glusterfs配置 安装 测试 heketi配置 部署 简介 修改heketi配置文件 配置ssh密钥 启动heketi 生产案例 heketi添加glusterfs 添加cluste ...
- kubernetes存储之GlusterFS
目录 1.glusterfs概述 1.1.glusterfs简介 1.2.glusterfs特点 1.3.glusterfs卷的模式 2.heketi概述 3.部署heketi+glusterfs 3 ...
- 附022.Kubernetes_v1.18.3高可用部署架构一
kubeadm介绍 kubeadm概述 参考附003.Kubeadm部署Kubernetes. kubeadm功能 参考附003.Kubeadm部署Kubernetes. 本方案描述 本方案采用kub ...
- 附024.Kubernetes_v1.18.3高可用部署架构二
kubeadm介绍 kubeadm概述 参考<附003.Kubeadm部署Kubernetes>. kubeadm功能 参考<附003.Kubeadm部署Kubernetes> ...
随机推荐
- Spring整合Mybatis(IDEA版)
本文适用于初学者: 该文主要教大家如何整合spring和mybatis,整合完成效果,可以从数据库中查询出学生信息: 完整的工程目录如下: 整合思路: 需要spring来管理数据源信息. 需要spri ...
- 一个关于内联优化和调用约定的Bug
很久没有更新博客了(博客园怎么还不更新后台),前几天在写一个Linux 0.11的实验 [1] 时遇到了一个奇葩的Bug,就在这简单记录一下调试过程吧. 现象 这个实验要求在Linux 0.11中实现 ...
- HDU 6607 Time To Get Up(状态压缩+枚举)
题目网址: http://acm.hdu.edu.cn/showproblem.php?pid=6077 思路: 先预处理一下,将每个数字块的“X”看作1,“.”看作0,进行状态压缩转换成二进制数,用 ...
- 第九周课程总结&实验报告(七)
实验任务详情: 完成火车站售票程序的模拟. 要求: (1)总票数1000张: (2)10个窗口同时开始卖票: (3)卖票过程延时1秒钟: (4)不能出现一票多卖或卖出负数号票的情况. 实验代码 pac ...
- ESP8266开发之旅 网络篇⑥ ESP8266WiFiGeneric——基础库
1. 前言 在前面的博文中,博主介绍到ESP8266WiFi库是包含了很多功能的一个超级库.ESP8266WiFi库不仅仅局限于 ESP8266WiFi.h 和 ESP8266WiFi.cpp ...
- NOIP2018提高组初赛游记
AH省的,好像水军多,走的都比较早(莫非是真·大佬!!) 本人考了71,较去年退步了.(去年还考80多的来着) 题目坑.. 第一.二大题选择 第三题年份,看了试卷标题,第二十二届,算出来后没有这个选项 ...
- 【Spring Cloud】微服务架构选型方案
1.技术架构 2.组件介绍 1.服务注册与发现——Eureka 服务注册与发现中心采用Eureka,以AP为核心的高可用注册中心,保证高可用性和最终一致性,server之间互相注册的replicate ...
- python3.8安装flask出现错误“ModuleNotFoundError: No module named '_ctypes'”
本想在CentOS下配置flask+nginx+uwsgi环境,结果安装最基础的flask包都出了问题...以下是我的环境: 服务器:阿里云ECS CentOS7 python版本:3.8.0 问题描 ...
- Java基础(十五)异常(Exception)
1.处理错误的要求 如果由于出现错误而使得某些操作没有完成,程序应该: 返回到一种安全状态,并能够让用户执行一些其他的命令. 允许用户保存所有操作的结果,并以妥善的方式终止程序. 2.程序中可能出现的 ...
- C#基本网络操作
建档操作如ping,查询本机主机ip,同步异步查询局域网内主机,同步异步邮件发送等 1)ping 通过ping类测试网络 using System; using System.Text; using ...