GNU/Linux >> Linux の 問題 >  >> Linux

ODFでのブロックおよびファイルOCPアプリケーションの内容の検索:ファイルストレージプロジェクトの作成

このシリーズの記事は、RookツールキットとOpenShiftコマンドを使用して、ODFクラスター内でアプリケーションデータをマッピングする方法をよりよく理解するのに役立ちます。この知識と関連ツールは、トラブルシューティングだけでなく、ODFのデータストレージのより深い理解にも非常に役立ちます。これを読む前に、パート1とパート2を読んでください(シリーズのパート3)。

ファイルストレージプロジェクトを作成する

これまでに使用したのと同じ原則に従って、共有ストレージにODFのCephFSを使用するアプリケーションで以前のブロックストレージプロジェクトと同様のことを行います。 ocs-file-appという新しいプロジェクトを作成します :

[alexon@bastion ~]$ oc new-project ocs-file-app
Now using project "ocs-file-app" on server "https://api.example.com:6443".

new-appを使用して、このプロジェクトにアプリケーションを追加できます 指図。たとえば、Rubyで新しいサンプルアプリケーションを作成するには、次のことを試してください。

oc new-app rails-postgresql-example

または、kubectlを使用します 単純なKubernetesアプリケーションをデプロイするには:

kubectl create deployment hello-node --image=k8s.gcr.io/serve_hostname

この例では、OpenShiftPHPファイルアップロードデモを使用します あなたの利益に役立つアプリケーション(Christian Hernandezのプロジェクトからフォークした-クレジットによる):

[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

この新しいアプリケーションは、 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

簡単なテストとして、testfile.txtという名前のファイルを作成します 「Helloworld!」でコンテンツを作成し、アプリケーションのUIからアプリケーションにアップロードします:

[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!

ファイルをアップロードします:

結果は次のとおりです:

ファイルオブジェクトをマップするための手順は、ブロックオブジェクトとは少し異なります。これは、CephFSが16進数に変換されたファイルのiノードアドレスを使用して、ファイルプール内で名前を付けるためです。したがって、以下の例のように、CephFSによってポッド内にマウントされたディレクトリでアプリケーションのポッドの1つを使用してオブジェクトを検索し、そのiノードを見つけてから、iノード番号を16進数に変換する必要があります。

[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

この情報が得られたので、前と同じ手順に従いますが、若干の違いはありますが、 ocs-storagecluster-cephfilesystem-data0内のオブジェクトを見つけます。 次のように、プールとそれにリンクされているノード:

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

オブジェクトを見つけたようです。これを検証する簡単で迅速な方法は、プール内からエクスポートしてその内容を確認することです。

sh-4.4$ rados -p ocs-storagecluster-cephfilesystem-data0 get 1000000001a.00000000 

/tmp/output.txt

sh-4.4$ cat /tmp/output.txt 

Hello world!

プロセスを終了し、ファイルが含まれているノードをマップします。

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 

ここでも、オブジェクトがプライマリとしてOSD ID 2を持ち、レプリカがOSD ID 1と0のPGにあり、このOSDがデバイスホストocs-deviceset-gp2-csi-2-を使用していることがわかります。データ-0n9lkb ホスト上でip-10-0-154-20.ec2.internal 。これが正しいノードであることを確認したい場合は、lsblkでデバイスを確認してください または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)

前に見たアプリケーションのPVCで使用されているPVの名前を使用して、grep アプリケーションで使用可能なパスがマウントされている場所を確認します。

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)

最後に、ディレクトリの内容を確認すると、オブジェクトが内部にあり、視覚化する準備ができています。

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!

これで、ブロック情報を含む記事2で見たように、クラスター内のファイルオブジェクト情報を検索してマップする方法を理解できました。

[Red Hat and O'Reillyからこの無料の本を入手してください-KubernetesOperators:Automating the ContainerOrchestrationPlatform。 ]

まとめ

分散型でスケーラブルなストレージへのODFアプローチは、他のストレージソリューションとは大きく異なります。アプリケーションオブジェクトがクラスター内のどこに格納されているかを理解するのは難しい場合があります。これは、トラブルシューティング(および設計)の際に課題となります。

この一連の記事は、ODFアプリケーションオブジェクトマッピングがどのように機能するかについての基本的なデモンストレーションです。パート1では、環境と必要なユーティリティを確立しました。パート2ではブロックストレージについて説明し、パート3ではファイルストレージ構造について説明しました。これで、その方法がわかったので、それを有効に活用できます。


Linux
  1. ODFでのブロックおよびファイルOCPアプリケーションの内容の検索:インフラストラクチャ

  2. ODFでのブロックおよびファイルOCPアプリケーションの内容の検索:プロジェクトの作成

  3. ファイルのアクセス許可と保存?

  1. リダイレクトとパイプ出力?

  2. RubyOnRailsアプリケーションの作成と実行

  3. アプリケーションと負荷テストのガイドライン

  1. Linux でファイルを tar および untar し、tar ファイルの内容を表示する方法

  2. libpng 警告:アプリケーションとライブラリで互換性のない libpng バージョン

  3. シェル - 変数の内容をファイルに書き込む