Kubernetes(k3s) üzerine Helm ile Longhorn kurulum






Longhorn nedir?

Rancher firması tarafından Kubernetes için geliştirilmiş dağınık blok depolama (Distributed Block Storage) sistemidir.Yani her bir veriyi bloklar halinde kubernetes cluster ında bulunan master ve worker node lar üzerindeki disklere yazar ve gerektiğinde hızlıca bu verilere erişim sağlar.

Longhorn'u niçin kullanırız?

  • PersistentVolume(PV) ve PersistentVolumeClain(PVC) replikalarını alarak sunucular çöktüğünde uygulamaların stabil olarak çalışmaya devam etmesini sağlar.
  • İstediğimiz zaman ve aralıklarla PV ve PVClerin yedeklerini alma ve gerekirse yedekten dönme işlemlerinin yapılmasını sağlar.
  • Dağıtılmış Blok Depolama sistemi sayesinde verilerin okunması ve yazılmasında yüksek performans sağlar.
O zaman teoriden pratiğe geçelim..

Helm ile Longhorn kurulum

Sistem gereksinimlerin yüklenmesi

Longhorn topluluğunun yazmış olduğu longhornctl aracı ile control plane(master) sunucu üzerinden bütün kubernetes cluster makinelerimizde eksiklerimizi tamamlayabiliriz.

longhornctl kurulum

BASH
# AMD64 platform
curl -sSfL -o longhornctl https://github.com/longhorn/cli/releases/download/v1.7.2/longhornctl-linux-amd64
chmod +x longhornctl

# Eksiklikleri kontrol edelim
./longhornctl check preflight

# Eksik olan varsa kuralım
./longhornctl install preflight
      

Helm repo eklenmesi

BASH
# Helm Longhorn reposunun eklenmesi
helm repo add longhorn https://charts.longhorn.io

# Helm Longhorn reposunun güncellenmesi
helm repo update
      

Longhorn kurulumu

  • Video çektiğimde güncel sürüm v1.7.2.
BASH
# Longhorn Helm ile deploy edilmesi
helm install longhorn longhorn/longhorn --namespace longhorn-system --create-namespace --version 1.7.2
      

Varsayılan storageclass olarak atamak

Kubernetes kurduğumuzda genellikle local-path storageclass ı varsayılan olarak gelir. Longhorn u da deploy ettiğimizde artık sistemimizde 2 tane varsayılan (default) storageclass ımız olur. PVC/PV tanımlarken storageclass tanımlamayı unutursak sistem otomatik olarak istemediğimiz storageclass atayabilir. Bunun için sadece longhorn storageclass ı varsayılan hale getireceğiz.
BASH
# Sistemimizdeki storageclass lar
$> kubectl get storageclasses

NAME                   PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path (default)   rancher.io/local-path   Delete          WaitForFirstConsumer   false                  58m
longhorn (default)     driver.longhorn.io      Delete          Immediate              true                   5m58s
longhorn-static        driver.longhorn.io      Delete          Immediate              true                   5m50s

# local-path storageclass ını varsayılandan çıkarıyoruz.
$> kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

#Çıktısı
storageclass.storage.k8s.io/local-path patched

# Sadece Longhorn storageclass ımız varsayılan hale geldi.
$> kubectl get storageclasses

NAME                 PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
local-path           rancher.io/local-path   Delete          WaitForFirstConsumer   false                  60m
longhorn (default)   driver.longhorn.io      Delete          Immediate              true                   7m20s
longhorn-static      driver.longhorn.io      Delete          Immediate              true                   7m12s
      

Longhorn Dashboard için nodePort ayarlanması

BASH
# Longhorn Dashboard için nodePort ayarlanması
kubectl --namespace longhorn-system patch svc longhorn-frontend --type='json' -p '[{"op":"replace","path":"/spec/type","value":"NodePort"},{"op":"replace","path":"/spec/ports/0/nodePort","value":31999}]'

# Çıktısı
service/longhorn-frontend patched
      
  • http://NODE_IP:31999 üzerinden erişebilirsiniz.

Örnek Uygulama

BASH
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-longhorn-example
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
  namespace: nginx-longhorn-example
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  selector:
    app: nginx
  type: NodePort
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
  namespace: nginx-longhorn-example
spec:
  selector:
    matchLabels:
      app: nginx # has to match .spec.template.metadata.labels
  serviceName: "nginx"
  replicas: 5 # by default is 1
  template:
    metadata:
      labels:
        app: nginx # has to match .spec.selector.matchLabels
    spec:
      restartPolicy: Always
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: registry.k8s.io/nginx-slim:0.8
        livenessProbe:
          exec:
            command:
              - ls
              - /usr/share/nginx/html/lost+found
          initialDelaySeconds: 5
          periodSeconds: 5
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "longhorn"
      resources:
        requests:
          storage: 1Gi
      

Longhorn'u sistemden kaldırma

BASH
# Helm ile Longhorn sistemden kaldırma
kubectl -n longhorn-system patch -p '{"value": "true"}' --type=merge lhs deleting-confirmation-flag
helm uninstall longhorn -n longhorn-system

# longhorn-system namespace ini silme
kubectl delete namespace longhorn-system