Setup GlusterFS & Heketi with gk deploy

Fatih KÜÇÜK
KoçSistem
Published in
5 min readDec 15, 2021

Ön Koşullar

Kuruluma geçmeden önce aşağıdaki ihtiyaçları karşılamanız gerekmektedir.

  • Her bir node un en az 1 tane raw block device a sahip olması gerekmektedir.
  • Aşağıdaki modüllerin yüklü olması gerekmektedir.
  1. dm_snapshot
  2. dm_mirror
  3. dm_thin_pool

Kurulum

1. Adım : Glusterfs in storage nodelar ve master a yüklenmesi

Storage node larda ve aşağıdaki komutlar çalıştırılır.

sudo yum install glusterfs gluster-cli glusterfs-libs

Kubernetes cluster içerisinde bulunan bütün sunucularda “glusterfs-fuse” yüklenmeli.

Storage nodelarda glusterd servisinin çalışmaması gerekmektedir. Çünkü podun içerisinde “Already bind” hatası vermektedir.

for i in dm_snapshot dm_mirror dm_thin_pool; do sudo modprobe $i; done

2. Adım : Topoloji dosyasının oluşturulması

Master sunucuda aşağıdaki repository den glusterfs çekilir.

git clone https://github.com/KocSistem/glusterfs.git

Repoda kube-templates altında bulunan glusterfs-daemonset.yaml ına nodelara eklenen taint için tolerations eklendi. Sunucu üzerindeki reponun güncel olduğundan emin olun.

tolerations:
- key: "storagenode"
operator: "Equal"
value: "glusterfs"
effect: "NoSchedule"

topology.json dosyasının kopyalaması ve düzenlenmesi yapılır.

cd glusterfs/
cat topology.json

Örnek topoloji aşağıdaki gibidir.

{
"clusters": [
{
"nodes": [
{
"node": {
"hostnames": {
"manage": [
"glustervm01.linknet"
],
"storage": [
"148.20.57.84"
]
},
"zone": 1
},
"devices": [
"/dev/sdb"
]
},
{
"node": {
"hostnames": {
"manage": [
"glustervm02.linknet"
],
"storage": [
"148.20.57.85"
]
},
"zone": 1
},
"devices": [
"/dev/sdb"
]
}
]
}
]
}

3. Adım : Raw block disk kontrolü

Glusterfs için kullanacağınız storage node lar mutlaka raw block disk olmalıdır.

Raw block disk kontrolünü aşağıdaki gibi yapabilirsiniz.

sudo lsblk
sudo pvs

sudo pvs komutunu çalıştırdıktan sonra /dev/sdb görünmüyor ise aşağıdaki komutu çalıştırarak oluşturabilirsiniz.

sudo pvcreate /dev/sdb

4. Adım : Gk-deploy scriptinin çalıştırılması

a. Script çalıştırıldığında yaşanabilecek sorunlar

Kuruluma geçmeden önce kurulumda sorun yaşamanız durumunda yapmanız gerekenler aşağıda anlatılmaktadır.

Script çalıştıktan sonra herhangi bir nedenden ötürü hata alması durumunda abort işleminin yapılması gerekmektedir.

master da çalıştırılmalıdır.

./gk-deploy -gvy --abort  --user-key MyUserStrongKey  --admin-key MyAdminStrongKey  -l heketi_deployment.log -n glusterfs

Script hata alması durumunda storage node larda aşağıdaki komutların çalıştırılarak volume group ların silinmesi gerekmektedir. Silinmediği taktirde scripti tekrar çalıştırdığınızda aşağıdaki gibi hata alacaksınız.

“glusterfs adding device already contains physical volume”

$ sudo pvs
PV VG Fmt Attr PSize PFree
/dev/sda2 root_vg lvm2 a-- <49.51g 0
/dev/sdb vg_f7effa3d6f13d002dc4abdbc86b9fc0b lvm2 a-- 199.87g <177.66g
/dev/sdc vg_docker lvm2 a-- <200.00g 0
$ sudo vgremove vg_f7effa3d6f13d002dc4abdbc86b9fc0b
$ rm -rf /var/lib/heketi /etc/glusterfs /var/lib/glusterd /var/log/glusterfs

Bazen bu komut yeterli olmayabilir. Kubernetes clusterında olan sunucular için reboot ederken öncelikle master sunucuda storage sunucuları drain edilir. Bu komut ile üzerinde çalışan uygulama podları diğer worker sunuculara aktarılır ve uygulama kesintiye uğramamış olur.

$ kubetcl drain <STORAGENODE_NAME>

Aşağıdaki komut ile direk disk header silinerek sunucuyu yeniden başlatmalısınız.

$ sudo dd if=/dev/zero of=/dev/sdb bs=8192 count=12800$ sudo reboot

