クイック スタートを使用して、GKE(Google Kubernetes Engine)と Istio サービス キャッシュを使用して、3 つのKubernetesノード クラスターにMongoDBレプリカセットを配置します。
始める前に:
Kubernetes クラスターのマルチ配置について学ぶ
マルチKubernetesクラスターのサービスとツールのリストを確認する
前提条件を完了する
注意
実際に見て学びたい方に
このビデオ チュートリアルでは、マルチ Kubernetes クラスター MongoDB 配置を作成する方法を紹介します。
所要時間: 12 分
前提条件
クイック スタートを使用してマルチ Kubernetes クラスター MongoDB 配置を作成する前に、次のタスクを完了してください。
一般的な前提条件の確認
続行する前に、一般的な前提条件を満たしていることを確認してください。 詳細については、「一般的な前提条件 」を参照してください。
環境変数と GKE ゾーンを設定する
この例のように、クラスター名と、クラスターを配置する利用可能な GKE ゾーンを含む環境変数を設定します。
export MDB_GKE_PROJECT={GKE project name} export MDB_CENTRAL_CLUSTER_ZONE="us-west1-a" export MDB_CLUSTER_1_ZONE="us-west1-b" export MDB_CLUSTER_2_ZONE="us-east1-b" export MDB_CLUSTER_3_ZONE="us-central1-a" export MDB_CENTRAL_CLUSTER_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CENTRAL_CLUSTER_ZONE}_${MDB_CENTRAL_CLUSTER}" export MDB_CLUSTER_1_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CLUSTER_1_ZONE}_${MDB_CLUSTER_1}" export MDB_CLUSTER_2_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CLUSTER_2_ZONE}_${MDB_CLUSTER_2}" export MDB_CLUSTER_3_FULL_NAME="gke_${MDB_GKE_PROJECT}_${MDB_CLUSTER_3_ZONE}_${MDB_CLUSTER_3}"
GKE クラスターを設定する
GKE(Google Kubernetes Engine)クラスターを設定します。
Google Cloud Platformアカウントを設定します。
まだ行っていない場合は、Google Cloudプロジェクトを作成し 、プロジェクトでの請求を有効にして、アーティファクト レジストリと GKE API を有効にして、Google Cloud ドキュメントの Google Kubernetes Engine クイックスタートの関連手順に従って Cloud Shell を起動します。
中央クラスターとメンバークラスターを作成します。
次の例のように、GKE ゾーン、ノード数、インスタンスタイプを指定して、 1 つの中央クラスターと 1 つ以上の ノード クラスター を作成します。
gcloud container clusters create $MDB_CENTRAL_CLUSTER \ --zone=$MDB_CENTRAL_CLUSTER_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
gcloud container clusters create $MDB_CLUSTER_1 \ --zone=$MDB_CLUSTER_1_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
gcloud container clusters create $MDB_CLUSTER_2 \ --zone=$MDB_CLUSTER_2_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
gcloud container clusters create $MDB_CLUSTER_3 \ --zone=$MDB_CLUSTER_3_ZONE \ --num-nodes=5 \ --machine-type "e2-standard-2"
中央クラスターとノードクラスターのユーザー認証情報の取得
中央およびノードの Kubernetes クラスターのユーザー認証情報を取得し、認証情報を保存します。 後でこれらの認証情報を使用して、これらのクラスターでkubectl
コマンドを実行します。
次のコマンドを実行します。
gcloud container clusters get-credentials $MDB_CENTRAL_CLUSTER \ --zone=$MDB_CENTRAL_CLUSTER_ZONE gcloud container clusters get-credentials $MDB_CLUSTER_1 \ --zone=$MDB_CLUSTER_1_ZONE gcloud container clusters get-credentials $MDB_CLUSTER_2 \ --zone=$MDB_CLUSTER_2_ZONE gcloud container clusters get-credentials $MDB_CLUSTER_3 \ --zone=$MDB_CLUSTER_3_ZONE
MongoDB MultiCluster リソースの配置
TLS証明書を使用して、複数の Kubernetes クラスター MongoDB 配置でレプリカセット接続を暗号化するかどうかに応じて、適切なタブを選択します。
この TLS-Encrypted Connectionsタブでは、次の手順を使用できます。
MongoDBMultiCluster
リソースを配置MongoDBMultiCluster
リソースの TLS 証明書を更新する
これらの手順では、レプリカセット内の MongoDB ホスト間、およびクライアント アプリケーションと MongoDB 配置間で、 TLSで暗号化された接続を確立します。
開始する前に、 TLS暗号化の有効な証明書が必要です。
リソースの TLSMongoDBMultiCluster
証明書のシークレットを作成します。
kubectl
コマンドを実行して、 MongoDBMultiCluster
リソース証明書を保存する新しいシークレットを作成します。
kubectl --context $MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace=<metadata.namespace> \ create secret tls <prefix>-<metadata.name>-cert \ --cert=<resource-tls-cert> \ --key=<resource-tls-key>
注意
シークレットの前に<prefix>-<metadata.name>
を付ける必要があります。
たとえば、配置をmy-deployment
mdb
と呼び出し、プレフィックスを に設定する場合は、クライアント TLS 通信の TLS シークレットにmdb-my-deployment-cert
という名前を付ける必要があります。また、内部クラスター認証用のTLSシークレット(有効になっている場合) mdb-my-deployment-clusterfile
に名前を付ける必要があります。
ConfigMap を作成して、CA をMongoDBMultiCluster
リソースにリンクします。
kubectl
コマンドを実行して、 CAをMongoDBMultiCluster
リソースにリンクします。 MongoDBMultiCluster
リソースに対して常にca-pem
という名前を付ける必要があるCA証明書ファイルを指定します。
kubectl --context $MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace=<metadata.namespace> \ create configmap custom-ca -from-file=ca-pem=<your-custom-ca-file>
kubectl mongodb
プラグインを実行します。
デフォルトでは、Kubernetes 演算子のスコープはmongodb
名前空間に限定されています。 次のコマンドを実行すると、 kubectl mongodb
プラグインは次のようになります。
中央クラスター 1 つ、メンバー クラスター 3 つ、各クラスターに
mongodb
というラベルの付いた名前空間を作成します。すべてのノードクラスターを含むデフォルトの ConfigMap をハードコードされた名前
mongodb-enterprise-operator-member-list
で作成します。 ConfigMap の名前を変更することはできません。
kubectl mongodb
プラグインを実行します。
kubectl mongodb multicluster setup \ --central-cluster="${MDB_CENTRAL_CLUSTER_FULL_NAME}" \ --member-clusters="${MDB_CLUSTER_1_FULL_NAME},${MDB_CLUSTER_2_FULL_NAME},${MDB_CLUSTER_3_FULL_NAME}" \ --member-cluster-namespace="mongodb" \ --central-cluster-namespace="mongodb" \ --create-service-account-secrets \ --install-database-roles=true
オプション: 各ノード クラスターで Istio インジェクション Webhook を設定します。
Istio を使用している場合は、中央クラスターで次のコマンドを実行し、配置内の各メンバー クラスターのコンテキストを指定します。 Istio でサイドカーインジェクションを有効にするには、次のコマンドを使用して、各ノードクラスターのistio-injection=enabled
mongodb
名前空間に ラベルを追加します。別のサービス キャッシュを使用する場合は、作成された名前空間内のネットワーク トラフィックを処理するように構成します。
kubectl label \ --context=$MDB_CLUSTER_1_FULL_NAME \ namespace mongodb \ istio-injection=enabled
kubectl label \ --context=$MDB_CLUSTER_2_FULL_NAME \ namespace mongodb \ istio-injection=enabled
kubectl label \ --context=$MDB_CLUSTER_3_FULL_NAME \ namespace mongodb \ istio-injection=enabled
中央クラスターにMongoDB Enterprise Kubernetes Operatorを配置します。
Helm または kubectl
を使用して、mongodb
名前空間の中央クラスターにMongoDB Enterprise Kubernetes Operatorを配置します。
MongoDB Helm Charts for Kubernetesリポジトリを Helm に追加します。
helm repo add mongodb https://mongodb.github.io/helm-charts Kubernetes用のMongoDB Helm Charts を使用して、 Kubernetes演算子を配置します。
helm upgrade \ --install \ mongodb-enterprise-operator-multi-cluster \ mongodb/enterprise-operator \ --namespace mongodb \ --set namespace=mongodb \ --version <mongodb-kubernetes-operator-version> \ --set operator.name=mongodb-enterprise-operator-multi-cluster \ --set operator.createOperatorServiceAccount=false \ --set operator.createResourcesServiceAccountsAndRoles=false \ --set "multiCluster.clusters={$MDB_CLUSTER_1_FULL_NAME,$MDB_CLUSTER_2_FULL_NAME,$MDB_CLUSTER_3_FULL_NAME}" \ --set multiCluster.performFailover=false
Kubernetes Operator カスタム リソースを適用します。
kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-enterprise-kubernetes/master/crds.yaml Kubernetes Operator YAML テンプレートをダウンロードします。
curl https://raw.githubusercontent.com/mongodb/mongodb-enterprise-kubernetes/master/mongodb-enterprise-multi-cluster.yaml -o operator.yaml オプション: Kubernetes Operator YAML テンプレートをカスタマイズします。
Kubernetes Operator のインストール設定の詳細については、 「 MongoDB Enterprise Kubernetes Operator kubernetes Operator kubernetes Operator および oc インストール設定 」を参照してください。
Kubernetes Operator YAML ファイルを適用します。
kubectl apply -f operator.yaml Kubernetes Operator が配置されていることを確認します。
Kubernetes Operator が正しくインストールされたことを確認するには、次のコマンドを実行し、出力を確認します。
kubectl describe deployments mongodb-enterprise-operator -n <metadata.namespace> oc describe deployments mongodb-enterprise-operator -n <metadata.namespace> デフォルトでは、配置は
mongodb
名前空間に存在します。 次のエラー メッセージが表示される場合は、正しい名前空間を使用していることを確認してください。Error from server (NotFound): deployments.apps "mongodb-enterprise-operator" not found Kubernetes Operator のトラブルシューティングについては、「 Kubernetes Operator からのログの確認 」やその他のトラブルシューティング トピックを参照してください。
重要
Kubernetes Operator または名前空間を削除する必要がある場合は、まずMongoDB リソースを削除する必要があります。
MongoDB Ops Managerで使用するシークレットを作成し、ConfigMap を作成します。
シークレットを作成すると、 Kubernetes Operator がMongoDB Ops Managerプロジェクト内のオブジェクトを作成および更新できるようになります。 詳細については、「 Kubernetes Operator の認証情報の作成 」を参照してください。
ConfigMap を作成して、 Kubernetes Operator をMongoDB Ops Managerプロジェクトにリンクします。 詳しくは、「 ConfigMap を使用してプロジェクトを 1 つ作成する 」を参照してください。
MongoDBMultiCluster
リソースます。
spec.credentials
spec.opsManager.configMapRef.name
、 、およびセキュリティ設定を設定し、 MongoDBMultiCluster
duplicateServiceObjects
true
リソースを配置します。次のコードサンプルでは、Istio で DNS プロキシを有効にするために が に設定されています。
注意
Istio サービス メトリクスによるクラスター間での DNS 解決を有効にするために、このチュートリアルでは Kubernetes ポッドごとに 1 つの ClusterIP アドレスを持つサービス オブジェクトを作成します。
kubectl apply -f - <<EOF apiVersion: mongodb.com/v1 kind: MongoDBMultiCluster metadata: name: multi-replica-set spec: version: 6.0.0-ent type: ReplicaSet persistent: false duplicateServiceObjects: true credentials: my-credentials opsManager: configMapRef: name: my-project security: certsSecretPrefix: <prefix> tls: ca: custom-ca clusterSpecList: - clusterName: ${MDB_CLUSTER_1_FULL_NAME} members: 3 - clusterName: ${MDB_CLUSTER_2_FULL_NAME} members: 2 - clusterName: ${MDB_CLUSTER_3_FULL_NAME} members: 3 EOF
Kubernetes Operator は、前の手順で作成したCAを含む ConfigMap を各ノード クラスターにコピーし、連結されたPEMシークレットを生成し、それをノード クラスターに配布します。
MongoDBMultiCluster
リソースがを実行中していることを確認します。
ノードクラスターの場合は、次のコマンドを実行して、MongoDB ポッドが実行状態であることを確認します。
kubectl get pods \ --context=$MDB_CLUSTER_1_FULL_NAME \ --namespace mongodb kubectl get pods \ --context=$MDB_CLUSTER_2_FULL_NAME \ --namespace mongodb kubectl get pods \ --context=$MDB_CLUSTER_3_FULL_NAME \ --namespace mongodb 中央クラスターで次のコマンドを実行し、
MongoDBMultiCluster
リソースが実行状態であることを確認します。kubectl --context=$MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace mongodb \ get mdbmc multi-replica-set -o yaml -w
MongoDB MultiCluster リソースの TLS 証明書の更新
次の手順で、 TLS証明書を定期的に更新します。
MongoDBMultiCluster
リソースのシークレットを更新します。
次のkubectl
コマンドを実行して、MongoDBMultiCluster
リソースの証明書を保存する既存のシークレットを更新します。
kubectl --context $MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace=<metadata.namespace> \ create secret tls <prefix>-<metadata.name>-cert \ --cert=<resource-tls-cert> \ --key=<resource-tls-key> \ --dry-run=client \ -o yaml | kubectl apply -f -
この手順では、レプリカセット内の MongoDB ホスト間、およびクライアント・アプリケーションと MongoDB 配置間の接続は暗号化されません。
kubectl mongodb
プラグインを実行します。
デフォルトでは、Kubernetes 演算子のスコープはmongodb
名前空間に限定されています。 次のコマンドを実行すると、 kubectl mongodb
プラグインは次のようになります。
中央クラスター 1 つ、メンバー クラスター 3 つ、各クラスターに
mongodb
というラベルの付いた名前空間を作成します。すべてのノードクラスターを含むデフォルトの ConfigMap をハードコードされた名前
mongodb-enterprise-operator-member-list
で作成します。 ConfigMap の名前を変更することはできません。
kubectl mongodb
プラグインを実行します。
kubectl mongodb multicluster setup \ --central-cluster="${MDB_CENTRAL_CLUSTER_FULL_NAME}" \ --member-clusters="${MDB_CLUSTER_1_FULL_NAME},${MDB_CLUSTER_2_FULL_NAME},${MDB_CLUSTER_3_FULL_NAME}" \ --member-cluster-namespace="mongodb" \ --central-cluster-namespace="mongodb" \ --create-service-account-secrets \ --install-database-roles=true
オプション: 各ノード クラスターで Istio インジェクション Webhook を設定します。
Istio を使用している場合は、中央クラスターで次のコマンドを実行し、配置内の各メンバー クラスターのコンテキストを指定します。 Istio でサイドカーインジェクションを有効にするには、次のコマンドを使用して、各ノードクラスターのistio-injection=enabled
mongodb
名前空間に ラベルを追加します。別のサービス キャッシュを使用する場合は、作成された名前空間内のネットワーク トラフィックを処理するように構成します。
kubectl label \ --context=$MDB_CLUSTER_1_FULL_NAME \ namespace mongodb \ istio-injection=enabled
kubectl label \ --context=$MDB_CLUSTER_2_FULL_NAME \ namespace mongodb \ istio-injection=enabled
kubectl label \ --context=$MDB_CLUSTER_3_FULL_NAME \ namespace mongodb \ istio-injection=enabled
中央クラスターにMongoDB Enterprise Kubernetes Operatorを配置します。
Helm または kubectl
を使用して、mongodb
名前空間の中央クラスターにMongoDB Enterprise Kubernetes Operatorを配置します。
MongoDB Helm Charts for Kubernetesリポジトリを Helm に追加します。
helm repo add mongodb https://mongodb.github.io/helm-charts Kubernetes用のMongoDB Helm Charts を使用して、 Kubernetes演算子を配置します。
helm upgrade \ --install \ mongodb-enterprise-operator-multi-cluster \ mongodb/enterprise-operator \ --namespace mongodb \ --set namespace=mongodb \ --version <mongodb-kubernetes-operator-version> \ --set operator.name=mongodb-enterprise-operator-multi-cluster \ --set operator.createOperatorServiceAccount=false \ --set operator.createResourcesServiceAccountsAndRoles=false \ --set "multiCluster.clusters={$MDB_CLUSTER_1_FULL_NAME,$MDB_CLUSTER_2_FULL_NAME,$MDB_CLUSTER_3_FULL_NAME}" \ --set multiCluster.performFailover=false
Kubernetes Operator カスタム リソースを適用します。
kubectl apply -f https://raw.githubusercontent.com/mongodb/mongodb-enterprise-kubernetes/master/crds.yaml Kubernetes Operator YAML テンプレートをダウンロードします。
curl https://raw.githubusercontent.com/mongodb/mongodb-enterprise-kubernetes/master/mongodb-enterprise-multi-cluster.yaml -o operator.yaml オプション: Kubernetes Operator YAML テンプレートをカスタマイズします。
Kubernetes Operator のインストール設定の詳細については、 「 MongoDB Enterprise Kubernetes Operator kubernetes Operator kubernetes Operator および oc インストール設定 」を参照してください。
Kubernetes Operator YAML ファイルを適用します。
kubectl apply -f operator.yaml Kubernetes Operator が配置されていることを確認します。
Kubernetes Operator が正しくインストールされたことを確認するには、次のコマンドを実行し、出力を確認します。
kubectl describe deployments mongodb-enterprise-operator -n <metadata.namespace> oc describe deployments mongodb-enterprise-operator -n <metadata.namespace> デフォルトでは、配置は
mongodb
名前空間に存在します。 次のエラー メッセージが表示される場合は、正しい名前空間を使用していることを確認してください。Error from server (NotFound): deployments.apps "mongodb-enterprise-operator" not found Kubernetes Operator のトラブルシューティングについては、「 Kubernetes Operator からのログの確認 」やその他のトラブルシューティング トピックを参照してください。
重要
Kubernetes Operator または名前空間を削除する必要がある場合は、まずMongoDB リソースを削除する必要があります。
MongoDB Ops Managerで使用するシークレットを作成し、ConfigMap を作成します。
シークレットを作成すると、 Kubernetes Operator がMongoDB Ops Managerプロジェクト内のオブジェクトを作成および更新できるようになります。 詳細については、「 Kubernetes Operator の認証情報の作成 」を参照してください。
ConfigMap を作成して、 Kubernetes Operator をMongoDB Ops Managerプロジェクトにリンクします。 詳しくは、「 ConfigMap を使用してプロジェクトを 1 つ作成する 」を参照してください。
MongoDBMultiCluster
リソースます。
spec.credentials
spec.opsManager.configMapRef.name
、 、およびセキュリティ設定を設定し、 MongoDBMultiCluster
duplicateServiceObjects
true
リソースを配置します。次のコードサンプルでは、Istio で DNS プロキシを有効にするために が に設定されています。
注意
Istio サービス メトリクスによるクラスター間での DNS 解決を有効にするために、このチュートリアルでは Kubernetes ポッドごとに 1 つの ClusterIP アドレスを持つサービス オブジェクトを作成します。
kubectl apply -f - <<EOF apiVersion: mongodb.com/v1 kind: MongoDBMultiCluster metadata: name: multi-replica-set spec: version: 6.0.0-ent type: ReplicaSet persistent: false duplicateServiceObjects: true credentials: my-credentials opsManager: configMapRef: name: my-project security: certsSecretPrefix: <prefix> tls: ca: custom-ca clusterSpecList: - clusterName: ${MDB_CLUSTER_1_FULL_NAME} members: 3 - clusterName: ${MDB_CLUSTER_2_FULL_NAME} members: 2 - clusterName: ${MDB_CLUSTER_3_FULL_NAME} members: 3 EOF
Kubernetes Operator は、前の手順で作成したCAを含む ConfigMap を各ノード クラスターにコピーし、連結されたPEMシークレットを生成し、それをノード クラスターに配布します。
MongoDBMultiCluster
リソースがを実行中していることを確認します。
ノードクラスターの場合は、次のコマンドを実行して、MongoDB ポッドが実行状態であることを確認します。
kubectl get pods \ --context=$MDB_CLUSTER_1_FULL_NAME \ --namespace mongodb kubectl get pods \ --context=$MDB_CLUSTER_2_FULL_NAME \ --namespace mongodb kubectl get pods \ --context=$MDB_CLUSTER_3_FULL_NAME \ --namespace mongodb 中央クラスターで次のコマンドを実行し、
MongoDBMultiCluster
リソースが実行状態であることを確認します。kubectl --context=$MDB_CENTRAL_CLUSTER_FULL_NAME \ --namespace mongodb \ get mdbmc multi-replica-set -o yaml -w
次のステップ
MongoDB レプリカセットを 3 つの Kubernetes ノード クラスターに配置した後、データベースユーザーを追加して、MongoDB database に接続できるようにします。 「データベースユーザーの管理 」を参照してください。