Gluster, Heketi – Kubernetes Pod’u olarak kurulumu

Bir önceki yazımda sizlere Gluster Cluster kurulumunu anlatmıştım. Doğrudan işletim sistemi üzerine kurulumu yapılan versiyonuna alternatif olarak bu makalemde sizlere Kubernetes pod’u olarak Gluster Cluster’ını nasıl kurabileceğinizi paylaşacağım.

Başlarken not olarak düşmeliyim ki; Kubernetes’de Gluster pod’ları ile bir cluster oluşturabilmek için en az 3 worker node’lu bir Kubernetes Cluster’ı gerekmektedir. Akışın kolay anlaşılması adına Gluster Cluster’ında yetkilendirme aktif hale getirilmeyecektir.

Cluster Node’larında Yapılacak İşlemler

Kubernetes Cluster’ında Gluster için kullanılacak tüm worker node’larda aşağıdaki komutla gerekli kernel modülleri yüklenmelidir;

modprobe dm_snapshot
modprobe dm_mirror
modprobe dm_thin_pool

yüklediğimiz bu modüllerin restartlar sonrası da aktif olması sağlanır;

echo dm_snapshot >> /etc/modules-load.d/dm_snapshot.conf
echo dm_mirror >> /etc/modules-load.d/dm_mirror.conf
echo dm_thin_pool >> /etc/modules-load.d/dm_thin_pool.conf

Redhat sunucularda aşağıdaki içerikle /etc/yum.repos.d/Gluster.repo dosyası oluşturulmalıdır;

[gluster6]
name=Gluster 6 Reposu
baseurl=http://mirror.centos.org/centos/7/storage/$basearch/gluster-6/
gpgcheck=0
enabled=1

Centos 7’de ise aşağıdaki komutla gerekli RPM depolarının kurulumu yapılabilir;

yum install -y centos-release-gluster

Aşağıdaki komut yardımıyla GlusterFS, GlusterFS-Fuse ve Heketi-client paketleri kurulur;

yum install -y glusterfs glusterfs-fuse heketi-client

Kubernetes Master’da Yapılacak İşlemler

Sunucuda git kurulumu daha önceden yapılmamış ise git rpm paketi kurulur;

yum install -y git

Gluster-Kubernetes github deposu yerele kopyalanır;

git clone https://github.com/gluster/gluster-kubernetes.git

Kopyalama işleminin bitmesi ardından deploy klasörüne gidilir;

cd gluster-kubernetes/deploy

Doplay yapılacak sistem için bir Gluster topoloji tanım dosyası oluşturulur.

Aşağıdaki örnek içeriğe benzer şekilde kendi mimarinize uygun olarak bir topology.json dosyası oluşturulmalıdır;

{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "k8s-w1"
              ],
              "storage": [
                "192.168.200.3"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "k8s-w2"
              ],
              "storage": [
                "192.168.200.4"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "k8s-w3"
              ],
              "storage": [
                "192.168.200.5"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb"
          ]
        }
      ]
    }
  ]
}

Örnekte 3 Node’lu bir cluster’da tüm node’larda /dev/sdb disk’inin olduğu varsayılmıştır. Farklı yapılandırmalarda bu dosyanın güncel durumu yansıtması gerekmektedir.

gk-deploy’un bu makaleyi yazdığım sıradaki mevcut güncel versiyonunda 919. satırda yer alana aşağıdaki ifadede geçen –show-all parametresi güncel Kubernetes sürümlerinden kaldırılmıştır. Bu sebeple güncel sürümlerde işlemlerde hata alınacaktır.

heketi_pod=$(${CLI} get pod --no-headers --show-all --selector="heketi" | awk '{print $1}')

Bu durumu önlemek adına söz konusu satır aşağıdaki şekilde düzenlenmelidir;

heketi_pod=$(${CLI} get pod --no-headers --selector="heketi" | awk '{print $1}')

Yapılan hazırlıklardan sonra aşağıdaki komutla kurulum işlemi başlatılır;

./gk-deploy -g

Gelen soruya enter tuşuna basılarak cevap verilmesi ardından yapılandırma işlemi başlayacaktır;