Sunucuyu tekrar clustera almak için aşağıdaki komut uygulanır.

kubectl uncordon <STORAGENODE_NAME>

b. Scriptin çalıştırılması

Script çalıştırılmadan önce storage node lar etiketlenir. (master node ta çalıştırılmalıdır)

kubectl label node  glustervm01.linknet storagenode=glusterfs 
kubectl label node glustervm02.linknet storagenode=glusterfs
kubectl taint nodes glustervm01.linknet storagenode=glusterfs:NoSchedule
kubectl taint nodes glustervm02.linknet storagenode=glusterfs:NoSchedule

İlgili clusterda “glusterfs” namespace i yoksa oluşturulmalıdır.

kubectl create ns glusterfs

Aşağıdaki script master da çalıştırılır.

./gk-deploy -gv  --user-key MyUserStrongKey  --admin-key MyAdminStrongKey  --single-node  -l heketi_deployment.log  -v topology.json -n glusterfs

Scriptin başarılı olması durumunda aşağıdaki ekran görüntüsünü göreceksiniz.

5. Adım : Heketi-cli yüklenmesi ve kullanılması

Master da heketi cli son versiyonu indirilir.

curl -s https://api.github.com/repos/heketi/heketi/releases/latest \
| grep browser_download_url \
| grep linux.amd64 \
| cut -d '"' -f 4 \
| wget -qi -

Arşiv dosyaları dışarıya çıkartılır.

for i in `ls | grep heketi | grep .tar.gz`; do tar xvf $i; done

Heketi-cli /usr/local/bin dizinine kopyalanır.

sudo cp ./heketi-client/bin/heketi-cli /usr/local/bin

Heketi servis adresi environment variable olarak eklenir. Böylece heketi-cli direk buradan okuyabilmektedir.

export HEKETI_CLI_SERVER=$(kubectl get svc/heketi -n glusterfs --template 'http://{{.spec.clusterIP}}:{{(index .spec.ports 0).port}}')

Adresi aşağıdaki gibi doğrulayabilirsiniz.

$ echo $HEKETI_CLI_SERVER
http://10.97.108.118:8080

Heketi servis username ve key enviroment variable olarak set edilir.

