Como se explica en la primera parte de esta serie de artículos, puede resultar difícil asignar ubicaciones de objetos de aplicación en clústeres de OpenShift Data Foundation (ODF). Mi objetivo es facilitarle este proceso mostrándole cómo establecer un contenedor de solución de problemas y luego cómo usarlo para la asignación de almacenamiento de archivos y bloques.
Asegúrese de leer la primera parte primero para comprender el entorno y el conjunto de herramientas necesario. Es hora de empezar creando el proyecto de demostración.
Crear el proyecto
A continuación, cree dos aplicaciones de prueba simples, una que use el bloque SC y la otra que use el archivo SC, para realizar las tareas de asignación de dónde se almacenan los datos de estas aplicaciones en el clúster ODF.
Primero, crea un proyecto llamado ocs-block-app para alojar la aplicación:
[alexon@bastion ~]$ oc new-project ocs-block-app
Now using project "ocs-block-app" on server "https://api.example.com:6443".
Puede agregar aplicaciones a este proyecto con new-app
dominio. Por ejemplo, para crear una nueva aplicación de ejemplo en Ruby, intente:
oc new-app rails-postgresql-example
O usa kubectl
para implementar una aplicación Kubernetes simple:
kubectl create deployment hello-node --image=k8s.gcr.io/serve_hostname
Luego, use una de las plantillas disponibles por OCP que hace uso de bloque. Una buena idea es usar la plantilla rails-pgsql-persistent :
[alexon@bastion ~]$ oc get templates -n openshift -o custom-columns=NAME:.metadata.name | grep ^rails | head -1
rails-pgsql-persistent
En los parámetros disponibles en la plantilla, es posible ver que el tamaño de la solicitud de volumen es personalizable:
[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
Ejecute esta nueva aplicación y ajuste el tamaño de la solicitud de volumen a 5 GB:
[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.
Después de unos momentos, verifique que la aplicación sea funcional:
[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
Verifique que el PVC creado por la aplicación esté usando el bloque ODF SC, que en este caso es 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
En las especificaciones de PV utilizadas por el PVC, dentro del campo CSI, hay un atributo que proporciona el nombre de la imagen creada para la aplicación dentro del grupo de bloques de Ceph. Puede extraer el nombre de esta imagen de la siguiente manera:
[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 el nombre de la imagen en la mano, acceda nuevamente a la caja de herramientas y enumere los grupos existentes:
[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
Recuerde que mencioné que el ocs-storagecluster-cephblockpool ¿La piscina se usa para bloques? Vea si puede encontrar su imagen dentro:
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
Ahí está tu imagen. Muestra más información al respecto:
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
Ver que tiene el mismo tamaño previamente definido para la creación de PVC. ¿Y qué pasa si aumentas la capacidad de PVC? Aumento de 5GB a 10GB:
[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
Vuelva a acceder al pod de la caja de herramientas. El tamaño de la imagen también se ha modificado, reflejando el cambio de tamaño del PVC:
[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
¿Qué sucede si desea saber en qué dispositivo y host está asignada la imagen? El cliente de Ceph recupera el último mapa de clústeres. El algoritmo CRUSH calcula cómo asignar el objeto a un grupo de ubicación y luego calcula cómo asignar el grupo de ubicación a un OSD dinámicamente. Para encontrar la ubicación del objeto, todo lo que necesita es el nombre del objeto y el nombre del grupo:
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)
Ahora sé que mi objeto está en un PG que tiene OSD ID 1 como su dispositivo principal, así como réplicas en OSD ID 0 y 2. ¿En qué nodo de mi clúster está el demonio OSD 1? Ver a continuación:
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 |
+----+------------------------------+-------+-------+--------+---------+--------+---------+-----------+
Puede ver arriba que reside en el nodo ip-10-0-143-192.ec2.internal . ¿Y qué dispositivo se está utilizando en ese nodo? Ver a continuación:
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
Ahora sé qué nodo y dispositivo (host ocs-deviceset-gp2-csi-1-data-085b8h ) mi imagen está encendida. Pero todavía no sé qué camino dentro de ese nodo es. Para ello verás otro atributo del PV que te dará esta información:
[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
Entonces, con el nombre del nodo, el dispositivo y la información del manejo del volumen en la mano, acceda al nodo y obtenga su imagen. Puede hacer esto buscando el nombre de la imagen en los puntos de montaje actuales del nodo o el nombre del controlador de volumen:
[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)
Puede ver que la imagen está montada en la siguiente ruta con un sistema de archivos EXT4 por el dispositivo /dev/rbd2
:
/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
Mire el contenido de este directorio:
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
Y como puede ver arriba, estos son los contenidos de su base de datos de la aplicación de bloqueo que creó.
[ Aprenda los aspectos básicos del uso de Kubernetes en esta hoja de trucos gratuita. ]
Resumir
Al comienzo de este artículo (la segunda parte de la serie), creó un proyecto de demostración con el que trabajar. También observó el mapeo de aplicaciones de bloques dentro de un clúster ODF usando la caja de herramientas Rook y los comandos OpenShift.
Asegúrese de leer la tercera parte, ya que contiene ideas adicionales de mapeo y solución de problemas centradas en el almacenamiento y el mapeo de archivos.