Rook Ceph, Kubernetes üzerinde dinamik, güvenilir ve yüksek erişilebilir bir depolama çözümü sunar. Bu rehberde, Kubernetes cluster’ımızın worker node’ları üzerinde Rook Ceph kurulumunu gerçekleştireceğiz. Eğer henüz bir Kubernetes cluster kurmadıysanız, Kubernetes Kurulum Rehberimize göz atarak gerekli altyapıyı oluşturabilirsiniz.


Adım 1: Rook Ceph Deposu İndirme

Rook Ceph’in release-1.15 sürümünü indiriyoruz:

git clone --single-branch --branch release-1.15 https://github.com/rook/rook.git
cd rook/deploy/examples

Adım 2: Worker Node’ları Etiketleme

Depolama işlemleri yalnızca worker node’lar üzerinde gerçekleştirileceği için, bu node’ları aşağıdaki komutlarla etiketliyoruz:

kubectl label node worker-1 node-role.kubernetes.io/storage-node=storage-node
kubectl label node worker-2 node-role.kubernetes.io/storage-node=storage-node
kubectl label node worker-3 node-role.kubernetes.io/storage-node=storage-node

Bu etiketleme, depolama işlemlerinin yalnızca belirtilen worker node’lar üzerinde çalışmasını sağlar.


Adım 3: Cluster Yapılandırması (cluster.yaml)

cluster.yaml dosyasını, storage işlemleri yalnızca etiketlenen worker node’lar üzerinde çalışacak şekilde düzenliyoruz:

placement:
  all:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: node-role.kubernetes.io/storage-node
            operator: In
            values:
            - storage-node
    tolerations:
    - effect: NoSchedule
      key: node-role.kubernetes.io/storage-node
      operator: Exists
  storage:
    useAllNodes: false
    useAllDevices: true
    config:
    nodes:
    - name: "worker-1"
    - name: "worker-2"
    - name: "worker-3"

Bu yapılandırma ile yalnızca worker-1, worker-2, ve worker-3 node’ları depolama işlemlerinde kullanılacaktır.


Adım 4: Operatör Yapılandırması (operator.yaml)

Rook Ceph operatörünün davranışlarını tanımlamak için operator.yaml dosyasını aşağıdaki şekilde düzenliyoruz:

kind: ConfigMap
apiVersion: v1
metadata:
  name: rook-ceph-operator-config
  namespace: rook-ceph # namespace:operator
data:
  ROOK_LOG_LEVEL: "INFO"
  ROOK_OPERATOR_METRICS_BIND_ADDRESS: "0"
  ROOK_CEPH_ALLOW_LOOP_DEVICES: "false"
  ROOK_USE_CSI_OPERATOR: "false"
  ROOK_CSI_ENABLE_CEPHFS: "true"
  ROOK_CSI_ENABLE_RBD: "true"
  ROOK_CSI_ENABLE_NFS: "false"
  ROOK_CSI_DISABLE_DRIVER: "false"
  CSI_PROVISIONER_NODE_AFFINITY: "node-role.kubernetes.io/storage-node=storage-node"
  CSI_PROVISIONER_TOLERATIONS: |
    - key: "node-role.kubernetes.io/storage-node"
      operator: "Exists"
      effect: "NoSchedule"
  CSI_PLUGIN_NODE_AFFINITY: "node-role.kubernetes.io/storage-node=storage-node"
  CSI_PLUGIN_TOLERATIONS: |
    - key: "node-role.kubernetes.io/storage-node"
      operator: "Exists"
      effect: "NoSchedule"
  CSI_ENABLE_ENCRYPTION: "false"
  CSI_DISABLE_HOLDER_PODS: "true"
  CSI_PROVISIONER_REPLICAS: "2"
  CSI_ENABLE_CEPHFS_SNAPSHOTTER: "true"
  CSI_ENABLE_NFS_SNAPSHOTTER: "true"
  CSI_ENABLE_RBD_SNAPSHOTTER: "true"
  CSI_ENABLE_VOLUME_GROUP_SNAPSHOT: "true"
  CSI_FORCE_CEPHFS_KERNEL_CLIENT: "true"
  CSI_RBD_FSGROUPPOLICY: "File"
  CSI_CEPHFS_FSGROUPPOLICY: "File"
  CSI_NFS_FSGROUPPOLICY: "File"
  CSI_PLUGIN_ENABLE_SELINUX_HOST_MOUNT: "false"
  CSI_PLUGIN_PRIORITY_CLASSNAME: "system-node-critical"
  CSI_PROVISIONER_PRIORITY_CLASSNAME: "system-cluster-critical"
  CSI_ENABLE_LIVENESS: "false"
  ROOK_OBC_WATCH_OPERATOR_NAMESPACE: "true"
  ROOK_ENABLE_DISCOVERY_DAEMON: "false"
  ROOK_CEPH_COMMANDS_TIMEOUT_SECONDS: "15"
  CSI_ENABLE_CSIADDONS: "false"
  ROOK_WATCH_FOR_NODE_FAILURE: "true"
  CSI_GRPC_TIMEOUT_SECONDS: "150"
  CSI_ENABLE_TOPOLOGY: "false"
  CSI_CEPHFS_ATTACH_REQUIRED: "true"
  CSI_RBD_ATTACH_REQUIRED: "true"
  CSI_NFS_ATTACH_REQUIRED: "true"
  ROOK_DISABLE_DEVICE_HOTPLUG: "false"
  ROOK_DISCOVER_DEVICES_INTERVAL: "60m"
  ROOK_ENFORCE_HOST_NETWORK: "false"

