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 Digital Oceanu. 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 Kuberneres

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

Ondrej Sika

ondrej@sika.io
+420 773 452 376

IČ:88114163
DIČ:CZ9302252102
Účet:   2301432033/2010

Zajímají Vás novinky?

Odebírejte můj newsletter a budete v obraze!

Website by Zuzana Jeschke