arrow_back

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

ログイン 参加
700 以上のラボとコースにアクセス

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

ラボ 1時間 universal_currency_alt クレジット: 5 show_chart 中級
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

このラボは 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 の使用経験があることが推奨されます。これらのサービスを短期間で習得するには、以下のラボをご確認ください。

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

設定

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

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

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

前提条件

このラボを完了するには、次のものが必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)。
  • ラボを完了するために必要な時間。

注: すでに個人の GCP アカウントやプロジェクトをお持ちの場合でも、そのアカウントやプロジェクトはラボでは使用しないでください。

ラボを開始して Console にログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側のパネルには、このラボで使用する必要がある一時的な認証情報が表示されます。

    Google Console を開く

  2. ユーザー名をコピーし、[Google Console を開く] をクリックします。 ラボでリソースが起動し、別のタブで [アカウントの選択] ページが表示されます。

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

  3. [アカウントの選択] ページで [別のアカウントを使用] をクリックします。

    アカウントを選択

  4. [ログイン] ページが開きます。[接続の詳細] パネルでコピーしたユーザー名を貼り付けます。パスワードもコピーして貼り付けます。

    重要: 認証情報は [接続の詳細] パネルに表示されたものを使用してください。ご自身の Qwiklabs 認証情報は使用しないでください。請求が発生する事態を避けるため、GCP アカウントをお持ちの場合でもそのアカウントはラボで使用しないでください。

  5. 以降のページでは次の点にご注意ください。

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

しばらくすると、このタブで GCP Console が開きます。

Google Cloud Shell の有効化

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

  1. GCP Console の右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

    Cloud Shell アイコン

  2. [続行] をクリックします。

    cloudshell_continue

環境のプロビジョニングと接続には少し時間がかかります。接続すると、すでに認証されており、プロジェクトは PROJECT_ID に設定されています。例えば:

Cloud Shell 端末

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

次のコマンドを使用すると、有効なアカウント名を一覧表示できます。

gcloud auth list

出力:

Credentialed accounts:
- <myaccount>@<mydomain>.com (active)
	

出力例:

Credentialed accounts:
- google1623327_student@qwiklabs.net
	

次のコマンドを使用すると、プロジェクト ID を一覧表示できます。

gcloud config list project
	

出力:

[core]
project = <project_ID>
	

出力例:

[core]
project = qwiklabs-gcp-44776a13dea667a6
	

タスク 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 Training & Certification

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

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

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

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

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。