$ heketi-cli cluster list --user admin --secret  MyAdminStrongKey
Clusters:
Id:1d9d8fbfeec1c0bcabd55b6498b03280 [file][block]
$ export HEKETI_CLI_USER=admin
$ export HEKETI_CLI_KEY=MyAdminStrongKey
$ heketi-cli cluster info 1d9d8fbfeec1c0bcabd55b6498b03280
Cluster id: 1d9d8fbfeec1c0bcabd55b6498b03280
Nodes:
4e078cb48a57c9ba9e58fedf74d56157
507b79d8dfc04e2104f611e3da4c53fe
Volumes:
5236c6ae884d5c40a1048233ea808c6c
c386bd1401e15df5d7a4a876dc9326ad
Block: true
File: true$ heketi-cli cluster list
Clusters:
Id:1d9d8fbfeec1c0bcabd55b6498b03280 [file][block]
$ heketi-cli cluster info 1d9d8fbfeec1c0bcabd55b6498b03280
Cluster id: 1d9d8fbfeec1c0bcabd55b6498b03280
Nodes:
4e078cb48a57c9ba9e58fedf74d56157
507b79d8dfc04e2104f611e3da4c53fe
Volumes:
5236c6ae884d5c40a1048233ea808c6c
c386bd1401e15df5d7a4a876dc9326ad
Block: true
File: true$ heketi-cli topology infoCluster Id: 1d9d8fbfeec1c0bcabd55b6498b03280 File: true
Block: true
Volumes: Name: heketidbstorage
Size: 2
Id: 5236c6ae884d5c40a1048233ea808c6c
Cluster Id: 1d9d8fbfeec1c0bcabd55b6498b03280
Mount: 195.87.213.124:heketidbstorage
Mount Options: backup-volfile-servers=195.87.213.122
Durability Type: none
Snapshot: Disabled
Bricks:
Id: a8ecef029a74ac274cfa97c4dbb522ac
Path: /var/lib/heketi/mounts/vg_f7effa3d6f13d002dc4abdbc86b9fc0b/brick_a8ecef029a74ac274cfa97c4dbb522ac/brick
Size (GiB): 2
Node: 4e078cb48a57c9ba9e58fedf74d56157
Device: f7effa3d6f13d002dc4abdbc86b9fc0b
Name: vol_c386bd1401e15df5d7a4a876dc9326ad
Size: 20
Id: c386bd1401e15df5d7a4a876dc9326ad
Cluster Id: 1d9d8fbfeec1c0bcabd55b6498b03280
Mount: 148.20.57.124:vol_c386bd1401e15df5d7a4a876dc9326ad
Mount Options: backup-volfile-servers=195.87.213.122
Durability Type: replicate
Replica: 2
Snapshot: Enabled
Snapshot Factor: 1.00
Bricks:
Id: 12c7a7d23738c67c99a840c704e32a98
Path: /var/lib/heketi/mounts/vg_f7effa3d6f13d002dc4abdbc86b9fc0b/brick_12c7a7d23738c67c99a840c704e32a98/brick
Size (GiB): 20
Node: 4e078cb48a57c9ba9e58fedf74d56157
Device: f7effa3d6f13d002dc4abdbc86b9fc0b
Id: e88b90525b5acbc3f81d245bc9d55b77
Path: /var/lib/heketi/mounts/vg_79371ca1e5a6db869d15152c8fae9ec4/brick_e88b90525b5acbc3f81d245bc9d55b77/brick
Size (GiB): 20
Node: 507b79d8dfc04e2104f611e3da4c53fe
Device: 79371ca1e5a6db869d15152c8fae9ec4
Nodes:Node Id: 4e078cb48a57c9ba9e58fedf74d56157
State: online
Cluster Id: 1d9d8fbfeec1c0bcabd55b6498b03280
Zone: 1
Management Hostnames: ksmimk8sst01.ksnet.local
Storage Hostnames: 148.20.57.124
Devices:
Id:f7effa3d6f13d002dc4abdbc86b9fc0b Name:/dev/sdb State:online Size (GiB):199 Used (GiB):22 Free (GiB):177
Bricks:
Id:12c7a7d23738c67c99a840c704e32a98 Size (GiB):20 Path: /var/lib/heketi/mounts/vg_f7effa3d6f13d002dc4abdbc86b9fc0b/brick_12c7a7d23738c67c99a840c704e32a98/brick
Id:a8ecef029a74ac274cfa97c4dbb522ac Size (GiB):2 Path: /var/lib/heketi/mounts/vg_f7effa3d6f13d002dc4abdbc86b9fc0b/brick_a8ecef029a74ac274cfa97c4dbb522ac/brick
Node Id: 507b79d8dfc04e2104f611e3da4c53fe
State: online
Cluster Id: 1d9d8fbfeec1c0bcabd55b6498b03280
Zone: 1
Management Hostnames: ksmimk8sst02.ksnet.local
Storage Hostnames: 148.20.57.122
Devices:
Id:79371ca1e5a6db869d15152c8fae9ec4 Name:/dev/sdb State:online Size (GiB):199 Used (GiB):20 Free (GiB):179
Bricks:
Id:e88b90525b5acbc3f81d245bc9d55b77 Size (GiB):20 Path: /var/lib/heketi/mounts/vg_79371ca1e5a6db869d15152c8fae9ec4/brick_e88b90525b5acbc3f81d245bc9d55b77/brick

6. Adım : StorageClass ve PersistentVolumeClaim oluşturulması

a. StorageClass oluşturulması

Gk deploy scripti otomatik olarak StorageClass oluşturmaktadır. Script in oluşturduğu StorageClass ı kontrol edebilir, güncelleyebilir veya silerek yenisini ekleyebilirsiniz.

kubectl get storageclass glusterfs-storage -o yaml$ sudo vi gluster-storage-class.yaml 
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: glusterfs
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://10.233.14.241:8080"
clusterid: "64dabef0af5aae06fa51e5f18a8b618f"
restauthenabled: "true"
restuser: "admin"
secretNamespace: "default"
secretName: "heketi-secret"
gidMin: "40000"
gidMax: "50000"
volumetype: "none"
$ kubectl create -f gluster-storage-class.yaml
storageclass.storage.k8s.io/glusterfs-storage created
$ kubectl get storageclass
NAME PROVISIONER AGE
glusterfs-storage kubernetes.io/glusterfs 18s
$ kubectl describe storageclass.storage.k8s.io/glusterfs-storage
Name: glusterfs-storage
IsDefaultClass: No
Annotations: <none>
Provisioner: kubernetes.io/glusterfs
Parameters: resturl=http://10.97.108.118:8080,restuser=admin,restuserkey=MyAdminStrongKey
AllowVolumeExpansion: <unset>
MountOptions: <none>
ReclaimPolicy: Delete
VolumeBindingMode: Immediate
Events: <none>

b. PVC oluşturulması

sudo vi gluster-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: demo-claim
spec:
accessModes:
- ReadWriteOnce
storageClassName: glusterfs
resources:
requests:
storage: 30Gi
kubectl create -f gluster-pvc.yaml
persistentvolumeclaim/glusterpvc01 created

--

--

Fatih KÜÇÜK
KoçSistem

Fatih is a technology lover with interest in DevOps, Agile, Container and Container Orchestration.