arrow_back

StatefulSet を使用して Kubernetes で MongoDB データベースを実行する

参加 ログイン
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

StatefulSet を使用して Kubernetes で MongoDB データベースを実行する

Lab 1時間 universal_currency_alt クレジット: 5 show_chart 中級
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

このラボは Google のパートナーである MongoDB と共同開発されました。アカウント プロフィールでプロダクトの最新情報、お知らせ、オファーの受け取りを有効にすると、お客様の個人情報が本ラボのスポンサーである MongoDB と共有される場合があります。

GSP022

Google Cloud セルフペース ラボ

概要

Kubernetes は、コンテナ化されたアプリケーションの複雑な実行に対処するためのオープンソースのコンテナ オーケストレーション ツールです。Kubernetes アプリケーションは、さまざまなカスタマイズやインテグレーションを提供する Google Cloud コンピューティング サービスである Kubernetes Engine を使用して実行できます。このラボでは、StatefulSet を使用した MongoDB データベースの設定方法を学び、Kubernetes の実践的な経験を積むことができます。ステートレス サービス(コンテナ)上でステートフル アプリケーション(データベース)を実行することは一見矛盾しているようですが、このラボで実践演習を行うと、そうでないことがすぐにわかります。具体的には、いくつかのオープンソース ツールを使用して、Kubernetes とステートレス サービスがどのように密接に結びついているかを説明します。

ラボの内容

このラボでは、次のことを学びます。

  • Kubernetes クラスタ、ヘッドレス サービス、StatefulSet をデプロイする。
  • Kubernetes クラスタを MongoDB レプリカセットに接続する。
  • MongoDB レプリカセットのインスタンスをスケールアップ、またはスケールダウンする。
  • 環境をクリーンアップし、上記のサービスをシャットダウンする。

要件

このラボは上級者向けです。Kubernetes やコンテナ化されたアプリケーションについて知識があること、また Google Cloud Shell、Google Cloud SDK、MongoDB の使用経験があることが推奨されます。これらのサービスを短期間で習得するには、以下のラボをご確認ください。

準備ができたら、下にスクロールしてラボ環境を設定します。

