Seri artikel ini membantu Anda lebih memahami cara memetakan data aplikasi dalam kluster ODF dengan menggunakan toolkit Rook dan perintah OpenShift. Pengetahuan ini dan alat terkait dapat sangat berguna untuk pemecahan masalah serta pemahaman yang lebih dalam tentang penyimpanan data di ODF. Pastikan Anda telah membaca bagian satu dan dua sebelum membaca yang ini (bagian ketiga dari seri ini).
Buat proyek penyimpanan file
Anda akan mengikuti prinsip yang sama yang telah Anda gunakan sejauh ini untuk melakukan sesuatu yang mirip dengan proyek penyimpanan blok sebelumnya dengan aplikasi yang menggunakan CephFS dari ODF untuk penyimpanan bersama. Buat proyek baru bernama ocs-file-app :
[alexon@bastion ~]$ oc new-project ocs-file-app
Now using project "ocs-file-app" on server "https://api.example.com:6443".
Anda dapat menambahkan aplikasi ke proyek ini dengan new-app
memerintah. Misalnya, untuk membuat aplikasi contoh baru di Ruby, coba:
oc new-app rails-postgresql-example
Atau gunakan kubectl
untuk menerapkan aplikasi Kubernetes sederhana:
kubectl create deployment hello-node --image=k8s.gcr.io/serve_hostname
Untuk contoh ini, gunakan Demo Unggah File PHP OpenShift aplikasi (yang saya ambil dari proyek Christian Hernandez—kredit jatuh tempo) yang akan melayani minat Anda dengan baik:
[alexon@bastion ~]$ oc new-app openshift/php:7.2-ubi8~https://github.com/AlexonOliveiraRH/openshift-php-upload-demo.git --name=file-uploader
--> Found image 67520c7 (5 weeks old) in image stream "openshift/php" under tag "7.2-ubi8" for "openshift/php:7.2-ubi8"
Apache 2.4 with PHP 7.2
-----------------------
PHP 7.2 available as container is a base platform for building and running various PHP 7.2 applications and frameworks. PHP is an HTML-embedded scripting language. PHP attempts to make it easy for developers to write dynamically generated web pages. PHP also offers built-in database integration for several commercial and non-commercial database management systems, so writing a database-enabled webpage with PHP is fairly simple. The most common use of PHP coding is probably as a replacement for CGI scripts.
Tags: builder, php, php72, php-72
* A source build using source code from https://github.com/AlexonOliveiraRH/openshift-php-upload-demo.git will be created
* The resulting image will be pushed to image stream tag "file-uploader:latest"
* Use 'oc start-build' to trigger a new build
--> Creating resources ...
imagestream.image.openshift.io "file-uploader" created
buildconfig.build.openshift.io "file-uploader" created
deployment.apps "file-uploader" created
service "file-uploader" created
--> Success
Build scheduled, use 'oc logs -f buildconfig/file-uploader' to track its progress.
Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
'oc expose service/file-uploader'
Run' oc status' to view your app.
[alexon@bastion ~]$ oc expose svc/file-uploader -n ocs-file-app
route.route.openshift.io/file-uploader exposed
[alexon@bastion ~]$ oc scale --replicas=3 deploy/file-uploader -n ocs-file-app
deployment.apps/file-uploader scaled
[alexon@bastion ~]$ oc get pods -n ocs-file-app
NAME READY STATUS
RESTARTS AGE
file-uploader-1-build 0/1 Completed
0 79s
file-uploader-764468fb46-6vlxg 1/1
Running 0 11s
file-uploader-764468fb46-cr4mc 1/1
Running 0 7s
file-uploader-764468fb46-vtsq5 1/1
Running 0 15s
Aplikasi baru ini menggunakan ocs-storagecluster-cephfs SC:
[alexon@bastion ~]$ oc set volume deploy/file-uploader --add --name=ocs-file-app \
> -t pvc --claim-mode=ReadWriteMany --claim-size=1Gi \
> --claim-name=ocs-file-app --claim-class=ocs-storagecluster-cephfs \
> --mount-path=/opt/app-root/src/uploaded \
> -n ocs-file-app
deployment.apps/file-uploader volume updated
NAME READY STATUS
RESTARTS AGE
file-uploader-1-build 0/1 Completed
0 2m7s
file-uploader-69b547dfd6-gvhfk 1/1
Running 0 33s
file-uploader-69b547dfd6-nzhl8 1/1
Running 0 26s
file-uploader-69b547dfd6-qbj28 1/1
Running 0 15s
[alexon@bastion ~]$ oc get pvc
NAME
STATUS VOLUME
CAPACITY ACCESS MODES STORAGECLASS AGE
ocs-file-app
Bound
pvc-73c1bda0-2256-407d-885d-e5bcfd221b27 1Gi
RWX
ocs-storagecluster-cephfs 44m
Sebagai pengujian sederhana, buat file bernama testfile.txt
dengan "Halo dunia!" konten dan unggah ke aplikasi Anda melalui UI aplikasi:
[alexon@bastion ~]$ oc get route file-uploader -n ocs-file-app -o jsonpath --template="http://{.spec.host}{'\n'}"
http://file-uploader-ocs-file-app.apps.example.com
[alolivei@alolivei ~]$ echo 'Hello world!' >> testfile.txt
[alolivei@alolivei ~]$ cat testfile.txt
Hello world!
Unggah file:
Dan inilah hasilnya:
Untuk memetakan objek file, prosedurnya sedikit berbeda dari objek blok. Itu karena CephFS menggunakan alamat inode file yang dikonversi ke heksadesimal untuk menamainya di dalam kumpulan file. Oleh karena itu, perlu untuk menemukan objek menggunakan salah satu pod aplikasi di direktori yang dipasang di dalam pod oleh CephFS, mencari tahu inode-nya, dan kemudian mengubah nomor inode menjadi heksadesimal, seperti pada contoh di bawah ini:
[alexon@bastion ~]$ oc get pods
NAME READY STATUS RESTARTS
AGE
file-uploader-1-build 0/1 Completed
0 8m32s
file-uploader-69b547dfd6-gvhfk 1/1
Running 0 6m58s
file-uploader-69b547dfd6-nzhl8 1/1
Running 0 6m51s
file-uploader-69b547dfd6-qbj28 1/1
Running 0 6m40s
[alexon@bastion ~]$ oc rsh file-uploader-69b547dfd6-gvhfk
sh-4.4$ mount | grep csi-vol
172.30.38.159:6789,172.30.136.12:6789,172.30.73.120:6789:/volumes/csi/csi-vol-8a803889-bcce-11eb-8d22-0a580a81023e/3910620a-e68c-424b-8982-8f2b21c26a8a on /opt/app-root/src/uploaded type ceph (rw,relatime,seclabel,name=csi-cephfs-node,secret=<hidden>,acl,mds_namespace=ocs-storagecluster-cephfilesystem)
sh-4.4$ ls /opt/app-root/src/uploaded
testfile.txt
sh-4.4$ stat -c %i /opt/app-root/src/uploaded/testfile.txt | xargs printf '%x\n'
1000000001a
Sekarang setelah Anda memiliki informasi ini, ikuti langkah yang sama seperti sebelumnya, dengan beberapa perbedaan kecil, untuk menemukan objek di dalam ocs-storagecluster-cephfilesystem-data0 pool dan juga node yang terhubung dengannya, sebagai berikut:
sh-4.4$ ceph df
RAW STORAGE:
CLASS SIZE
AVAIL USED RAW USED %RAW USED
ssd 1.5 TiB 1.2 TiB
253 GiB 256 GiB 16.68
TOTAL 1.5 TiB
1.2 TiB 253 GiB 256 GiB 16.68
POOLS:
POOL
ID STORED OBJECTS USED
%USED MAX AVAIL
ocs-storagecluster-cephblockpool 1 84 GiB 22.45k
253 GiB 19.43 350 GiB
ocs-storagecluster-cephfilesystem-metadata 2
1.5 MiB 26 4.5 MiB 0
350 GiB
ocs-storagecluster-cephfilesystem-data0 3
171 B 2 24 KiB 0
350 GiB
sh-4.4$ rados -p ocs-storagecluster-cephfilesystem-data0 ls | grep 1000000001a
1000000001a.00000000
sh-4.4$ rados -p ocs-storagecluster-cephfilesystem-data0 stat2 1000000001a.00000000
ocs-storagecluster-cephfilesystem-data0/1000000001a.00000000 mtime 2021-05-24T20:33:51.179464+0000, size 13
Sepertinya Anda menemukan objek Anda. Cara sederhana dan cepat untuk memvalidasi ini adalah dengan mengekspornya dari dalam kumpulan dan memeriksa isinya:
sh-4.4$ rados -p ocs-storagecluster-cephfilesystem-data0 get 1000000001a.00000000
/tmp/output.txt
sh-4.4$ cat /tmp/output.txt
Hello world!
Sekarang selesaikan proses dan petakan di simpul mana file itu berada:
sh-4.4$ ceph osd map ocs-storagecluster-cephfilesystem-data0 1000000001a.00000000
osdmap e405 pool 'ocs-storagecluster-cephfilesystem-data0' (3) object '1000000001a.00000000' -> pg 3.a8154e0 (3.0) -> up ([2,1,0], p2) acting ([2,1,0], p2)
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 | 85.4G | 426G | 86 | 1221k
| 0 |
0 | exists,up |
| 1 | ip-10-0-143-192.ec2.internal | 85.4G |
426G | 78 | 1678k |
0 | 0
| exists,up |
| 2 | ip-10-0-154-20.ec2.internal | 85.4G | 426G | 67 | 643k
| 2 |
106 | exists,up |
+----+------------------------------+-------+-------+--------+---------+--------+---------+-----------+
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
Sekali lagi, Anda mengetahui bahwa objek berada dalam PG dengan OSD ID 2 sebagai utamanya, dengan replikanya di OSD ID 1 dan 0, bahwa OSD ini menggunakan host perangkat ocs-deviceset-gp2-csi-2- data-0n9lkb di host ip-10-0-154-20.ec2.internal . Jika Anda ingin memastikan bahwa ini adalah simpul yang benar, periksa perangkat dengan lsblk
atau dmsetup
:
[alexon@bastion ~]$ oc debug node/ip-10-0-154-20.ec2.internal
Starting pod/ip-10-0-154-20ec2internal-debug ...
To use host binaries, run `chroot /host`
Pod IP: 10.0.154.20
If you don't see a command prompt, try pressing enter.
sh-4.4# lsblk | grep ocs-deviceset-gp2-csi-2-data-0n9lkb
`-ocs-deviceset-gp2-csi-2-data-0n9lkb-block-dmcrypt 253:0 0 512G
0 crypt
sh-4.4# dmsetup ls | grep ocs-deviceset-gp2-csi-2-data-0n9lkb
ocs-deviceset-gp2-csi-2-data-0n9lkb-block-dmcrypt (253:0)
Menggunakan nama PV yang digunakan oleh PVC dari aplikasi yang Anda lihat sebelumnya, grep
dan lihat di mana jalur yang tersedia untuk aplikasi dipasang:
sh-4.4# mount | grep pvc-73c1bda0-2256-407d-885d-e5bcfd221b27
172.30.38.159:6789,172.30.136.12:6789,172.30.73.120:6789:/volumes/csi/csi-vol-8a803889-bcce-11eb-8d22-0a580a81023e/3910620a-e68c-424b-8982-8f2b21c26a8a on /host/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-73c1bda0-2256-407d-885d-e5bcfd221b27/globalmount type ceph (rw,relatime,seclabel,name=csi-cephfs-node,secret=<hidden>,acl,mds_namespace=ocs-storagecluster-cephfilesystem)
172.30.38.159:6789,172.30.136.12:6789,172.30.73.120:6789:/volumes/csi/csi-vol-8a803889-bcce-11eb-8d22-0a580a81023e/3910620a-e68c-424b-8982-8f2b21c26a8a on /host/var/lib/kubelet/pods/ac40b1fa-a08d-46b5-8bb6-dc55a5638e9e/volumes/kubernetes.io~csi/pvc-73c1bda0-2256-407d-885d-e5bcfd221b27/mount type ceph (rw,relatime,seclabel,name=csi-cephfs-node,secret=<hidden>,acl,mds_namespace=ocs-storagecluster-cephfilesystem)
Terakhir, lihat isi direktori, dan Anda akan menemukan objek Anda di dalamnya, siap untuk divisualisasikan:
sh-4.4# ls /host/var/lib/kubelet/pods/ac40b1fa-a08d-46b5-8bb6-dc55a5638e9e/volumes/kubernetes.io~csi/pvc-73c1bda0-2256-407d-885d-e5bcfd221b27/mount
testfile.txt
sh-4.4# cat /host/var/lib/kubelet/pods/ac40b1fa-a08d-46b5-8bb6-dc55a5638e9e/volumes/kubernetes.io~csi/pvc-73c1bda0-2256-407d-885d-e5bcfd221b27/mount/estfile.txt
Hello world!
sh-4.4# ls /host/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-73c1bda0-2256-407d-885d-e5bcfd221b27/globalmount
testfile.txt
sh-4.4# cat /host/var/lib/kubelet/plugins/kubernetes.io/csi/pv/pvc-73c1bda0-2256-407d-885d-e5bcfd221b27/globalmount/testfile.txt
Hello world!
Anda sekarang tahu cara menemukan dan memetakan informasi objek file di cluster, seperti yang Anda lihat di artikel dua dengan informasi blok.
[ Dapatkan buku gratis ini dari Red Hat dan O'Reilly - Operator Kubernetes:Mengotomatiskan Platform Orkestrasi Kontainer. ]
Menutup
Pendekatan ODF untuk penyimpanan terdistribusi dan terukur sangat berbeda dari solusi penyimpanan lainnya. Mungkin sulit untuk memahami di mana objek aplikasi disimpan dalam cluster, yang menghadirkan tantangan saat memecahkan masalah (dan mendesain).
Seri artikel ini adalah demonstrasi dasar tentang cara kerja pemetaan objek aplikasi ODF. Di bagian pertama, Anda menetapkan lingkungan dan utilitas yang diperlukan. Bagian dua meliputi penyimpanan blok sementara bagian ketiga memeriksa struktur penyimpanan file. Sekarang setelah Anda tahu cara melakukannya, manfaatkan dengan baik.