Wie in Teil 1 dieser Artikelserie behandelt, kann es schwierig sein, die Speicherorte von Anwendungsobjekten in OpenShift Data Foundation (ODF)-Clustern zuzuordnen. Mein Ziel ist es, diesen Prozess für Sie zu vereinfachen, indem ich Ihnen zeige, wie Sie einen Fehlerbehebungscontainer einrichten und ihn dann sowohl für die Block- als auch für die Dateispeicherzuordnung verwenden.
Lesen Sie unbedingt zuerst Teil 1, um die Umgebung und das erforderliche Toolkit zu verstehen. Es ist an der Zeit, mit der Erstellung des Demonstrationsprojekts zu beginnen.
Projekt erstellen
Erstellen Sie als Nächstes zwei einfache Testanwendungen, eine, die den Block-SC verwendet, und die andere, die den Datei-SC verwendet, um die Aufgaben der Zuordnung durchzuführen, wo die Daten dieser Anwendungen im ODF-Cluster gespeichert werden.
Erstellen Sie zunächst ein Projekt mit dem Namen ocs-block-app um die Anwendung zu hosten:
[alexon@bastion ~]$ oc new-project ocs-block-app
Now using project "ocs-block-app" on server "https://api.example.com:6443".
Sie können diesem Projekt mit new-app
Anwendungen hinzufügen Befehl. Um beispielsweise eine neue Beispielanwendung in Ruby zu erstellen, versuchen Sie Folgendes:
oc new-app rails-postgresql-example
Oder verwenden Sie kubectl
So stellen Sie eine einfache Kubernetes-Anwendung bereit:
kubectl create deployment hello-node --image=k8s.gcr.io/serve_hostname
Verwenden Sie dann eine der von OCP bereitgestellten Vorlagen, die Block verwendet. Es ist eine gute Idee, das Template rails-pgsql-persistent zu verwenden :
[alexon@bastion ~]$ oc get templates -n openshift -o custom-columns=NAME:.metadata.name | grep ^rails | head -1
rails-pgsql-persistent
In den in der Vorlage verfügbaren Parametern ist ersichtlich, dass die Größe der Volumenanforderung anpassbar ist:
[alexon@bastion ~]$ oc process --parameters -n openshift rails-pgsql-persistent | grep -i volume
VOLUME_CAPACITY
Volume space available for data, e.g. 512Mi, 2Gi
1Gi
Führen Sie diese neue Anwendung aus und passen Sie die Volumenanforderungsgröße auf 5 GB an:
[alexon@bastion ~]$ oc new-app rails-pgsql-persistent -p VOLUME_CAPACITY=5Gi
--> Deploying template "openshift/rails-pgsql-persistent" to project ocs-block-app
Rails + PostgreSQL
---------
An example Rails application with a PostgreSQL database. For more information about using this template, including OpenShift considerations, see https://github.com/sclorg/rails-ex/blob/master/README.md.
The following service(s) have been created in your project: rails-pgsql-persistent, postgresql.
For more information about using this template, including OpenShift considerations, see https://github.com/sclorg/rails-ex/blob/master/README.md.
* With parameters:
* 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=
* Context Directory=
* Application Hostname=
* GitHub Webhook Secret=ahNYBvvbrEFhRjFEX28XdXn04CvMgkbQuABBKruJ # generated
* Secret Key=m2aq81igaa74gh1shh8vawcywvsxjqjqubywwkcadymj0b1va0krkgsog000ksdusf7h6gyyhoxyh6dcfhw2swsen85o8sq43vod1hvlbtvu7n6x14sn7k4vcs0uwxr # generated
* Application Username=openshift
* Application Password=secret
* Rails Environment=production
* Database Service Name=postgresql
* Database Username=userWXH # generated
* Database Password=pOxlVrav # generated
* Database Name=root
* Maximum Database Connections=100
* Shared Buffer Amount=12MB
* Custom RubyGems Mirror URL=
--> Creating resources ...
secret "rails-pgsql-persistent" created
service "rails-pgsql-persistent" created
route.route.openshift.io "rails-pgsql-persistent" created
imagestream.image.openshift.io "rails-pgsql-persistent" created
buildconfig.build.openshift.io "rails-pgsql-persistent" created
deploymentconfig.apps.openshift.io "rails-pgsql-persistent" created
persistentvolumeclaim "postgresql" created
service "postgresql" created
deploymentconfig.apps.openshift.io "postgresql" created
--> Success
Access your application via route 'rails-pgsql-persistent-ocs-block-app.apps.example.com'
Build scheduled, use 'oc logs -f buildconfig/rails-pgsql-persistent' to track its progress.
Run' oc status' to view your app.
Überprüfen Sie nach einigen Augenblicken, ob die Anwendung funktioniert:
[alexon@bastion ~]$ oc status
In project ocs-block-app on server https://api.example.com:6443
svc/postgresql - 172.30.176.29:5432
dc/postgresql deploys openshift/postgresql:12-el8
deployment #1 deployed 4 minutes ago - 1 pod
http://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 source builds https://github.com/sclorg/rails-ex.git on openshift/ruby:2.6-ubi8
deployment #1 deployed 3 minutes ago - 1 pod
View details with 'oc describe <resource>/<name>' or list resources with 'oc get all'.
[alexon@bastion ~]$ oc get pods
NAME READY STATUS
RESTARTS AGE
postgresql-1-deploy 0/1 Completed
0 4m49s
postgresql-1-k6t47 1/1 Running
0 4m46s
rails-pgsql-persistent-1-build 0/1
Completed 0 4m50s
rails-pgsql-persistent-1-deploy 0/1
Completed 0 3m9s
rails-pgsql-persistent-1-dgfkq 1/1
Running 0 2m57s
rails-pgsql-persistent-1-hook-pre 0/1
Completed 0 3m6s
Prüfen Sie, ob der von der Anwendung erstellte PVC den ODF-Block SC verwendet, in diesem Fall Ceph RBD:
[alexon@bastion ~]$ oc get pvc
NAME STATUS
VOLUME
CAPACITY ACCESS MODES STORAGECLASS AGE
postgresql
Bound
pvc-371faec8-2017-43b4-8416-7003a0d539a9 5Gi
RWO
ocs-storagecluster-ceph-rbd
8m35s
In den PV-Spezifikationen, die vom PVC verwendet werden, gibt es im CSI-Feld ein Attribut, das den Image-Namen bereitstellt, der für die Anwendung im Ceph-Blockpool erstellt wurde. Sie können den Namen wie folgt aus diesem Bild extrahieren:
[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
Greifen Sie mit dem Namen des Images in der Hand erneut auf die Toolbox zu und listen Sie die vorhandenen Pools auf:
[alexon@bastion ~]$ oc rsh -n openshift-storage $toolbox
sh-4.4$ ceph df
RAW STORAGE:
CLASS SIZE
AVAIL USED RAW USED %RAW USED
ssd 1.5 TiB 1.3 TiB
252 GiB 255 GiB 16.63
TOTAL 1.5 TiB
1.3 TiB 252 GiB 255 GiB 16.63
POOLS:
POOL
ID STORED OBJECTS USED
%USED MAX AVAIL
ocs-storagecluster-cephblockpool 1 84 GiB 22.39k
252 GiB 19.37 350 GiB
ocs-storagecluster-cephfilesystem-metadata 2
1.4 MiB 25 4.2 MiB 0
350 GiB
ocs-storagecluster-cephfilesystem-data0 3 0 B 0 0 B 0
350 GiB
Denken Sie daran, dass ich erwähnt habe, dass der ocs-storagecluster-cephblockpool Pool wird für Blöcke verwendet? Sehen Sie, ob Sie Ihr Bild darin finden können:
sh-4.4$ rados -p ocs-storagecluster-cephblockpool ls | grep csi-vol-24624906-bccb-11eb-9cab-0a580a81023f
rbd_id.csi-vol-24624906-bccb-11eb-9cab-0a580a81023f
Da ist dein Bild. Weitere Informationen darüber anzeigen:
sh-4.4$ rbd -p ocs-storagecluster-cephblockpool info csi-vol-24624906-bccb-11eb-9cab-0a580a81023f
rbd image 'csi-vol-24624906-bccb-11eb-9cab-0a580a81023f':
size 5 GiB in 1280 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 926554e4aba49
block_name_prefix: rbd_data.926554e4aba49
format: 2
features: layering
op_features:
flags:
create_timestamp: Mon May 24 20:03:43 2021
access_timestamp: Mon May 24 20:03:43 2021
modify_timestamp: Mon May 24 20:03:43 2021
Stellen Sie sicher, dass es dieselbe Größe hat, die zuvor für die Erstellung von PVC definiert wurde. Und was passiert, wenn Sie die Kapazität von PVC erhöhen? Erhöhung von 5 GB auf 10 GB:
[alexon@bastion ~]$ oc get pvc
NAME
STATUS VOLUME
CAPACITY ACCESS MODES STORAGECLASS AGE
postgresql
Bound
pvc-371faec8-2017-43b4-8416-7003a0d539a9 5Gi
RWO
ocs-storagecluster-ceph-rbd 17m
[alexon@bastion ~]$ oc patch pvc postgresql -n ocs-block-app --type json --patch '[{ "op": "replace", "path": "/spec/resources/requests/storage", "value": "10Gi" }]'
persistentvolumeclaim/postgresql patched
[alexon@bastion ~]$ oc get pvc
NAME
STATUS VOLUME
CAPACITY ACCESS MODES STORAGECLASS AGE
postgresql
Bound
pvc-371faec8-2017-43b4-8416-7003a0d539a9 10Gi
RWO
ocs-storagecluster-ceph-rbd 19m
Greifen Sie erneut auf den Toolbox-Pod zu. Die Bildgröße wurde ebenfalls geändert, um die Größenänderung des PVC widerzuspiegeln:
[alexon@bastion ~]$ oc rsh -n openshift-storage $toolbox
sh-4.4$ ceph df
RAW STORAGE:
CLASS SIZE
AVAIL USED RAW USED %RAW USED
ssd 1.5 TiB 1.3 TiB
253 GiB 256 GiB 16.64
TOTAL 1.5 TiB
1.3 TiB 253 GiB 256 GiB 16.64
POOLS:
POOL ID STORED
OBJECTS USED %USED MAX AVAIL
ocs-storagecluster-cephblockpool 1 84 GiB 22.41k
253 GiB 19.39 350 GiB
ocs-storagecluster-cephfilesystem-metadata 2
1.4 MiB 25 4.2 MiB 0
350 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-0a580a81023f
rbd image 'csi-vol-24624906-bccb-11eb-9cab-0a580a81023f':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 926554e4aba49
block_name_prefix: rbd_data.926554e4aba49
format: 2
features: layering
op_features:
flags:
create_timestamp: Mon May 24 20:03:43 2021
access_timestamp: Mon May 24 20:03:43 2021
modify_timestamp: Mon May 24 20:03:43 2021
Was ist, wenn Sie wissen möchten, auf welchem Gerät und Host das Image abgebildet ist? Der Ceph-Client ruft die neueste Cluster-Karte ab. Der CRUSH-Algorithmus berechnet, wie das Objekt einer Platzierungsgruppe zuzuordnen ist, und berechnet dann, wie die Platzierungsgruppe dynamisch einem OSD zugewiesen wird. Um den Objektstandort zu finden, benötigen Sie lediglich den Objektnamen und den Poolnamen:
sh-4.4$ ceph osd map ocs-storagecluster-cephblockpool csi-vol-24624906-bccb-11eb-9cab-0a580a81023f
osdmap e405 pool 'ocs-storagecluster-cephblockpool' (1) object 'csi-vol-24624906-bccb-11eb-9cab-0a580a81023f' -> pg 1.ecb58a2b (1.b) -> up ([1,0,2], p1) acting ([1,0,2], p1)
Jetzt weiß ich, dass sich mein Objekt in einem PG befindet, das die OSD-ID 1 als primäres Gerät hat, sowie Replikate in den OSD-IDs 0 und 2. Auf welchem Knoten in meinem Cluster befindet sich der OSD 1-Daemon? Siehe unten:
sh-4.4$ ceph osd status
+----+------------------------------+-------+-------+--------+---------+--------+---------+-----------+
| id |
host | used | avail | wr ops | wr data | rd ops | rd data | state |
+----+------------------------------+-------+-------+--------+---------+--------+---------+-----------+
| 0 | ip-10-0-171-63.ec2.internal | 86.7G | 425G | 50 | 517k
| 0 |
0 | exists,up |
| 1 | ip-10-0-143-192.ec2.internal | 86.7G | 425G | 109
| 1224k |
0 | 0
| exists,up |
| 2 | ip-10-0-154-20.ec2.internal | 86.7G | 425G | 78 | 1048k
| 2 |
106 | exists,up |
+----+------------------------------+-------+-------+--------+---------+--------+---------+-----------+
Sie können oben sehen, dass es sich im Knoten ip-10-0-143-192.ec2.internal befindet . Und welches Gerät wird auf diesem Knoten verwendet? Siehe unten:
sh-4.4$ ceph osd tree
ID CLASS WEIGHT TYPE NAME
STATUS REWEIGHT PRI-AFF
-1 1.50000 root default
-5 1.50000 region us-east-1
-4 0.50000 zone us-east-1a
-3 0.50000 host ocs-deviceset-gp2-csi-1-data-085b8h
1 ssd 0.50000 osd.1 up 1.00000 1.00000
-10
0.50000 zone us-east-1b
-9 0.50000 host ocs-deviceset-gp2-csi-2-data-0n9lkb
2 ssd 0.50000 osd.2 up 1.00000 1.00000
-14
0.50000 zone 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
Jetzt weiß ich, welcher Knoten und welches Gerät (ocs-deviceset-gp2-csi-1-data-085b8h hosten ) mein Bild ist eingeschaltet. Aber ich weiß immer noch nicht, welcher Pfad innerhalb dieses Knotens es ist. Dazu sehen Sie ein weiteres Attribut des PV, das Ihnen diese Informationen liefert:
[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
Greifen Sie also mit den Informationen zu Knotenname, Gerät und Volume-Handle auf den Knoten zu und erhalten Sie Ihr Image. Sie können dies tun, indem Sie entweder nach dem Image-Namen auf den aktuellen Einhängepunkten des Knotens suchen oder nach dem Namen des Volume-Handles:
[alexon@bastion ~]$ oc debug node/ip-10-0-143-192.ec2.internal
Starting pod/ip-10-0-143-192ec2internal-debug ...
To use host binaries, run `chroot /host`
Pod IP: 10.0.143.192
If you don't see a command prompt, try pressing enter.
sh-4.4# mount | grep 24624906-bccb-11eb-9cab-0a580a81023f
/dev/rbd2 on /host/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-371faec8-2017-43b4-8416-7003a0d539a9/globalmount/0001-0011-openshift-storage-0000000000000001-24624906-bccb-11eb-9cab-0a580a81023f type ext4 (rw,relatime,seclabel,stripe=16)
Sie können sehen, dass das Image auf dem folgenden Pfad mit einem EXT4-Dateisystem durch das Gerät /dev/rbd2
gemountet wird :
/host/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-371faec8-2017-43b4-8416-7003a0d539a9/globalmount/0001-0011-openshift-storage-0000000000000001-24624906-bccb-11eb-9cab-0a580a81023f
Sehen Sie sich den Inhalt dieses Verzeichnisses an:
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-0a580a81023f
lost+found userdata
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-0a580a81023f/userdata/
PG_VERSION global pg_dynshmem pg_logical pg_replslot pg_stat pg_tblspc pg_xact postmaster.opts
base log pg_hba.conf pg_multixact pg_serial pg_stat_tmp pg_twophase postgresql.auto.conf postmaster.pid
current_logfiles
pg_commit_ts pg_ident.conf pg_notify
pg_snapshots pg_subtrans pg_wal postgresql.conf
Und wie Sie oben sehen können, sind dies die Inhalte Ihrer Datenbank der von Ihnen erstellten Blockanwendung.
[ Lernen Sie die Grundlagen der Verwendung von Kubernetes in diesem kostenlosen Spickzettel. ]
Abschluss
Zu Beginn dieses Artikels (Teil zwei der Reihe) haben Sie ein Demonstrationsprojekt erstellt, mit dem Sie arbeiten können. Sie haben sich auch die Zuordnung von Blockanwendungen innerhalb eines ODF-Clusters angesehen, indem Sie die Rook-Toolbox und OpenShift-Befehle verwendet haben.
Lesen Sie auf jeden Fall Teil drei, da er zusätzliche Ideen zur Zuordnung und Fehlerbehebung enthält, die sich auf Dateispeicherung und -zuordnung konzentrieren.