gk-deploy

Onay ardından kurulum ve yapılandırma işlemleri başlayacaktır. Aşağıda bu sürece dair örnek bir çıktı bulabilirsiniz;

Using Kubernetes CLI.
Using namespace "default".
Checking for pre-existing resources...
  GlusterFS pods ... not found.
  deploy-heketi pod ... not found.
  heketi pod ... not found.
  gluster-s3 pod ... not found.
Creating initial resources ... serviceaccount/heketi-service-account created
clusterrolebinding.rbac.authorization.k8s.io/heketi-sa-view created
clusterrolebinding.rbac.authorization.k8s.io/heketi-sa-view labeled
OK
node/k8s-w1 labeled
node/k8s-w2 labeled
node/k8s-w3 labeled
daemonset.extensions/glusterfs created
Waiting for GlusterFS pods to start ... OK
secret/heketi-config-secret created
secret/heketi-config-secret labeled
service/deploy-heketi created
deployment.extensions/deploy-heketi created
Waiting for deploy-heketi pod to start ... OK
Creating cluster ... ID: 3580dc920a2e1eec511714349bd4d114
Allowing file volumes on cluster.
Allowing block volumes on cluster.
Creating node k8s-w1 ... ID: 4388656de9ae4a6925ff9062ee3f5e23
Adding device /dev/sdb ... OK
Creating node k8s-w2 ... ID: 6f8ff9702f206a0fe9a473c3bf24ff71
Adding device /dev/sdb ... OK
Creating node k8s-w3 ... ID: f7a66f77f55af0006f1493609ca89c2e
Adding device /dev/sdb ... OK
heketi topology loaded.
Saving /tmp/heketi-storage.json
secret/heketi-storage-secret created
endpoints/heketi-storage-endpoints created
service/heketi-storage-endpoints created
job.batch/heketi-storage-copy-job created
service/heketi-storage-endpoints labeled
pod "deploy-heketi-865f55765-lfgcc" deleted
service "deploy-heketi" deleted
deployment.apps "deploy-heketi" deleted
replicaset.apps "deploy-heketi-865f55765" deleted
job.batch "heketi-storage-copy-job" deleted
secret "heketi-storage-secret" deleted
service/heketi created
deployment.extensions/heketi created
Waiting for heketi pod to start ... OK


heketi is now running and accessible via http://10.244.3.3:8080 . To run
administrative commands you can install 'heketi-cli' and use it as follows:


  # heketi-cli -s http://10.244.3.3:8080 --user admin --secret '<ADMIN_KEY>' cluster list


You can find it at https://github.com/heketi/heketi/releases . Alternatively,
use it from within the heketi pod:


  # /usr/bin/kubectl -n default exec -i heketi-85dbbbb55-jpmv9 -- heketi-cli -s http://localhost:8080 --user admin --secret '<ADMIN_KEY>' cluster list


For dynamic provisioning, create a StorageClass similar to this:

---
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: glusterfs-storage
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://10.244.3.3:8080"


Deployment complete!

Aşağıdaki şekilde kurulum test edilebilir;

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

Kurulum’da bir yetkilendirme bulunmamaktadır. Dolayısıyla kullanıcı adı ve şifre belirtilmeksizin aşağıda örneklendiği işlem yapılabilir;

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

Dinamik Atama için Storage Class Oluşturulması

Dinanik atama (dynamic provisioning) için aşağıdaki içerik ile oluşturulan cluster-shared-storage.yaml dosyası yardımıyla Storage class tanımını hazırlanır;

apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
  name: glusterfs-storage
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://10.244.3.3:8080"

Not: Bu dosyada 10.244.3.3:8080 adresi yerine kurulum sonucunda mesajla verilen Heketi sunucusu ip adresi kullanılmalıdır.

Oluşturulan dosya kullanılarak aşağıdaki komutla  StorageClass oluşturulur;

kubectl create -f cluster-shared-storage.yaml

En az bir StorageClass’ın varsayılan olarak atanması gerekmektedir. Bu sebeple aşağıdaki komutla  cluster.shared.storage varsayılan olarak atanır;

kubectl patch storageclass glusterfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

