1、創建glusterfs集羣
(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_server:port>
# heketi-cli topology load --json=<topology_file>
設置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=<size in Gb> [options]”命令創建。存存儲卷的使用則需要在使用該存儲卷的節點上安裝GlusterFS和glusterfs-fuse程序包。
2、使用glusterfs動態pv供給
(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