Bu dosyada:

  • CSI_PROVISIONER_NODE_AFFINITY ve CSI_PLUGIN_NODE_AFFINITY parametreleri, yalnızca etiketlenen storage-node üzerinde çalışacak şekilde yapılandırılmıştır.

Adım 5: Operatör ve Cluster Kurulumu

5.1 Operatörün Kurulumu

Rook Ceph operatörünü başlatmak için gerekli CRD ve operator.yaml dosyasını aşağıdaki komutla uygulayın:

kubectl create -f crds.yaml -f common.yaml -f operator.yaml

5.2 Operatörün Running Durumuna Geçmesini Bekleme

Operatörün sağlıklı bir şekilde başlatıldığından emin olmak için, rook-ceph-operator podunun Running durumuna geçmesini kontrol etmelisiniz. Bu işlem için aşağıdaki komutu kullanabilirsiniz:

kubectl -n rook-ceph get pod -l app=rook-ceph-operator

Çıktı aşağıdaki gibi görünmelidir:

NAME                                  READY   STATUS    RESTARTS   AGE
rook-ceph-operator-7f9d7f48d9-bml7q   1/1     Running   0          1m

Pod durumunun STATUS sütununda Running olarak göründüğünden emin olun. Eğer pod henüz Running değilse, birkaç saniye bekleyip tekrar kontrol edebilirsiniz:

watch kubectl -n rook-ceph get pod -l app=rook-ceph-operator

Not: Eğer pod uzun süre Pending veya CrashLoopBackOff durumunda kalıyorsa, kubectl describe pod komutu ile detaylı hataları inceleyebilirsiniz.

5.3 Cluster Kurulumunun Başlatılması

Operatör sağlıklı bir şekilde çalışmaya başladığında, cluster.yaml dosyasını uygulayarak Ceph cluster’ını başlatabilirsiniz:

kubectl create -f cluster.yaml

Bu komut, cluster’ın oluşturulmasını başlatır ve tüm ilgili bileşenler (mon, mgr, osd) Kubernetes üzerinde dağıtılır.


Operatörün ve Cluster’ın Durumunu Kontrol Etme

Operatör ve cluster bileşenlerinin doğru bir şekilde çalıştığını doğrulamak için aşağıdaki komutları kullanabilirsiniz:

kubectl -n rook-ceph get pod

Beklenen çıktı:

NAME                                           READY   STATUS    RESTARTS   AGE
rook-ceph-operator-7f9d7f48d9-bml7q            1/1     Running   0          5m
rook-ceph-mon-a-6d68866f5d-n4v4j               1/1     Running   0          2m
rook-ceph-mgr-a-6c9c7f9986-v5pb9               1/1     Running   0          2m
rook-ceph-osd-0-546ddf7d64-mnbxv               1/1     Running   0          1m
rook-ceph-crashcollector-worker-1-84bd4        1/1     Running   0          1m

