「Kubernetesに対応した無限スケーラブルストレージ」

「Kubernetes対応でさらに拡張性を高めたストレージソリューション」

データの回復を確認するための破壊的な実験

時には、動作するストレージが必要です。クラウドプロバイダのストレージクラスを利用する贅沢さは常に可能ではありません。すべて自分自身で管理する必要があります。これは、私が保険業のお客様のオンプレミスクライアントに対して解決策を見つけるために立ち向かわなければならなかった課題です。

この記事では、なぜRook Cephをインストールし、Kubernetesクラスタに使いやすいレプリケートされたストレージクラスを提供するかについて学びます。

そして、ファイル共有アプリを展開し、それが展開されているノードを破壊し、何が起こるかを見てみます。Cephは私たちのファイルを再びアクセス可能にするのでしょうか?

Containers to the horizon. Photo by Kelly on Pexels.

ストレージソリューションの選択

ストレージは、ネイティブのKubernetesでは冗長性のある分散ストレージソリューションを提供していないため、常に課題でした。ネイティブのKubernetesでは、永続的ストレージのためにhostPathボリュームしかアタッチできません。

私のクライアントは独自のオンプレミスインフラストラクチャを持っており、サーバのいずれかがダウンした場合でもデータが失われないことを確認したかったのです。ほとんどのアプリはモノリスであり、データのレプリケーションメカニズムがネイティブに組み込まれていません。

したがって、さまざまなストレージソリューションから選ぶ必要がありました。クライアントは超高性能は必要ありませんでしたが、安定したソリューションが必要でした。私はRook Cephを選びました、なぜなら:

  • それはCNCF認定のプロジェクトであり、安定性と品質が保証されています
  • オープンソースであり、素晴らしいドキュメンテーションとコミュニティのサポートがあります
  • 簡単に展開および使用できます
  • 性能は公平です(章「ベンチマーク」:参照

クラスタの準備

各々に最低3つのノードと1つの空のアタッチされたディスクを備えたKubernetesクラスタが必要です。

簡単にKubernetesクラスタをインスタンス化し、フォーマットされていないディスクを割り当てるためにScaleway Kapsuleを使用することをお勧めします。 Kubernetesクラスタが開始されたら、各ノードにアタッチされたボリューム(ディスク)を作成します:

  • 「インスタンス」に移動します
  • ノードを選択します
  • 「アタッチボリューム」タブをクリックします
  • 「+」(ボリュームの作成)をクリックし、新しいディスクを作成します

kubeconfファイルをダウンロードし、 ~/.kube/config に配置します。これでkubectl CLIを使用してクラスタにアクセスできるようになります。

Rook Cephのインストール

1.このブログの投稿には、GitHubの関連リポジトリがありますので、すべてのリソースを持ってくるためにクローンしましょう。

git clone https://github.com/flavienbwk/ceph-kubernetescd ceph-kubernetes

2. Rookリポジトリをクローンし、Rook Cephオペレータをデプロイします

git clone --single-branch --branch release-1.11 https://github.com/rook/rook.git kubectl create -f ./rook/deploy/examples/crds.yaml kubectl create -f ./rook/deploy/examples/common.yaml kubectl create -f ./rook/deploy/examples/operator.yaml

3. Cephクラスタを作成します

kubectl create -f ./rook/deploy/examples/cluster.yaml -n rook-ceph

ディスクの設定をCephが数分間行うため、しばらくお待ちください。HealthはHEALTH_OKになるはずです:

kubectl get cephcluster -n rook-ceph

4. ストレージクラスを作成する

Rook Cephでは、主に2つのストレージクラスを提供します。1つ目はRBDで、ReadWriteOnceモードで複製されたストレージを使用することができます。2つ目にインストールするのはCephFSで、ReadWriteManyモードで複製されたストレージを使用することができます。RBDはRADOSブロックデバイスの略であり、Kubernetesクラスタでボリュームをプロビジョンするためのストレージクラスを提供します。これはReadWriteOnceボリューム(RWO)のみをサポートしています。CephFSは複製されたNFSサーバーのように機能します。これにより、ReadWriteManyモード(RWX)でボリュームを作成することができます。

kubectl create -f ./rook/deploy/examples/csi/rbd/storageclass.yaml -n rook-ceph
kubectl create -f ./rook/deploy/examples/filesystem.yaml -n rook-ceph
kubectl create -f ./rook/deploy/examples/csi/cephfs/storageclass.yaml -n rook-ceph

5. Cephダッシュボードを展開する

kubectl create -f ./rook/deploy/examples/dashboard-external-https.yaml -n rook-ceph

ダッシュボードのHTTPアクセスを転送する:

kubectl port-forward service/rook-ceph-mgr-dashboard -n rook-ceph 8443:8443

ユーザー名adminを使用して以下のパスワードで接続してください:

kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}"

