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
veyaCrashLoopBackOff
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 öncecluster.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
- Worker Node Kullanımı: Depolama işlemleri yalnızca worker node’lar üzerinde gerçekleştirilecek şekilde yapılandırılmıştır.
- Saat Senkronizasyonu: Tüm Kubernetes node’larının saatlerinin senkronize olduğundan emin olun.
- 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.