Her podun STATUS sütununda Running olarak göründüğünden emin olun.


Notlar

  • Operatör Podunu İzleme: Operatörün Running durumuna geçmeden önce cluster.yaml dosyasını çalıştırmayın, aksi takdirde cluster kurulumu sırasında hatalarla karşılaşabilirsiniz.
  • Hatırlatma: Cluster kurulumu başlatıldıktan sonra, tüm bileşenlerin başarılı bir şekilde dağıtıldığını kontrol etmek için kubectl get pod komutunu sık sık çalıştırabilirsiniz.

Adım 6: CephBlockPool ve StorageClass Tanımlama

Öncelikle, ceph-rbd-storage adında bir CephBlockPool tanımlıyoruz. Bu havuz, StorageClass için gerekli olan temel yapı taşlarından biridir. Daha sonra StorageClass tanımını uygulayacağız.

CephBlockPool Tanımı (cephblockpool.yaml)

apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
  name: ceph-rbd-storage
  namespace: rook-ceph
spec:
  failureDomain: host
  replicated:
    size: 3
    requireSafeReplicaSize: true

Açıklamalar:

  • failureDomain: host: Verilerin node’lar arasında replikasyonunu sağlar.
  • replicated.size: 3: Verilerin 3 kopyasını oluşturur (yüksek erişilebilirlik için).

CephBlockPool’u oluşturmak için:

kubectl apply -f cephblockpool.yaml

StorageClass Tanımı (storageclass.yaml)

Havuzu tanımladıktan sonra, aşağıdaki gibi bir StorageClass oluşturuyoruz. pool parametresi olarak ceph-rbd-storage kullanılıyor.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: rook-ceph-block
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
  clusterID: rook-ceph
  pool: ceph-rbd-storage
  imageFormat: "2"
  imageFeatures: layering
  csi.storage.k8s.io/fstype: ext4
allowVolumeExpansion: true
reclaimPolicy: Retain

StorageClass’ı oluşturmak için:

kubectl apply -f storageclass.yaml

Not: reclaimPolicy: Retain ile PVC silinse bile Ceph üzerindeki verilerin korunmasını sağlıyoruz.


Adım 7: Persistent Volume Claim (PVC) ve Pod Testi

Bir PVC ve bir Nginx podu oluşturarak yapılandırmanın doğru çalıştığını test ediyoruz.

PVC Tanımı (test-pvc.yaml):

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-pvc-ceph
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: rook-ceph-block

PVC oluşturmak için:

kubectl apply -f test-pvc.yaml

Pod Tanımı (test-nginx.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        volumeMounts:
        - name: image-store
          mountPath: /data
      volumes:
      - name: image-store
        persistentVolumeClaim:
          claimName: test-pvc-ceph

Nginx dağıtımını oluşturmak için:

kubectl apply -f test-nginx.yaml

Önemli Notlar

  1. Worker Node Kullanımı: Depolama işlemleri yalnızca worker node’lar üzerinde gerçekleştirilecek şekilde yapılandırılmıştır.
  2. Saat Senkronizasyonu: Tüm Kubernetes node’larının saatlerinin senkronize olduğundan emin olun.
  3. Ceph Dashboard: Yönetim paneline erişim için:
   kubectl -n rook-ceph port-forward svc/rook-ceph-mgr-dashboard 8443:8443

Sonuç

Bu rehberde, Kubernetes cluster’ınızın worker node’ları üzerinde çalışan bir Rook Ceph kurulumunu tamamladık. YAML dosyalarınızı verdiğiniz şekilde tam olarak kullanarak, herhangi bir kafa karışıklığına yer bırakmadık. Rook Ceph, Kubernetes iş yükleriniz için güçlü ve güvenilir bir depolama çözümü sağlar. Eğer Kubernetes cluster kurulumuna dair bilgi almak isterseniz, Kubernetes Kurulum Rehberimize göz atabilirsiniz.