設定

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。
  • ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、このラボでは使用しないでください。アカウントへの追加料金が発生する可能性があります。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。

  4. [ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。

    重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  5. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後このタブで Cloud Console が開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 ナビゲーション メニュー アイコン

Cloud Shell をアクティブにする

Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン 「Cloud Shell をアクティブにする」アイコン をクリックします。

接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  1. (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
  1. [承認] をクリックします。

  2. 出力は次のようになります。

出力:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project = <project_ID>

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: Google Cloud における gcloud ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。

タスク 1. コンピューティング ゾーンを設定する

このラボでは、gcloud コマンドライン ツールを使用してサービスをプロビジョニングします。

  • クラスタ内の仮想マシンがすべて同じリージョンに作成されるように、Kubernetes クラスタを作成する前にコンピューティング ゾーンを設定することが必要になります。ここでは、Cloud Shell で gcloud config set コマンドを実行して、ゾーンを次のように に設定します。
gcloud config set compute/zone {{{project_0.default_zone | ZONE}}} 注: リージョンとゾーンの詳細については、リージョンとゾーンのガイドをご覧ください。

タスク 2. 新しいクラスタを作成する

ゾーンが設定されたので、コンテナの新しいクラスタを作成します。

  • 次のコマンドを実行して、hello-world という名前のクラスタをインスタンス化します。
gcloud container clusters create hello-world --num-nodes=2

このコマンドによって、2 つのノード、つまり仮想マシンが含まれる新しいクラスタが作成されます。ノードの数、デフォルトの権限、その他の変数を変更するには、追加のフラグを付けてこのコマンドを構成します。詳細については、gcloud container clusters create のリファレンスをご覧ください。

クラスタの起動には数分かかる場合があります。起動すると次のような出力が表示されます。

NAME Location MATER_VERSION MASTER_IP ... hello-world {{{project_0.default_zone | ZONE}}} 1.9.7-gke.3 35.184.131.251 ...

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。

新しいクラスタを作成する

タスク 3. 設定

これでクラスタが起動して実行されたので、MongoDB と統合します。データの高可用性と冗長性を確保するためにレプリカセットを使用しますが、これは本番環境のアプリケーションを実行する際には必須です。

設定するには、以下の操作を行う必要があります。

  1. 次のコマンドを実行して、GitHub リポジトリから MongoDB と Kubernetes のレプリカセットのクローンを作成します。
gsutil -m cp -r gs://spls/gsp022/mongo-k8s-sidecar .
  1. クローンが作成されたら、次のコマンドで StatefulSet ディレクトリに移動します。
cd ./mongo-k8s-sidecar/example/StatefulSet/

ファイルをダウンロードし、上記のディレクトリに移動したことを確認したら、Kubernetes の StorageClass を作成します。

StorageClass を作成する

StorageClass で、データベース ノードにどの kind のストレージを使用するかを Kubernetes に対して示します。Google Cloud では、SSD とハードディスクの 2 種類のストレージから選択できます。

StatefulSet ディレクトリ内を(ls コマンドを実行して)検索すると、Azure と Google Cloud のそれぞれに SSD と HDD の構成ファイルがあるのがわかります。

  1. 次のコマンドを実行して、googlecloud_ssd.yaml ファイルを確認します。
cat googlecloud_ssd.yaml

出力:

kind: StorageClass apiVersion: storage.k8s.io/v1beta1 metadata: name: fast provisioner: kubernetes.io/gce-pd parameters: type: pd-ssd

この構成によって、SSD Volume に基づく「fast」という新しい StorageClass が作成されます。

  1. 次のコマンドを実行してこの StorageClass をデプロイします。
kubectl apply -f googlecloud_ssd.yaml

StorageClass が構成されたので、StatefulSet は自動的に作成される Volume をリクエストできるようになりました。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。

StorageClass を作成する

タスク 4. Headless Service と StatefulSet をデプロイする

ファイルを見つけて内容を調べる

  1. Headless Service と StatefulSet の操作に進む前に、この両方が格納されている構成ファイル(mongo-statefulset.yaml)を開きます。
nano mongo-statefulset.yaml

出力は以下のようになります(Headless Service や StatefulSet のコンテンツへのポインタはありません)。

apiVersion: v1 <----------- Headless Service configuration kind: Service metadata: name: mongo labels: name: mongo spec: ports: - port: 27017 targetPort: 27017 clusterIP: None selector: role: mongo --- apiVersion: apps/v1 <------- StatefulSet configuration kind: StatefulSet metadata: name: mongo spec: serviceName: "mongo" replicas: 3 selector: matchLabels: role: mongo template: metadata: labels: role: mongo environment: test spec: terminationGracePeriodSeconds: 10 containers: - name: mongo image: mongo command: - mongod - "--replSet" - rs0 - "--smallfiles" - "--noprealloc" ports: - containerPort: 27017 volumeMounts: - name: mongo-persistent-storage mountPath: /data/db - name: mongo-sidecar image: cvallance/mongo-k8s-sidecar env: - name: MONGO_SIDECAR_POD_LABELS value: "role=mongo,environment=test" volumeClaimTemplates: - metadata: name: mongo-persistent-storage annotations: volume.beta.kubernetes.io/storage-class: "fast" spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 50Gi
  1. ファイルから次のフラグを削除します(49、50 行目)。
- "--smallfiles" - "--noprealloc"
  1. このセクションが次のようになっていることを確認します。
containers: - name: mongo image: mongo command: - mongod - "--replSet" - rs0 ports: - containerPort: 27017 volumeMounts: - name: mongo-persistent-storage mountPath: /data/db
  1. Ctrl+X > Y > Enter キーを押して nano テキスト エディタを終了します。

Headless Service: 概要

mongo-statefulset.yaml の最初のセクションは、headless service を示しています。Kubernetes では、サービスは特定のポッドにアクセスするためのポリシーやルールを記述します。つまり、ヘッドレス サービスとは負荷分散を規定しないサービスのことです。StatefulSet と組み合わせると、ポッドにアクセスするための個別の DNS が提供されるため、すべての MongoDB ノードに個別に接続できます。yaml ファイルでサービスがヘッドレスであるかどうかは、clusterIP フィールドが None に設定されていることで確認できます。

StatefulSet: 概要

mongo-statefulset.yaml の 2 番目のセクションは、StatefulSet の構成を示しています。これはアプリケーションに不可欠なもので、MongoDB を実行するワークロードであり、Kubernetes リソースをオーケストレートします。yaml ファイルを参照すると、StatefulSet の最初のセクションで StatefulSet オブジェクトについて記述しているのがわかります。次に、metadata セクションでラベルとレプリカの数を指定します。

今度は、terminationGracePeriodSeconds によって、レプリカの数をスケールダウンしたときに Pod を正常にシャットダウンさせます。次に、2 つのコンテナの構成を示します。最初の構成で、レプリカセット名を構成するコマンドライン フラグ付きの MongoDB を実行します。また、MongoDB がデータを保存する場所である /data/db に永続ストレージ ボリュームをマウントします。2 番目のコンテナはサイドカーを実行します。このサイドカー コンテナによって MongoDB レプリカセットが自動的に構成されます。前述のように、「サイドカー」はメインコンテナによるジョブとタスクの実行をサポートするヘルパー コンテナです。

最後に、volumeClaimTemplates を記述しています。これは、ボリュームをプロビジョニングするために事前に作成した StorageClass への指示内容です。MongoDB レプリカごとに 100 GB のディスクをプロビジョニングします。

Headless Service と StatefulSet をデプロイする

Headless Service と StatefulSet の基礎について理解できたところで、今度はこれらをデプロイしてみましょう。

  • この 2 つは mongo-statefulset.yaml にパッケージされているので、次のコマンドを実行すると両方を実行できます。
kubectl apply -f mongo-statefulset.yaml

次の出力が表示されます。

service/mongo created statefulset.apps/mongo created

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。

Headless Service と StatefulSet をデプロイする

タスク 5. MongoDB レプリカセットに接続する

これで、クラスタが稼働してレプリカセットがデプロイされたので、次に接続を行います。

MongoDB レプリカセットが完全にデプロイされるまで待つ

Kubernetes StatefulSet は Pod を順次デプロイします。つまり、MongoDB レプリカセットのメンバーが完全に起動し、バックアップ ディスクが作成されてから、次のメンバーが起動されます。

  • 次のコマンドを実行して、3 つのメンバーすべてが起動していることを確認します。
kubectl get statefulset

出力 - 3 つのメンバーすべてが起動:

NAME READY AGE mongo 3/3 103s

MongoDB レプリカセットを開始して表示する

この時点で、クラスタに 3 つの Pod が作成されています。これらは MongoDB レプリカセットの 3 つのノードに対応しています。

  1. 次のコマンドで表示されます。
kubectl get pods

出力:

NAME READY STATUS RESTARTS AGE mongo-0 2/2 Running 0 3m mongo-1 2/2 Running 0 3m mongo-2 2/2 Running 0 3m
  1. 3 つのメンバーがすべて作成されるまで待ってから先に進みます。

  2. 最初のレプリカセット メンバーに接続します。

kubectl exec -ti mongo-0 -- mongosh

これで、REPL 環境が MongoDB に接続されました。

  1. 次に rs.initiate() コマンドを実行して、デフォルト構成でレプリカセットをインスタンス化します。
rs.initiate()
  1. レプリカセットの構成を出力するために、rs.conf コマンドを実行します。
rs.conf()

これにより、レプリカセット rs0 の現在のメンバーの詳細が出力されます。このラボで表示されるメンバーは 1 つだけです。すべてのメンバーの詳細を表示するには、nodeporロードバランサなどの追加 Service を使用してレプリカセットを公開する必要があります。

rs0:OTHER> rs.conf() { "_id" : "rs0", "version" : 1, "protocolVersion" : NumberLong(1), "writeConcernMajorityJournalDefault" : true, "members" : [ { "_id" : 0, "host" : "localhost:27017", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "catchUpTakeoverDelayMillis" : 30000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("5c526b6501fa2d29fc65c48c") } }
  1. 「exit」と入力して Enter キーを押すと、REPL が終了します。

タスク 6. MongoDB レプリカセットをスケールする

Kubernetes と StatefulSet の大きな利点は、1 つのコマンドで MongoDB レプリカの数を増減できることです。

  1. レプリカセット メンバーの数を 3 から 5 にスケールアップするには、次のコマンドを実行します。
kubectl scale --replicas=5 statefulset mongo

数分で、MongoDB Pod が 5 つになります。

  1. Pod を表示するには、次のコマンドを実行します。
kubectl get pods

出力は次のようになります。

NAME READY STATUS RESTARTS AGE mongo-0 2/2 Running 0 41m mongo-1 2/2 Running 0 39m mongo-2 2/2 Running 0 37m mongo-3 2/2 Running 0 4m mongo-4 2/2 Running 0 2m
  1. レプリカセット メンバーの数を 5 から 3 にスケールダウンするには、次のコマンドを実行します。
kubectl scale --replicas=3 statefulset mongo

数秒で、MongoDB Pod が 3 つに戻ります。

  1. 次のコマンドで表示されます。
kubectl get pods

出力は次のようになります。

NAME READY STATUS RESTARTS AGE mongo-0 2/2 Running 0 41m mongo-1 2/2 Running 0 39m mongo-2 2/2 Running 0 37m

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。

MongoDB レプリカセットをスケールする

タスク 7. MongoDB レプリカセットを使用する

ヘッドレス サービスに基づく StatefulSet の各ポッドには stable DNS 名があります。テンプレートは <pod-name>.<service-name> の形式になります。

つまり MongoDB レプリカセットの DNS 名は次のようになります。

mongo-0.mongo mongo-1.mongo mongo-2.mongo

これらの名前はアプリケーションの接続文字列 URI で直接使用できます。

データベースの使用はこのラボでは取り扱いませんが、この場合、接続文字列 URI は次のようになります。

"mongodb://mongo-0.mongo,mongo-1.mongo,mongo-2.mongo:27017/dbname_?"

タスク 8. クリーンアップ

ラボ環境では、ラボが終了すると、すべてのリソースとプロジェクトは自動的にクリーンアップされて破棄されます。ここでは、実際の環境で作業する際の費用の節約とクラウドでのマナーのために、ご自分でリソースをクリーンアップする方法について説明します。

デプロイされたリソースをクリーンアップするには、次のコマンドを実行して StatefulSet、ヘッドレス サービス、プロビジョニングされたボリュームを削除します。

  1. 次のコマンドで StatefulSet を削除します。
kubectl delete statefulset mongo
  1. 次のコマンドで Service を削除します。
kubectl delete svc mongo
  1. 次のコマンドで Volume を削除します。
kubectl delete pvc -l role=mongo
  1. 最後に、テストクラスタを削除します。
gcloud container clusters delete "hello-world"
  1. Y キー、Enter キーを順に押して、テストクラスタの削除を続行します。

お疲れさまでした

Kubernetes Engine を使用すると、Google Cloud 上で効率的かつ柔軟にコンテナを実行できます。StatefulSet を使用すると、Kubernetes 上のデータベースなどのステートフル ワークロードを実行できます。次のことについて学習しました。

  • Kubernetes StatefulSet を使って MongoDB レプリカセットを作成する
  • MongoDB レプリカセットへ接続する
  • レプリカセットをスケールする

クエストを完了する

このセルフペース ラボは、「Cloud Engineering」クエストの一部です。クエストとは学習プログラムを構成する一連のラボのことで、完了すると成果が認められて上のようなバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。このラボの修了後、このラボが含まれるクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能な全クエストについては、Google Cloud Skills Boost カタログをご覧ください。

次のラボを受講する

次のラボに進んでクエストを続けるか、以下のおすすめをご確認ください。

次のステップと詳細情報

Google Cloud トレーニングと認定資格

Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。

マニュアルの最終更新日: 2023 年 10 月 9 日

ラボの最終テスト日: 2023 年 10 月 9 日

Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。