Ceph Persistent volumes v Kubernetes pomocí Rook
#kubernetes #rook #ceph #storage
Kubernetes je skvělá platforma na provozování stateless aplikací. Storage je často řešena mimo Kubernetes cluster. Rook.io a Ceph je ultimátní řešení pro perzistentní storage přímo v Kubernetes clusteru.
Co je CEPH
Ceph je softwarově definovaná distribuovaná storage, která podporuje block device (RBD), object storage s (AWS S3 interface) a Filesystem (CEPH F5). Skvělý návod do Cephu je tato přednáška, od kamených destiček k distribuované storage za méně než hodinu: https://www.youtube.com/watch?v=7I9uxoEhUdY
Co je to Rook
Rook je sada Kubernetes operátorů, které výtváří a spravují storage v rámci Kubernetes Clusteru. Nejpoužívanější je Ceph, ale Rook podporuje i mnoho jiných typů storage, například: NFS, Cassandra, ... Přednáška o Rooku a Cephu na YouTube: https://www.youtube.com/watch?v=pNz0UyaqlE8
Setup Infrastruktury
Abychom mohli provozovat Ceph cluster, potřebujeme minimálně 3 Kubernetes nody s nejméně 4 GB RAM. Každý server musí mít nainstalované LVM (apt install lvm2
) a nejake disky (eg: /dev/sdb
), které použije Ceph pro svoji storage. My si to vytvoříme pomocí Terraformu na DigitalOceanu. Rovnou si připravíme i loadbalancer, který bude ukazovat na všechny nody a nasměřujeme na něj nějakou doménu.
Můžete použít moji ukázku z Githubu ondrejsika/terraform-do-rook-ceph-example.
Ta mi vytvoří 3 servery s druhým diskem (30 GB):
- rook0.sikademo.com
- rook1.sikademo.com
- rook2.sikademo.com
a laodbalancer, který ukazuje na všechny tyto nody na adrese rook.sikademo.com
s CNAME *.rook.sikademo.com
.
Instalace Kubernetes
Nejdřív potřebujeme nainstalovat Kubernetes. Můžeme použít kubeadmin
nebo Rancher. Já jsem použil Rancher a postavil jsem cluster kde každý node je master i worker zároveň.
rke up
Po instalaci clusteru ještě nainstaluju Traefik Ingress Controller:
kubectl apply -f https://k.sika.link/ingress.yml
k.sika.link je můj tool (source) na zkrácení cest z raw.githubusercontent.com
abych nemusel používat celou cestu https://raw.githubusercontent.com/rook/rook/release-1.3/cluster/examples/kubernetes/ceph/common.yaml
ale jen https://k.sika.link/rook-ceph-1.3/common.yaml
Instalace Rooku
Rook budeme instalovat podle postupu z jejich webu, nejdříve musíme vytvořit custom resources a spustit operátor.
kubectl create -f https://k.sika.link/rook-ceph-1.3/common.yaml
kubectl create -f https://k.sika.link/rook-ceph-1.3/operator.yaml
Počkáme až naběhnou všechny tyto pody (kubectl -n rook-ceph get po
):
ondrej@sika-mac:~/Examples/rook (master)$ kubectl -n rook-ceph get po
NAME READY STATUS RESTARTS AGE
rook-ceph-operator-66d99fccf4-fpwj9 1/1 Running 0 50s
rook-discover-5q8r4 1/1 Running 0 28s
rook-discover-7ng4s 1/1 Running 0 28s
rook-discover-dn6bj 1/1 Running 0 28s
Setup Ceph clusteru
Jakmile naběhne operátor a rook discover, můžete nasadit Ceph cluster.
kubectl create -f https://k.sika.link/rook-ceph-1.3/cluster.yaml
Počkáme dokud cluster nebude ready:
ondrej@sika-mac:~/Examples/rook (master)$ kubectl -n rook-ceph get cephcluster
NAMESPACE NAME DATADIRHOSTPATH MONCOUNT AGE PHASE MESSAGE HEALTH
rook-ceph rook-ceph /var/lib/rook 3 4m26s Ready Cluster created successfully HEALTH_OK
Instalace Storage Class
Abychom mohli vytvářet vlastní PVC na Cephu, musíme pro to vytvořit Storage Class
Tu vytvoříme příkazem:
kubectl apply -f https://k.sika.link/rook-ceph-1.3/csi/rbd/storageclass.yaml
Pokud vypíšeme Storage Classes, tak ji uvidíme:
ondrej@sika-mac:~/Examples/rook (master)$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate true 46s
Pokud máme jen jednu storage class, můžeme ji nastavit jako defaultní příkazem:
kubectl patch storageclass rook-ceph-block -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
Použítí Storage Class
Jako ukazku použítí nainstalujeme přes Helm 3 Wordpress:
helm repo add ondrejsika https://helm.oxs.cz
ondrej@sika-mac:~/Examples/rook (master)$ helm upgrade --install hello ondrejsika/wordpress-mysql --set host=hello.rook.sikademo.com
Release "hello" has been upgraded. Happy Helming!
NAME: hello
LAST DEPLOYED: Mon Apr 6 19:15:41 2020
NAMESPACE: default
STATUS: deployed
REVISION: 4
TEST SUITE: None
NOTES:
See: https://hello.rook.sikademo.com
Můžeme kouknout, že se storage připojili a pody běží:
ondrej@sika-mac:~/Examples/rook (master)$ kubectl get po,pvc,pv
NAME READY STATUS RESTARTS AGE
pod/hello-mysql-0 1/1 Running 0 14m
pod/hello-wordpress-7fdb4565f8-d7dns 1/1 Running 0 12m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/hello-mysql Bound pvc-157cba57-822f-43a0-ac97-54ef699a1c47 1Gi RWO rook-ceph-block 14m
persistentvolumeclaim/hello-wordpress Bound pvc-fd576f28-f9bd-475d-bceb-89e7eefca856 1Gi RWO rook-ceph-block 14m
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-157cba57-822f-43a0-ac97-54ef699a1c47 1Gi RWO Delete Bound default/hello-mysql rook-ceph-block 14m
persistentvolume/pvc-fd576f28-f9bd-475d-bceb-89e7eefca856 1Gi RWO Delete Bound default/hello-wordpress rook-ceph-block 14m
Vidime, že všechno jede. To je vše. Můžeme se na náš Wordpress podívat na https://hello.rook.sikademo.com
Školení Kubernetes
Zaujal Vás Kubernetes? Chcete se dozvědět více? Přijďte na mé Školení Kubernetes!
Případně si můžete vybrat z nabídky otevřených kurzů.
Ondřej Šika
Jsem freelance DevOps konzultant a lektor. Zlepšuji práci vývojářských týmu zaváděním efektivních procesů ve vývoji. Naučím Vás používat prověřené nástroje a technologie, které povedou k rychlejšímu vývoji a bezpečnějšímu provozu vašeho software.