(1)部署glusterfs集群
由于虚拟机机器限制,所以使用k8s集群的两台node节点创建glusterfs集群。具体环境如下:
主机ip |
主机名 |
使用的磁盘 |
Heketi节点 |
192.168.16.130 |
heketi |
/dev/sdb |
是 |
192.168.16.197 |
node01 |
/dev/sdb |
否 |
192.168.16.198 |
node02 |
/dev/sdb |
否 |
# 在三台节点上安装glusterfs-server程序包,并启动glusterfs服务
~]# yum install centos-release-gluster -y
~]# yum install glusterfs-server
~]# systemctl start glusterd.service
# 通过一个节点发现其他节点
~]# gluster peer probe node01
~]# gluster peer probe node02
~]# gluster peer status
Number of Peers: 2
Hostname: node01
Uuid: 1e1d86ff-8a23-468c-ae43-f9f3b989be21
State: Peer in Cluster (Connected)
Hostname: node02
Uuid: 10ad6c06-d006-4577-a147-5aec9e32eff2
State: Peer in Cluster (Connected)
Other names:
192.168.16.198
(2)部署Heketi(在heketi主机上)
heketi为管理clusterfs存储卷的生命周期提供了一个restful管理接口。Heketi能够自动确定整个集群的brick位置,并确保将brick及其副本放置在不同的故障域中。同时,Heketi还支持任意数量的cluster存储集群,并支持云服务提供网络文件存储。不过在heketi中注册的任何磁盘都必须以原始格式提供。
1)安装设置heketi
# 安装启动heketi服务
~]# yum install heketi heketi-client
# 配置heketi通过ssh秘钥的方式连接至集群中clusterfs节点
~]# ssh-keygen -f /etc/heketi/heketi_key -t rsa -N ''
~]# chown heketi:heketi /etc/heketi/heketi_key*
~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@node01
~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@node02
2)配置heketi
heketi的默认配置文件为/etc/heketi/heketi.json,默认的配置即可使用,如果需要连接heketi的认证,则需要将“use_auth”的参数设置为“true”,并在“jwt{}”配置段中为各用户设定相应的密码,用户名和密码都可以自定义。配置实例如下:
~]# cat /etc/heketi/heketi.json
{
"port": "8080",
"use_auth": false,
"jwt": {
"admin": {
"key": "admin Secret"
},
"user": {
"key": "user Secret"
}
},
"glusterfs": {
"executor": "ssh",
"sshexec": {
"keyfile": "/etc/heketi/heketi_key",
"user": "root",
"port": "22",
"fstab": "/etc/fstab"
},
"db": "/var/lib/heketi/heketi.db",
"loglevel" : "debug"
}
}
3)启动验证heketi服务
# 启动heketi
~]# systemctl enable heketi
~]# systemctl start heketi
# 验证heketi
~]# curl http://heketi:8080/hello
Hello from Heketi
(3)设置heketi的系统拓扑
拓扑信息用于让heketi确认可使用的节点、磁盘和集群,管理员必须自行确定节点故障域和节点集群。通过命令行的客户端”hekcti-cli”可以加载预定义的集群拓扑,从而添加节点到集群中,以及将磁盘关联到节点上。加载拓扑文件的命令为:
# export HEKETL_CLI_SERVER=http://
# heketi-cli topology load --json=
设置heketi系统拓扑时需要一个使用于当前配置环境的配置文件,它将根据gluster存储的实际环境把各节点定义在同一个集群中,并指明各节点上可用于提供存储空间的磁盘设备。
# 定义当前环境的配置文件
~]# cat /etc/heketi/topology_demo.json
~]# cat /etc/heketi/topology_demo.json
{
"clusters": [
{
"nodes": [
{
"node": {
"hostnames": {
"manage": [
"192.168.16.197"
],
"storage": [
"192.168.16.197"
]
},
"zone": 1
},
"devices": [
"/dev/sdb"
]
},
{
"node": {
"hostnames": {
"manage": [
"192.168.16.198"
],
"storage": [
"192.168.16.198"
]
},
"zone": 1
},
"devices": [
"/dev/sdb"
]
},
{
"node": {
"hostnames": {
"manage": [
"192.168.16.130"
],
"storage": [
"192.168.16.130"
]
},
"zone": 1
},
"devices": [
"/dev/sdb"
]
}
]
}
]
}
配置文件定义好之后需要通过命令加载拓扑信息,从而完成集群的配置。
# 加载拓扑信息
~]# export HEKETI_CLI_SERVER=http://heketi:8080
~]# heketi-cli topology load --json=/etc/heketi/topology_demo.json
Creating cluster ... ID: a8e652ea255c6d129a5b8900cdadbf4e
Allowing file volumes on cluster.
Allowing block volumes on cluster.
Creating node 192.168.16.197 ... ID: 534fe718a31481aa625c0cec6e7a715e
Adding device /dev/sdb ... OK
Creating node 192.168.16.198 ... ID: 9b8354c51092cca16ccb27998e3a7b00
Adding device /dev/sdb ... OK
Creating node 192.168.16.130 ... ID: b4decebd4ecb257835ac7c652e067564
Adding device /dev/sdb ... OK
# 查看集群的状态信息
~]# heketi-cli cluster info a8e652ea255c6d129a5b8900cdadbf4e
Cluster id: a8e652ea255c6d129a5b8900cdadbf4e
Nodes:
534fe718a31481aa625c0cec6e7a715e
9b8354c51092cca16ccb27998e3a7b00
b4decebd4ecb257835ac7c652e067564
(4)存储卷的管理
存储卷的创建通过“heketi-cli volume create --size=
(1)存储类
存储类支持pv的动态创建,创建存储类时,除了名称之外,还需要定义以下字段:
1)provisioner:供给方,提供存储资源的存储系统,该字段用来判定要使用的存储插件以便适配到目标存储系统。
2)parameters:该参数用来描述要关联到的存储卷
3)reclaimPolicy:为当前存储类动态创建的pv指定回收策略,可用值为delete和retain
4)volumeBindMode:定义如何为PVC完成供给和绑定,默认值为“VolumeBindingImmediate”.
5)mountOptions:由当前类动态创建的pv的挂载选项列表
# 定义一个基于glusterfs的存储类
]# cat glusteerfs-storageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
name: glusterfs
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://192.168.17.130:8080"
restauthenabled: "false"
# 创建并查看该存储类
]# kubectl apply -f glusteerfs-storageclass.yaml
storageclass.storage.k8s.io/glusterfs created
]# kubectl get StorageClass
NAME PROVISIONER AGE
glusterfs kubernetes.io/glusterfs 16s
(2)动态pv供给
动态pv的供给至少需要一个存储类,有了存储类就可以进行pv的动态供给。在pvc中定义使用指定的存储类资源的方式有两种,一种是通过spec. storageClassName字段定义,另一种方式是通过” volume.beta.kubernetes.io/storage-class”注解信息指定。
# 创建一个pvc并动态请求pv
~]# cat pvc-glusterfs.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-glusterfs
annotations:
volume.beta.kubernetes.io/storage-class: glusterfs
spec:
# storageClassName: "glusterfs"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
# 创建并查看创建的pvc
~]# kubectl apply -f pvc-glusterfs.yaml
persistentvolumeclaim/pvc-glusterfs created
~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pvc-glusterfs Bound pvc-20fdbad8-7acf-11e9-8957-000c29063a23 2Gi RWO glusterfs 25s