Come illustrato nella prima parte di questa serie di articoli, può essere difficile mappare le posizioni degli oggetti dell'applicazione nei cluster OpenShift Data Foundation (ODF). Il mio obiettivo è semplificare questo processo dimostrando come stabilire un contenitore per la risoluzione dei problemi e quindi come utilizzarlo per la mappatura dell'archiviazione di file e blocchi.
Assicurati di leggere prima la prima parte per comprendere l'ambiente e il kit di strumenti necessario. È ora di iniziare creando il progetto dimostrativo.
Crea il progetto
Successivamente, crea due semplici applicazioni di test, una che utilizza il blocco SC e l'altra che utilizza il file SC, per eseguire le attività di mappatura in cui i dati di queste applicazioni vengono archiviati nel cluster ODF.
Innanzitutto, crea un progetto denominato ocs-block-app per ospitare l'applicazione:
[alexon@bastion ~]$ oc new-project ocs-block-appNow utilizzando il progetto "ocs-block-app" sul server "https://api.example.com:6443".
Puoi aggiungere applicazioni a questo progetto con new-app
comando. Ad esempio, per creare una nuova applicazione di esempio in Ruby, prova:
oc new-app rails-postgresql-example
Oppure usa kubectl
per distribuire una semplice applicazione Kubernetes:
kubectl crea distribuzione hello-node --image=k8s.gcr.io/serve_hostname
Quindi, utilizzare uno dei modelli messi a disposizione da OCP che utilizza il blocco. È una buona idea utilizzare il modello rails-pgsql-persistent :
[alexon@bastion ~]$ oc get templates -n openshift -o custom-columns=NAME:.metadata.name | grep ^rotaie | head -1rails-pgsql-persistent
Nei parametri disponibili nel template è possibile vedere che la dimensione della richiesta di volume è personalizzabile:
[alexon@bastion ~]$ oc process --parameters -n openshift rails-pgsql-persistent | grep -i volumeVOLUME_CAPACITY Spazio in volume disponibile per i dati, ad es. 512Mi, 2Gi 1Gi
Esegui questa nuova applicazione e regola la dimensione della richiesta di volume a 5 GB:
[alexon@bastion ~]$ oc new-app rails-pgsql-persistent -p VOLUME_CAPACITY=5Gi--> Distribuzione del modello "openshift/rails-pgsql-persistent" per il progetto ocs-block-app Rails + PostgreSQL --------- Un esempio di applicazione Rails con un database PostgreSQL. Per ulteriori informazioni sull'utilizzo di questo modello, incluse le considerazioni su OpenShift, vedere https://github.com/sclorg/rails-ex/blob/master/README.md. I seguenti servizi sono stati creati nel tuo progetto:rails-pgsql-persistent, postgresql. Per ulteriori informazioni sull'utilizzo di questo modello, incluse le considerazioni su OpenShift, vedere https://github.com/sclorg/rails-ex/blob/master/README.md. * Con parametri: * Name=rails-pgsql-persistent * Namespace=openshift * Memory Limit=512Mi * Memory Limit (PostgreSQL)=512Mi * Volume Capacity=5Gi * Git Repository URL=https://github.com/sclorg/rails -ex.git * Git Reference =* contesto della directory =* L'applicazione host =* GitHub Webhook segreto =ahNYBvvbrEFhRjFEX28XdXn04CvMgkbQuABBKruJ # generato * chiave segreta =m2aq81igaa74gh1shh8vawcywvsxjqjqubywwkcadymj0b1va0krkgsog000ksdusf7h6gyyhoxyh6dcfhw2swsen85o8sq43vod1hvlbtvu7n6x14sn7k4vcs0uwxr # generato * Applicazione Nome utente =OpenShift * Applicazione password =* segreto Rotaie Ambiente =produzione * database del servizio nomi =postgresql * Nome utente database=userWXH # generato * Password database=pOxlVrav # generato * Nome database=root * Connessioni database massime=100 * Ammontare buffer condiviso=12 MB * URL mirror RubyGems personalizzato=--> Creazione risorse ... segreto "rails-pgsql-persistent" creato servizio "rails-pgsql-persistent" creato route.route.openshift.io "rails-pgsql-persistent" creato imagestream.image.openshift.io "rails-pgsql-persistent" creato buildconfig. build.openshift.io "rails-pgsql-persistent" creato deploymentconfig.apps.openshift.io "rails-pgsql-persistent" creato persistentvolumeclaim "postgresql" creato servizio "postgresql" creato deploymentconfig.apps.openshift.io "postgresql" creato- -> Successo Accedi all'applicazione tramite il percorso 'rails-pgsql-persistent-ocs-block-app.apps.example.com' Compilazione pianificata, utilizza 'oc logs -f buildconfig/rails-pgsql-persistent' per monitorare l'avanzamento. Esegui 'oc status' per visualizzare la tua app.
Dopo qualche istante, verifica che l'applicazione sia funzionante:
[alexon@bastion ~]$ oc statusIn project ocs-block-app sul server https://api.example.com:6443svc/postgresql - 172.30.176.29:5432 dc/postgresql distribuisce openshift/postgresql:12-el8 deployment n. 1 distribuito 4 minuti fa - 1 podhttp://rails-pgsql-persistent-ocs-block-app.apps.example.com (svc/rails-pgsql-persistent) dc/rails-pgsql-persistent deploys istag/rails-pgsql-persistent:latest <- bc/rails-pgsql-persistent build di sorgenti https://github.com/sclorg/rails-ex.git su openshift/ruby:2.6-ubi8 deployment n. 1 distribuito 3 minuti fa - 1 podVisualizza i dettagli con 'oc describe /' o elenca le risorse con 'oc get all'.[alexon@bastion ~]$ oc get podsNAME READY STATUS RESTARTS AGEpostgresql-1-deploy 0/1 Completato 0 4m49spostgresql -1-k6t47 1/1 In esecuzione 0 4m46srails-pgsql-persistent-1-build 0/1 Completato 0 4m50srails-pgsql-persistent-1-deploy 0/1 Completato 0 3m9srails-pgsql-persistent-1-dgfkq 1/1 In esecuzione 0 2m57srails-pgsql-persistent-1-hook-pre 0/1 Compl eted 0 3m6s
Controllare la PVC creata dall'applicazione che sta utilizzando il blocco ODF SC, che in questo caso è Ceph RBD:
[Alexon@bastione ~] $ oc Get pvcName Volume di stato Modalità Accesso di accesso STORAGECLASS AGEPOSTGRESQL LOCT PVC-371FAEC8-2017-43B4-8416-7003A0D539A9 5GI RWO OCS-STORAGUTER-EPH-RBD 8M35S
Nelle specifiche PV utilizzate dalla PVC, all'interno del campo CSI, è presente un attributo che fornisce il nome dell'immagine creato per l'applicazione all'interno del pool di blocchi Ceph. Puoi estrarre il nome da questa immagine come segue:
[alexon@bastion ~]$ oc get pv pvc-371faec8-2017-43b4-8416-7003a0d539a9 -o jsonpath="{.spec.csi.volumeAttributes.imageName}{'\n'}"csi -vol-24624906-bccb-11eb-9cab-0a580a81023f
Con il nome dell'immagine in mano, accedi nuovamente alla casella degli strumenti ed elenca i pool esistenti:
[alexon@bastion ~]$ oc rsh -n openshift-storage $toolboxsh-4.4$ ceph dfRAW STORAGE: CLASS SIZE AVAIL USED RAW USED % RAW USED ssd 1.5 TiB 1.3 TiB 252 GiB 255 GiB 16.63 TOTALE 1.5 TIB 1.3 TIB 252 GIB 255 GIB 16.63 Pool:ID pool Oggetti memorizzati usati%usati Max disponibile OCS-StorageCluster-CephBlockpool 1 84 GIB 22.39K 252 GIB 19.37 350 Gib OCS-STORAGECLUSTER-CEPHISYSTEM-METADATA 2 1.4 MIB 25 4.2 MIB 0 350 Gib Gib 0 350 Gib Gib ocs-storagecluster-cephfilesystem-data0 3 0 B 0 0 B 0 350 GiB
Ricorda che ho menzionato che il ocs-storagecluster-cephblockpool la piscina è usata per i blocchi? Vedi se riesci a trovare la tua immagine all'interno:
sh-4.4$ rados -p ocs-storagecluster-cephblockpool ls | grep csi-vol-24624906-bccb-11eb-9cab-0a580a81023frbd_id.csi-vol-24624906-bccb-11eb-9cab-0a580a81023f
C'è la tua immagine. Mostra qualche informazione in più a riguardo:
sh-4.4$ rbd -p ocs-storagecluster-cephblockpool info csi-vol-24624906-bccb-11eb-9cab-0a580a81023frbd image 'csi-vol-24624906-bccb-11eb-9cab-0a580a81023f': size 5 GB a 1280 oggetti ordine 22 (4 oggetti MIB) snapshot_count:0 id:926554e4aba49 block_name_prefix:formato rbd_data.926554e4aba49:2 caratteristiche:op_features stratificazione:flags:create_timestamp:lun 24 Mag 2021 20:03:43 access_timestamp:lun 24 Mag 20 :03:43 2021 modify_timestamp:lun 24 maggio 20:03:43 2021
Vedi che ha le stesse dimensioni precedentemente definite per la creazione del PVC. E cosa succede se si aumenta la capacità del PVC? Aumento da 5 GB a 10 GB:
; ]$ oc patch pvc postgresql -n ocs-block-app --type json --patch '[{ "op":"replace", "path":"/spec/resources/requests/storage", "value":"10Gi"}] 'persistentvolumeclaim / PostgreSQL patch [Alexon @ bastione ~] $ oc get pvcNAME stato del volume capacità di accesso MODI Stoccaggio-AGEpostgresql Bound pvc-371faec8-2017-43b4-8416-7003a0d539a9 10Gi RWO 19m ocs-storagecluster-ceph-RBDAccedi di nuovo al contenitore della casella degli strumenti. Anche la dimensione dell'immagine è stata modificata, riflettendo il ridimensionamento del PVC:
[alexon@bastion ~]$ oc rsh -n openshift-storage $toolboxsh-4.4$ ceph dfRAW STORAGE: CLASS SIZE AVAIL USED RAW USED % RAW USED ssd 1.5 TiB 1.3 TiB 253 GiB 256 GiB 16.64 TOTALE 1.5 TIB 1.3 TIB 253 GIB 256 GIB 16.64 Pools:ID pool Oggetti memorizzati utilizzati %usati Max disponibile OCS-StorageCluster-CephBlockpool 1 84 GIB 22.41K 253 Gib 19.39 350 Gib OCS-STORAGECLUSTER-CEPHISYSYSTYSTEMSYSTEM-METADATA 2 1.4 MIB 25 4.2 MIB 0 350 Gib Gib 0 350 Gib Gib 0 350 Gib gib ocs-storagecluster-cephfilesystem-data0 3 0 B 0 0 B 0 350 GiB sh-4.4$ rbd -p ocs-storagecluster-cephblockpool info csi-vol-24624906-bccb-11eb-9cab-0a580a81023frbd image 'csi-vol-24624906- BCCB-11EB-9CAB-0A580A81023F ':dimensione 10 Gib in 2560 Oggetti Ordine 22 (4 oggetti MIB) Snapshot_Count:0 ID:926554E4E4ABA49 BLOCK_NAME_PREFIX:RBD_DATA.926554E4E4ABA49 FORMAT:2 FATTURA:Strappamento OP_FAGGIO:BLACKS_PREFIX:RBD_Data:RBD_DATA. 4 20:03:43 2021 access_timestamp:lun 24 maggio 20:03:43 2021 modify_timestamp:lun 24 maggio 20:03:43 2021
Cosa succede se si desidera sapere su quale dispositivo e host è mappata l'immagine? Il client Ceph recupera l'ultima mappa del cluster. L'algoritmo CRUSH calcola come mappare l'oggetto a un gruppo di posizionamenti e quindi calcola come assegnare dinamicamente il gruppo di posizionamenti a un OSD. Per trovare la posizione dell'oggetto, tutto ciò che serve è il nome dell'oggetto e il nome del pool:
sh-4.4$ ceph osd map ocs-storagecluster-cephblockpool csi-vol-24624906-bccb-11eb-9cab-0a580a81023fosdmap e405 pool 'ocs-storagecluster-cephblockpool' (1) oggetto 'csi-vol-24624906 -bccb-11eb-9cab-0a580a81023f' -> pg 1.ecb58a2b (1.b) -> su ([1,0,2], p1) in azione ([1,0,2], p1)
Ora so che il mio oggetto si trova in un PG che ha l'ID OSD 1 come dispositivo principale, nonché le repliche negli ID OSD 0 e 2. Su quale nodo nel mio cluster si trova il demone OSD 1? Vedi sotto:
sh-4.4$ ceph osd status+----+------------------------------+- ------+-------+--------+---------+---------+------- --+-----------+| id | ospite | usato | usufruire | operazioni | wr dati | rd operazioni | rd dati | stato |+----+------------------------------+--------+--- ----+--------+---------+---------+---------+------- ----+| 0 | ip-10-0-171-63.ec2.internal | 86.7G | 425G | 50 | 517k | 0 | 0 | esiste, su || 1 | ip-10-0-143-192.ec2.internal | 86.7G | 425G | 109 | 1224k | 0 | 0 | esiste, su || 2 | ip-10-0-154-20.ec2.internal | 86.7G | 425G | 78 | 1048k | 2 | 106 | esiste,su |+----+------------------------------+-------+- ------+--------+---------+--------+---------+----- ------+
Puoi vedere sopra che risiede nel nodo ip-10-0-143-192.ec2.internal . E quale dispositivo viene utilizzato su quel nodo? Vedi sotto:
SH-4,4 $ CEPH OSD TreeID Classe TIPO DI PESPO DI PESO DEL NOME STATO REI-AFF -1 1.50000 ROOT PREFAULT -5 1.50000 Regione US-EAST-1 -4 0,50000 ZONA US-EAST-EAST-1A -3 0,50000 OCS host -Deviceset-GP2-CSI-1-DATA-085B8H 1 SSD 0,50000 OSD.1 UP 1.00000 1.00000 -10 0,50000 ZONA US-EAST-EAST-1B -9 0,50000 OCS-DEVIESET-GP2-CSI-2-Data-2LKB 2 SSD 0.50000 OSD.2 UP 1.00000 1.00000 -14 0.50000 ZONA US-EAST-1C -13 0.50000 Host OCS-Deviceset-GP2-CSI-0-DATA-0GVT22 0 SSD 0,50000 OSD.0 UP 1.00000 1.00000
Ora so quale nodo e dispositivo (host ocs-deviceset-gp2-csi-1-data-085b8h ) la mia immagine è attiva. Ma ancora non so quale sia il percorso all'interno di quel nodo. Per questo, vedrai un altro attributo del PV che ti darà queste informazioni:
[alexon@bastion ~]$ oc get pv pvc-371faec8-2017-43b4-8416-7003a0d539a9 -o jsonpath="{.spec.csi.volumeHandle}{'\n'}"0001-0011 -openshift-storage-0000000000000001-24624906-bccb-11eb-9cab-0a580a81023f
Quindi, con il nome del nodo, il dispositivo e le informazioni sull'handle del volume in mano, accedi al nodo e ottieni la tua immagine. Puoi farlo cercando il nome dell'immagine sui punti di montaggio correnti del nodo o il nome dell'handle del volume:
[alexon@bastion ~]$ oc debug node/ip-10-0-143-192.ec2.internalStarting pod/ip-10-0-143-192ec2internal-debug ...Per utilizzare i binari dell'host , esegui `chroot /host`Pod IP:10.0.143.192Se non vedi un prompt dei comandi, prova a premere enter.sh-4.4# mount | grep 24624906-bccb-11eb-9cab-0a580a81023f/dev/rbd2 su /host/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-371faec8-2017-43b4-8416-7003a0d539a9/globalmount/0001- 0011-openshift-storage-00000000000000001-24624906-bccb-11eb-9cab-0a580a81023f tipo ext4 (rw,relatime,seclabel,stripe=16)
Puoi vedere che l'immagine è montata sul seguente percorso con un filesystem EXT4 dal dispositivo/dev/rbd2
:
/host/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-371faec8-2017-43b4-8416-7003a0d539a9/globalmount/0001-0011-openshift-storage-00000000000000001-24624906 -bccb-11eb-9cab-0a580a81023f
Guarda il contenuto di questa directory:
sh-4.4# ls /host/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-371faec8-2017-43b4-8416-7003a0d539a9/globalmount/0001-0011-openshift- storage-000000000000001-24624906-bccb-11eb-9cab-0a580a81023flost+trovato userdatash-4.4# ls /host/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-371faec8-2017-43b4-8416-7003a90d533 / globalmount / 0001-0011-OpenShift-storage-000000000000001-24.624.906-BCCB-11eb-9cab-0a580a81023f / userdata / PG_VERSION globale pg_dynshmem pg_logical pg_replslot pg_stat pg_tblspc pg_xact postmaster.optsbase accedere pg_hba.conf pg_multixact pg_serial pg_stat_tmp pg_twophase postgresql.auto.conf postmaster .pidcurrent_logfiles pg_commit_ts pg_ident.conf pg_notify pg_snapshots pg_subtrans pg_wal postgresql.conf
E come puoi vedere sopra, questi sono i contenuti del tuo database dell'applicazione a blocchi che hai creato.
[ Impara le basi dell'uso di Kubernetes in questo cheat sheet gratuito. ]
Concludi
All'inizio di questo articolo (parte seconda della serie), hai creato un progetto dimostrativo con cui lavorare. Hai anche esaminato la mappatura delle applicazioni a blocchi all'interno di un cluster ODF utilizzando la casella degli strumenti Rook e i comandi OpenShift.
Assicurati di leggere la parte tre, poiché contiene ulteriori idee per la mappatura e la risoluzione dei problemi incentrate sull'archiviazione e la mappatura dei file.