次のページが表示されるはずです:https://localhost:8443

Image by author: Ceph dashboard

アプリケーションの展開

ボリュームが正しくバインドされているかを確認するために、セルフホスト型のファイル共有アプリケーション(psitransfer)を展開します。

1. ファイル共有アプリケーションを展開します(NodePort 30080)

kubectl create -f ./psitransfer-deployment-rwx.yaml

2. どのノードに展開されているかを確認します

kubectl get pods -o wide -l app=psitransfer

このノードのIPアドレスを取得し(Scalewayのインターフェースを介して)、アプリがhttp://nodeip:30080で実行されているか確認します。

3. いくつかのファイルをアップロードしましょう

5MB10MB、および20MBのファイルをxcal1.vodafone.co.ukのウェブサイトからダウンロードします。

それらをファイル転送アプリにアップロードします。画面に表示されるリンクをクリックしてください。

今、インポートされた3つのファイルが表示されるはずです。それをクリックし、リンクをブラウザのタブに保持しておいてください。後で使用するためです。

およそ400MBのファイルをアップロードした後、データのレプリケーションがディスク間で一致していることがわかります。ファイルをアップロードする間、3つのディスクに同時に書き込まれていることが見えます。以下のスクリーンショットでは、各ディスクの使用量が1%です。同じホストにアップロードしたにもかかわらず、レプリケーションは期待どおりに動作し、データが3つのディスク(OSD)に均等に保持されているようです。ディスク2には「読み取り」アクティビティがたくさんあり、2つの他のディスクがデータを同期しているようです。

Cephのダッシュボードは、現在このように表示されるはずです:

C. 破壊して確認する

Webアプリをホストしているノードを停止します。他のノードにデータがレプリケートされたことを確認します。

  1. アプリがデプロイされているノードを確認する
kubectl get pods -o wide -l app=psitransfer

2. Scalewayコンソールからノードの電源を切る

これにより、ノード上で電源障害が発生したことをシミュレートします。数分後にNotReadyになるはずです:

$> kubectl get nodeNAME                                             STATUS     ROLES    AGE    VERSIONscw-ceph-test-clustr-default-5f02f221c3814b47a   Ready      <none>   3d1h   v1.26.2scw-ceph-test-clustr-default-8929ba466e404a00a   Ready      <none>   3d1h   v1.26.2scw-ceph-test-clustr-default-94ef39ea5b1f4b3e8   NotReady   <none>   3d1h   v1.26.2

そして、ノード3はCephのダッシュボード上では利用できません:

Cephのダッシュボードは今、次のようになるはずです:

3. ポッドを再スケジュールする

スケジュールされたポッドのノードは利用できません。しかし、ポッドはまだアクティブであると考えています:

$> kubectl get pods -o wide -l app=psitransferNAME                                      READY   STATUS    RESTARTS   AGE   IP            NODEpsitransfer-deployment-8448887c9d-mt6wm   1/1     Running   0          19h   100.64.1.19   scw-ceph-test-clustr-default-94ef39ea5b1f4b3e8

別のノードに再スケジュールするためにそれを削除してください:

kubectl delete pod psitransfer-deployment-8448887c9d-mt6wm

新たに再起動されたポッドのステータスを確認してください。リンクは以前のままですが、アプリが再び利用可能になるはずです。

ノードが “NotReady” になったときにポッドを手動で削除して再スケジュールする必要がないようにするには、アプリのレプリカ数をデフォルトで少なくとも3にスケーリングしてください。

前に電源を切ったノードを再起動できるようになりました。

rook-ceph-blockまたはrook-cephfsを使用するタイミングは?

アプリケーションがより良いパフォーマンスを必要とし、RWOアクセスモードを持つブロックストレージが必要な場合は、rook-ceph-block(RBD)ストレージクラスを使用します。一方、アプリケーションがRWX(CephFS)アクセスモードとPOSIXの互換性が必要な場合は、rook-cephfsストレージクラスを使用します。

CephFSと同様に、オリジナルのノードがオフラインになった状態でポッドを再スケジュールしようとする場合、PVCから「Volume is already exclusively attached to one node and can’t be attached to another」というエラーが発生します。その場合、PVCがバインドバックするのを待つだけで十分です(クラスターによっては、PVCが自動的にポッドにPVCを再割り当てし、ポッドを開始できるまでに約6分かかりました)。

関連するリポジトリの章に従って、この振る舞いを試してみてください:https://github.com/flavienbwk/ceph-kubernetes#when-to-use-rook-ceph-block-or-rook-cephfs-

最後に

Cephを使用してアプリをインストールして展開する方法を学びました。データが複製されることを証明しました。おめでとうございます ✨

すべての画像は、特に記載されていない限り、著者によるものです。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more