クイック スタートを使用して、GKE(Google Kubernetes Engine)と Istio サービス キャッシュを使用して、3 つのKubernetesノード クラスターにMongoDBレプリカセットを配置します。
始める前に:
Kubernetes クラスターのマルチ配置について学ぶ
マルチKubernetesクラスターのサービスとツールのリストを確認する
前提条件を完了する
注意
次の手順では、マルチ Kubernetes クラスターMongoDBデプロイの範囲を mongodbという名前の単一の名前空間に限定します。 MongoDBデプロイを構成して、複数の名前空間またはすべての名前空間のリソースを監視できます。
実際に見て学びたい方に
このビデオ チュートリアルでは、マルチ 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 Platformプロジェクトを作成し、プロジェクトでの請求を有効にして、アーティファクト レジストリと GKE API を有効にして、Google Cloud PlatformドキュメントのGoogle Kubernetes Engine クイックスタートの関連手順に従って Cloud シェルを起動します。 。
中央クラスターとメンバークラスターを作成します。
次の例のように、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 証明書を使用してMongoDB のマルチ Kubernetes クラスターでレプリカセット接続を暗号化するかどうかに応じて、適切なタブを選択します。
この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を リソースにリンクします。 リソースに対して常に という名前を付ける必要がある CA 証明書ファイルを指定します。ca-pemMongoDBMultiCluster
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プラグインは次のようになります。
すべてのノードクラスターを含むデフォルトの ConfigMap をハードコードされた名前
mongodb-kubernetes-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
中央クラスターにKubernetes Operator 用のMongoDB Controls を配置します。
Helm または kubectl を使用して、mongodb名前空間の中央クラスターにKubernetes演算子用のMongoDBコントロールを配置します。
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-kubernetes-operator-multi-cluster \ mongodb/mongodb-kubernetes \ --namespace mongodb \ --set namespace=mongodb \ --version <mongodb-kubernetes-operator-version> \ --set operator.name=mongodb-kubernetes-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-kubernetes/1.1.0/public/crds.yaml Kubernetes Operator YAML テンプレートをダウンロードします。
curl https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/1.1.0/public/mongodb-kubernetes-multi-cluster.yaml -o operator.yaml オプション: Kubernetes Operator YAML テンプレートをカスタマイズします。
任意のKubernetes Operator インストール設定については、「 Kubernetes Operator kubernetes および oc インストール設定用のMongoDBコントロール 」を参照してください。
Kubernetes Operator YAML ファイルを適用します。
kubectl apply -f operator.yaml Kubernetes Operator が配置されていることを確認します。
Kubernetes Operator が正しくインストールされたことを確認するには、次のコマンドを実行し、出力を確認します。
kubectl describe deployments mongodb-kubernetes-operator -n <metadata.namespace> oc describe deployments mongodb-kubernetes-operator -n <metadata.namespace> デフォルトでは、配置は
mongodb名前空間に存在します。 次のエラー メッセージが表示される場合は、正しい名前空間を使用していることを確認してください。Error from server (NotFound): deployments.apps "mongodb-kubernetes-operator" not found Kubernetes Operator のトラブルシューティングについては、「 Kubernetes Operator からのログの確認 」やその他のトラブルシューティング トピックを参照してください。
重要
Kubernetes Operator または名前空間を削除する必要がある場合は、まずMongoDB リソースを削除する必要があります。
MongoDB Ops Managerで使用するシークレットを作成し、ConfigMap を作成します。
シークレットを作成すると、 Kubernetes Operator が Ops Managerプロジェクト内のオブジェクトを作成および更新できるようになります。詳細については、「 Kubernetes Operator の認証情報の作成 」を参照してください。
ConfigMap を作成して、 Kubernetes Operator をMongoDB Ops Managerプロジェクトにリンクします。詳しくは、「 ConfigMap を使用してMongoDB配置ごとに 1 つのプロジェクトを作成する 」を参照してください。
MongoDBMultiClusterリソースを配置します。
spec.credentialsspec.opsManager.configMapRef.name、 、およびセキュリティ設定を設定し、 MongoDBMultiClusterduplicateServiceObjectstrueリソースを配置します。次のコードサンプルでは、Istio で DNS プロキシを有効にするために が に設定されています。
注意
Istio サービス メトリクスによるクラスター間での DNS 解決を有効にするために、このチュートリアルでは Kubernetes ポッドごとに 1 つの ClusterIP アドレスを持つサービス オブジェクトを作成します。
kubectl apply -f - <<EOF apiVersion: mongodb.com/v1 kind: MongoDBMultiCluster metadata: name: multi-replica-set spec: version: 8.0.0 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プラグインは次のようになります。
すべてのノードクラスターを含むデフォルトの ConfigMap をハードコードされた名前
mongodb-kubernetes-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
中央クラスターにKubernetes Operator 用のMongoDB Controls を配置します。
Helm または kubectl を使用して、mongodb名前空間の中央クラスターにKubernetes演算子用のMongoDBコントロールを配置します。
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-kubernetes-operator-multi-cluster \ mongodb/mongodb-kubernetes \ --namespace mongodb \ --set namespace=mongodb \ --version <mongodb-kubernetes-operator-version> \ --set operator.name=mongodb-kubernetes-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-kubernetes/1.1.0/public/crds.yaml Kubernetes Operator YAML テンプレートをダウンロードします。
curl https://raw.githubusercontent.com/mongodb/mongodb-kubernetes/1.1.0/public/mongodb-kubernetes-multi-cluster.yaml -o operator.yaml オプション: Kubernetes Operator YAML テンプレートをカスタマイズします。
任意のKubernetes Operator インストール設定については、「 Kubernetes Operator kubernetes および oc インストール設定用のMongoDBコントロール 」を参照してください。
Kubernetes Operator YAML ファイルを適用します。
kubectl apply -f operator.yaml Kubernetes Operator が配置されていることを確認します。
Kubernetes Operator が正しくインストールされたことを確認するには、次のコマンドを実行し、出力を確認します。
kubectl describe deployments mongodb-kubernetes-operator -n <metadata.namespace> oc describe deployments mongodb-kubernetes-operator -n <metadata.namespace> デフォルトでは、配置は
mongodb名前空間に存在します。 次のエラー メッセージが表示される場合は、正しい名前空間を使用していることを確認してください。Error from server (NotFound): deployments.apps "mongodb-kubernetes-operator" not found Kubernetes Operator のトラブルシューティングについては、「 Kubernetes Operator からのログの確認 」やその他のトラブルシューティング トピックを参照してください。
重要
Kubernetes Operator または名前空間を削除する必要がある場合は、まずMongoDB リソースを削除する必要があります。
MongoDB Ops Managerで使用するシークレットを作成し、ConfigMap を作成します。
シークレットを作成すると、 Kubernetes Operator が Ops Managerプロジェクト内のオブジェクトを作成および更新できるようになります。詳細については、「 Kubernetes Operator の認証情報の作成 」を参照してください。
ConfigMap を作成して、 Kubernetes Operator をMongoDB Ops Managerプロジェクトにリンクします。詳しくは、「 ConfigMap を使用してMongoDB配置ごとに 1 つのプロジェクトを作成する 」を参照してください。
MongoDBMultiClusterリソースを配置します。
spec.credentialsspec.opsManager.configMapRef.name、 、およびセキュリティ設定を設定し、 MongoDBMultiClusterduplicateServiceObjectstrueリソースを配置します。次のコードサンプルでは、Istio で DNS プロキシを有効にするために が に設定されています。
注意
Istio サービス メトリクスによるクラスター間での DNS 解決を有効にするために、このチュートリアルでは Kubernetes ポッドごとに 1 つの ClusterIP アドレスを持つサービス オブジェクトを作成します。
kubectl apply -f - <<EOF apiVersion: mongodb.com/v1 kind: MongoDBMultiCluster metadata: name: multi-replica-set spec: version: 8.0.0 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 に接続できるようにします。 「データベースユーザーの管理 」を参照してください。