Oluşturulan StorageClass aşağıdaki şekilde teyit edilebilir;

kubectl get storageclass

get-storageclass

Örnek

Aşağıda Nginx Pod’una 5gb’lık alanın bağlanmasına dair örnek adımlarını bulabilirsiniz.

Aşağıdaki içerik ile oluşturulan gluster-pvc.yaml dosyası yardımıyla Persistent Volume Claim tanımı hazırlanır;

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
   name: gluster1
   annotations:
      volume.beta.kubernetes.io/storage-class: glusterfs-storage
spec:
   accessModes:
     - ReadWriteOnce
   resources:
     requests:
       storage: 5Gi

Oluşturulan dosya yardımıyla aşağıdaki komutla Persistent Volume Claim oluşturulur;

kubectl create -f gluster-pvc.yaml

Komut sonucu aşağıdaki şekilde kontrol edilebilir;

kubectl get pvc

get-pvc [2]

Çıktıda da görüleceği üzere yaptığımız kalıcı depolama alanı talebimiz karşılanarak bize pvc- değeri ile başlayan bir depolama alanı dinamik olarak atanmış durumda.

Atanan bu alanı kullanacak nginx-pod.yaml adıyla Test Pod tanım dosyası aşağıdaki içerikle oluşturulur;

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod1
  labels:
    name: nginx-pod1
spec:
  containers:
  - name: nginx-pod1
    image: gcr.io/google_containers/nginx-slim:0.8
    ports:
    - name: web
      containerPort: 80
    volumeMounts:
    - name: gluster-vol1
      mountPath: /usr/share/nginx/html
  volumes:
  - name: gluster-vol1
    persistentVolumeClaim:
      claimName: gluster1

Pod oluşturulur;

kubectl create -f nginx-pod.yaml

Pod adresini öğrenmek için aşağıdaki komutu kullanabilirsiniz;

kubectl get pods -o wide

nginx-pod-ip

Test amacıyla Nginx içerisine girilerek index.html dosyası oluşturulur;

kubectl exec -ti nginx-pod1 /bin/sh

Başlatılan shell oturumunda aşağıdaki komutlar çalıştırılır;

cd /usr/share/nginx/html
echo 'Hello World from GlusterFS!!!' > index.html
exit

Bu komutlar Pod’a bağlanan Persistent Volume içerisine index.html adıyla ve belirtilen içerikle bir dosya oluşturmamızı sağlayacaktır. Son olarak aşağıdaki komutla Nginx tarafından sunulan sayfaya ulaşılır;

curl 10.244.2.184

hello-glusterfs

Gluster kümesi üzerinde verilen Persistent Volume’ü teyit için Pod silinip tekrar oluşturulabilir. Yeni pod ip’si öğrebilerek curl ile yine istek yaptığınızda daha önceden oluşturduğunuz içeriğin geldiğini görebilirsiniz.

Fatih Boy

Ankara'da yaşayan Fatih, kendi şirketinde özellikle bankacılık, sigortacılık ve otomotiv sektörlerinde IT danışmanlıkları vermektedir. Devops, ALM süreçleri, kurumsal veri yolu sistemleri, kurumsal altyapı ve yazılım geliştirme konularında destek vermektedir. Boş zamanlarında açık kaynak kodlu projeler geliştirmeyi ve bilgisini yazdığı makalelerle paylaşmayı seven Fatih, aynı zamanda Visual C# ve Visual Studio teknolojileri konusundan Microsoft tarafından altı yıl üst üste MVP (En Değerli Profesyonel) ödülüne layık görülmüştür. İş hayatı boyunca masaüstü uygulamaları, web teknolojileri, akıllı istemciler gibi konularda Asp.Net, Php, C#, Java programlama dilleri ve MySql, MsSql ve Oracle gibi veritabanı yönetim yazılımları ile çalışmıştır. İngilizce ve Türkçe olarak yayınlanan makalelerini gerek İngilizce bloğunda, gerekse de Türkçe bloğunda bulabileceğiniz gibi web sitesinden de açık kaynak kodlu geliştirdiği yazılımlarına ulaşabilirsiniz. vCard - Twitter - Facebook

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.