AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。

マルチクラスター外部アプリケーション データベースの配置

マルチクラスターの外部アプリケーションデータベースを使用する Ops Managerリソースを配置できます。これは、 が に設定されている MongoDB MultiClusterspec.role AppDBカスタムリソース。このリソースは、アプリケーション データベース ノードを複数のKubernetesクラスターに分散します。 2 番目の Ops Managerインスタンスは、リソースをプロジェクトとして管理します。これにより、Ops Manager はアプリケーション データベースをバックアップして復元できます。詳細については、「 Ops Manager Application Database のバックアップ 」を参照してください。

この手順では、新しい Ops Managerインスタンスを配置します。内部管理型マルチクラスター アプリケーション データベースを使用する既存の Ops Managerインスタンスを変換するには、「 マルチクラスター アプリケーション データベースの移行 」を参照してください。この手順の単一クラスターのバリアントについては、「 外部アプリケーション データベースを使用して Ops Manager を配置する 」を参照してください。

この手順では、以下のリソースを配置します。

始める前に、次のタスクを完了してください。

  • それぞれがデフォルトのStorageClass である 3 つのKubernetesクラスターを配置します。1 つの中央クラスターと 2 つのノードクラスター。

  • クラスターをまたがるサービス メトリクスを配置し、クラスター間のサービス検出を提供します。アプリケーション データベース ノードは、メッシュを介してクラスター全体で通信します。

    この手順では Istio を使用しますが、クラスター全体のポッド間で FQDN ホスト名解決を提供する任意のサービス メトリクスを使用できます。サービス メトリクスは、マルチクラスターの外部アプリケーション データベース自体には必要ありません。メッシュなし配置パターンについては、「 サービス メッシュを使用しないマルチクラスター Ops Manager 」を参照してください。

  • kubectl、helm、kubectl mongodbプラグインをインストールし、3 つのクラスターすべてにそれらを構成します。

  • Kubernetes 演算子 Helmチャートへのアクセスを取得します。

配置する前に、次の考慮事項を確認してください。

  • MongoDB Ops Managerのバージョンとアプリケーションデータベースのバージョンをコンシステントなペアに設定します。マネジメントMongoDB Ops Managerインスタンスは外部アプリケーションデータベースをマネージドするため、アプリケーションデータベースのバージョンは、マネジメントMongoDB Ops Managerインスタンスがバージョンマニフェストで提供するMongoDBバージョンである必要があります。例として、8.0.xMongoDB Ops Managerインスタンスは8.0.xを提供しますが、.xMongoDBバージョンは提供しませんが、7.0.xMongoDB Ops Managerインスタンスは提供しません。互換性のあるペアを見つけるには、アプリケーションデータベースの互換性マトリックスを参照してください。

  • マルチクラスターの外部アプリケーションデータベースには TLS暗号化が必要です。アプリケーション データベースが TLS を使用する場合、 MongoDB Agent は、spec.security.tls.ca からのMongoDBバイナリのダウンロードを含む、 の CA バンドルに対するすべてのアウトバウンド HTTPSdownloads.mongodb.com 接続を検証します。 CA バンドルには、独自のdownloads.mongodb.com CA に加えて、 に署名するパブリック ルートを含める必要があります。マルチクラスター配置の TLS 証明書を構成するには、「 TLS 証明書の管理 」を参照してください。

  • 中央クラスターはKubernetes Operator と Ops Manager インスタンスの両方を実行し、 MongoDB MultiClusterリソースを保持します。ノードクラスターはアプリケーションデータベースデータポッドを実行します。

1
export K8S_CTX_0="<central-cluster-context>"export K8S_CTX_1="<member-cluster-1-context>"export K8S_CTX_2="<member-cluster-2-context>"export MDB_NS="mongodb" export OPERATOR_HELM_CHART="oci://quay.io/mongodb/helm-charts/mongodb-kubernetes" export OM_VERSION="8.0.7"export APPDB_VERSION="8.0.5-ent" export MANAGEMENT_OM_NAME="management-om"export PRIMARY_OM_NAME="primary-om" export APPDB_NAME="${PRIMARY_OM_NAME}-db"export APPDB_MEMBERS_C1=2export APPDB_MEMBERS_C2=2 export MANAGEMENT_OM_URL="http://${MANAGEMENT_OM_NAME}-svc.${MDB_NS}.svc.cluster.local:8080"export MANAGEMENT_OM_ADMIN_KEY_SECRET="${MDB_NS}-${MANAGEMENT_OM_NAME}-admin-key" export APPDB_PROJECT_CONFIGMAP="${APPDB_NAME}-config"export APPDB_PROJECT_NAME="external-appdb"export APPDB_CONNECTION_STRING_SECRET="${APPDB_NAME}-connection-string" export CERT_MANAGER_NAMESPACE="cert-manager"export APPDB_TLS_SELF_SIGNED_ISSUER="mongodb-self-signed-issuer"export APPDB_TLS_CA_CERT_NAME="mongodb-ca"export APPDB_TLS_CA_SECRET_NAME="mongodb-ca-key-pair"export APPDB_TLS_CA_ISSUER="mongodb-ca-issuer"export APPDB_CERT_PREFIX="appdb"export APPDB_CA_CONFIGMAP="${APPDB_NAME}-ca" export OM_ADMIN_EMAIL="admin@example.com"export OM_ADMIN_PASSWORD="<your-password>"export OM_ADMIN_FIRST_NAME="Admin"export OM_ADMIN_LAST_NAME="User"

Kubernetes 演算子では、外部のアプリケーションデータベースの名前を<primary-om-name>-dbにする必要があるため、APPDB_NAMEはPRIMARY_OM_NAMEから派生しています。

2

名前空間は、中央クラスターと両方のノードクラスターに存在する必要があります。istio-injection=enabled ラベルはアプリケーション データベース ポッドにサイドカーを追加し、エージェントがクラスター全体でマネジメントの Ops Manager サービスを解決できるようにします。

for ctx in "${K8S_CTX_0}" "${K8S_CTX_1}" "${K8S_CTX_2}"; do kubectl create namespace "${MDB_NS}" --context "${ctx}" --dry-run=client -o yaml \ | kubectl apply --context "${ctx}" -f - kubectl label namespace "${MDB_NS}" istio-injection=enabled --overwrite --context "${ctx}"done
3

プラグイン を使用してクラスター全体でサービス アカウントとロールを構成し、ノード クラスターが登録されている中央クラスターにKubernetes Operator をインストールします。詳細については、「kubectl mongodb マルチクラスター配置の前提条件 」を参照してください。

kubectl mongodb multicluster setup \ --central-cluster="${K8S_CTX_0}" \ --member-clusters="${K8S_CTX_0},${K8S_CTX_1},${K8S_CTX_2}" \ --member-cluster-namespace="${MDB_NS}" \ --central-cluster-namespace="${MDB_NS}" \ --create-service-account-secrets \ --install-database-roles=true helm upgrade --install --kube-context "${K8S_CTX_0}" \ --create-namespace --namespace "${MDB_NS}" \ mongodb-kubernetes-operator-multi-cluster \ --set operator.name=mongodb-kubernetes-operator-multi-cluster \ --set operator.createOperatorServiceAccount=false \ --set operator.createResourcesServiceAccountsAndRoles=false \ --set "multiCluster.clusters={${K8S_CTX_0},${K8S_CTX_1},${K8S_CTX_2}}" \ "${OPERATOR_HELM_CHART}" kubectl rollout status deployment/mongodb-kubernetes-operator-multi-cluster \ --context "${K8S_CTX_0}" -n "${MDB_NS}" --timeout=300s
4

両方のMongoDB Ops Manager リソースは、このシークレットを`spec.adminCredentials.` で参照します。

kubectl create secret generic ops-manager-admin-secret \ --context "${K8S_CTX_0}" -n "${MDB_NS}" \ --from-literal=Username="${OM_ADMIN_EMAIL}" \ --from-literal=Password="${OM_ADMIN_PASSWORD}" \ --from-literal=FirstName="${OM_ADMIN_FIRST_NAME}" \ --from-literal=LastName="${OM_ADMIN_LAST_NAME}"
5

マルチクラスターのアプリケーション データベース ノードは TLS を使用するため、証明書マネージャーは CA とアプリケーション データベースサーバー証明書を発行する必要があります。

helm upgrade --install --kube-context "${K8S_CTX_0}" \ cert-manager jetstack/cert-manager \ --namespace "${CERT_MANAGER_NAMESPACE}" --create-namespace \ --set crds.enabled=true
6

署名チェーンを作成し、 Kubernetes Operator が spec.security.tls.ca として参照する ConfigMap に CA を公開します。バンドルは、自己署名 CA をホストのパブリック CA バンドルと組み合わせます。これは、 MongoDB Agent がこのバンドルに対して downloads.mongodb.com からのMongoDBバイナリのダウンロードを検証するためです。合計されたバンドルはクライアント側の kubectl apply アノテーションのサイズ制限を超えるため、サーバー側の ConfigMap を適用します。

kubectl apply --context "${K8S_CTX_0}" -f - <<EOFapiVersion: cert-manager.io/v1kind: ClusterIssuermetadata: name: ${APPDB_TLS_SELF_SIGNED_ISSUER}spec: selfSigned: {}EOF kubectl apply --context "${K8S_CTX_0}" -n "${CERT_MANAGER_NAMESPACE}" -f - <<EOFapiVersion: cert-manager.io/v1kind: Certificatemetadata: name: ${APPDB_TLS_CA_CERT_NAME}spec: isCA: true commonName: mongodb-ca secretName: ${APPDB_TLS_CA_SECRET_NAME} duration: 87600h renewBefore: 8760h privateKey: algorithm: ECDSA size: 256 issuerRef: name: ${APPDB_TLS_SELF_SIGNED_ISSUER} kind: ClusterIssuerEOF kubectl wait --for=condition=Ready certificate/"${APPDB_TLS_CA_CERT_NAME}" \ -n "${CERT_MANAGER_NAMESPACE}" --context "${K8S_CTX_0}" --timeout=120s kubectl apply --context "${K8S_CTX_0}" -f - <<EOFapiVersion: cert-manager.io/v1kind: ClusterIssuermetadata: name: ${APPDB_TLS_CA_ISSUER}spec: ca: secretName: ${APPDB_TLS_CA_SECRET_NAME}EOF ca_crt=$(kubectl get secret "${APPDB_TLS_CA_SECRET_NAME}" \ -n "${CERT_MANAGER_NAMESPACE}" --context "${K8S_CTX_0}" \ -o jsonpath='{.data.ca\.crt}' | base64 -d) system_ca=""for candidate in /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt /etc/ssl/cert.pem; do [[ -r "${candidate}" ]] && { system_ca=$(cat "${candidate}"); break; }done ca_bundle_file=$(mktemp)printf '%s\n%s\n' "${ca_crt}" "${system_ca}" > "${ca_bundle_file}" kubectl create configmap "${APPDB_CA_CONFIGMAP}" \ --context "${K8S_CTX_0}" -n "${MDB_NS}" \ --from-file=ca-pem="${ca_bundle_file}" \ --from-file=mms-ca.crt="${ca_bundle_file}" \ --dry-run=client -o yaml \ | kubectl apply --server-side --force-conflicts --context "${K8S_CTX_0}" -n "${MDB_NS}" -f - rm -f "${ca_bundle_file}"
7

証明書シークレット名はKubernetes Operator の規則 <certs-secret-prefix>-<appdb-name>-cert に従います。ワイルドカード dnsNames エントリは、すべてのクラスター内のすべてのアプリケーション データベース ノードのサービス FQDN をカバーします。

kubectl apply --context "${K8S_CTX_0}" -n "${MDB_NS}" -f - <<EOFapiVersion: cert-manager.io/v1kind: Certificatemetadata: name: ${APPDB_CERT_PREFIX}-${APPDB_NAME}-certspec: secretName: ${APPDB_CERT_PREFIX}-${APPDB_NAME}-cert duration: 8760h renewBefore: 720h privateKey: algorithm: RSA size: 2048 usages: ["server auth", "client auth"] dnsNames: - "*.${MDB_NS}.svc.cluster.local" issuerRef: name: ${APPDB_TLS_CA_ISSUER} kind: ClusterIssuerEOF kubectl wait --for=condition=Ready certificate/"${APPDB_CERT_PREFIX}-${APPDB_NAME}-cert" \ -n "${MDB_NS}" --context "${K8S_CTX_0}" --timeout=120s
8
kubectl apply --context "${K8S_CTX_0}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBOpsManagermetadata: name: ${MANAGEMENT_OM_NAME}spec: replicas: 1 version: ${OM_VERSION} adminCredentials: ops-manager-admin-secret applicationDatabase: members: 3 version: ${APPDB_VERSION} backup: enabled: false configuration: automation.versions.source: mongodb mms.ignoreInitialUiSetup: "true" mms.adminEmailAddr: admin@example.com mms.fromEmailAddr: admin@example.com mms.replyToEmailAddr: admin@example.com mms.mail.hostname: email-smtp.us-east-1.amazonaws.com mms.mail.port: "465" mms.mail.ssl: "true" mms.mail.transport: smtp mms.minimumTLSVersion: TLSv1.2EOF

mms.* メール設定が必要です。mms.ignoreInitialUiSetup が true の場合、mms.fromEmailAddr と関連するメール設定が存在しない限り、MongoDB Ops Manager の事前チェックは MongoDB Ops Manager を開始しません。

9
  1. 内部でマネージドされているアプリケーションデータベースと MongoDB Ops Manager リソースを待機します:

    kubectl wait --for=jsonpath='{.status.applicationDatabase.phase}'=Running \ om/"${MANAGEMENT_OM_NAME}" --context "${K8S_CTX_0}" -n "${MDB_NS}" --timeout=1200s kubectl wait --for=jsonpath='{.status.opsManager.phase}'=Running \ om/"${MANAGEMENT_OM_NAME}" --context "${K8S_CTX_0}" -n "${MDB_NS}" --timeout=1800s
  2. MongoDB Ops Manager の公開 API がリクエストに答えていることを確認してください。`opsManager.phase` の `Running` は、MongoDB Ops Manager ポッドが起動していることを意味しますが、Kubernetes 演算子がアプリケーションデータベース プロジェクトを作成するために使用する API は数秒遅れる可能性があります。401 レスポンスは予期される認証されていないレスポンスであり、これは API が準備できていることを意味します:

    om_pod="${MANAGEMENT_OM_NAME}-0"until [ "$(kubectl exec "${om_pod}" -c mongodb-ops-manager --context "${K8S_CTX_0}" -n "${MDB_NS}" -- \ curl -s -o /dev/null -w '%{http_code}' \ "http://$(kubectl get pod "${om_pod}" --context "${K8S_CTX_0}" -n "${MDB_NS}" \ -o jsonpath='{.status.podIP}'):8080/api/public/v1.0" 2>/dev/null)" = "401" ]; do echo "waiting for management Ops Manager public API..."; sleep 10done
  3. Kubernetes 演算子がマネジメント Ops Manager インスタンス用のプログラム用 API キー シークレットを作成したことを確認します。

    kubectl get secret "${MANAGEMENT_OM_ADMIN_KEY_SECRET}" \ --context "${K8S_CTX_0}" -n "${MDB_NS}"
10

エントリは、TLS 対応の Application sslMMSCAConfigMapDatabase エージェントが管理 Ops Managerインスタンスに接続するときに信頼する必要がある CA を公開します。

kubectl create configmap "${APPDB_PROJECT_CONFIGMAP}" \ --context "${K8S_CTX_0}" -n "${MDB_NS}" \ --from-literal=baseUrl="${MANAGEMENT_OM_URL}" \ --from-literal=projectName="${APPDB_PROJECT_NAME}" \ --from-literal=sslMMSCAConfigMap="${APPDB_CA_CONFIGMAP}" \ --from-literal=orgId="" \ --dry-run=client -o yaml \ | kubectl apply --context "${K8S_CTX_0}" -n "${MDB_NS}" -f -
11

中央クラスターに MongoDB MultiClusterリソースを適用します。 Kubernetes Operator は、ノードクラスター上にアプリケーションデータベースノードを作成します。

kubectl apply --context "${K8S_CTX_0}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBMultiClustermetadata: name: ${APPDB_NAME}spec: version: ${APPDB_VERSION} type: ReplicaSet role: AppDB persistent: true credentials: ${MANAGEMENT_OM_ADMIN_KEY_SECRET} opsManager: configMapRef: name: ${APPDB_PROJECT_CONFIGMAP} security: certsSecretPrefix: ${APPDB_CERT_PREFIX} tls: enabled: true ca: ${APPDB_CA_CONFIGMAP} clusterSpecList: - clusterName: ${K8S_CTX_1} members: ${APPDB_MEMBERS_C1} - clusterName: ${K8S_CTX_2} members: ${APPDB_MEMBERS_C2}EOF kubectl wait --for=jsonpath='{.status.phase}'=Running \ mdbmc/"${APPDB_NAME}" --context "${K8S_CTX_0}" -n "${MDB_NS}" --timeout=1200s

をspec.role AppDBに設定すると、 Kubernetes Operator はリソースの SCRAM認証を構成します。詳しくは、spec.role を参照してください。

12

spec.applicationDatabaseこのリソースはkind を省略し、MongoDBMultiCluster が に設定されている外部アプリケーション データベースを参照します。

kubectl apply --context "${K8S_CTX_0}" -n "${MDB_NS}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBOpsManagermetadata: name: ${PRIMARY_OM_NAME}spec: replicas: 1 version: ${OM_VERSION} adminCredentials: ops-manager-admin-secret externalApplicationDatabaseRef: name: ${APPDB_NAME} kind: MongoDBMultiCluster backup: enabled: false configuration: automation.versions.source: mongodb mms.ignoreInitialUiSetup: "true" mms.adminEmailAddr: admin@example.com mms.fromEmailAddr: admin@example.com mms.replyToEmailAddr: admin@example.com mms.mail.hostname: email-smtp.us-east-1.amazonaws.com mms.mail.port: "465" mms.mail.ssl: "true" mms.mail.transport: smtp mms.minimumTLSVersion: TLSv1.2EOF

MongoDB 配置のバックアップを有効にするには、このリソースで spec.backup.enabled を true に設定し、スナップショット ストレージを構成します。詳しく学ぶには、ファイル システム バックアップ 保存を Kubernetes 演算子 で構成するを参照してください。

13
kubectl wait --for=jsonpath='{.status.opsManager.phase}'=Running \ om/"${PRIMARY_OM_NAME}" --context "${K8S_CTX_0}" -n "${MDB_NS}" --timeout=1800s kubectl wait --for=jsonpath='{.status.applicationDatabase.phase}'=Disabled \ om/"${PRIMARY_OM_NAME}" --context "${K8S_CTX_0}" -n "${MDB_NS}" --timeout=600s

外部アプリケーションデータベースを使用する MongoDB Ops Manager リソースに対して、Kubernetes 演算子は内部アプリケーションデータベースを管理しません。そのため、status.applicationDatabase.phase は Disabled を報告します。これは予期される動作ですので、エラーではありません。

14

マルチクラスター配置では、アプリケーション データベースのステートメントはノード クラスターで実行され、 Kubernetes演算子は所有者参照ではなく mongodbmulticluster ラベルで所有権を追跡します。

  1. アプリケーション データベース ポッドが各ノードクラスターで実行中であること、および各ステートフルセットが mongodbmulticluster ラベルを <namespace>-<appdb-name> に設定していることを確認します。

    idx=0for ctx in "${K8S_CTX_1}" "${K8S_CTX_2}"; do sts="${APPDB_NAME}-${idx}" kubectl get pods --context "${ctx}" -n "${MDB_NS}" \ -l "mongodbmulticluster=${MDB_NS}-${APPDB_NAME}" kubectl get statefulset "${sts}" --context "${ctx}" -n "${MDB_NS}" \ -o jsonpath='{.metadata.labels.mongodbmulticluster}{"\n"}' idx=$((idx + 1))done
  2. Kubernetes 演算子がプライマリ MongoDB Ops Manager インスタンスの接続文字列シークレットを作成したことを確認してください。

    kubectl get secret "${APPDB_CONNECTION_STRING_SECRET}" \ --context "${K8S_CTX_0}" -n "${MDB_NS}"

x509: certificate signed by unknown authorityアプリケーションspec.security.tls.ca downloads.mongodb.comデータベース エージェントが を使用してMongoDBバイナリをダウンロードできない場合、 の CA バンドルには に署名する公開ルートは含まれません。 TLS を有効にすると、 MongoDB Agent はシステム 信頼ストアではなく、このバンドルに対してダウンロードを検証します。 TLS CA ステップに示されているように、自己署名 CA とホストのパブリック CA バンドルの両方を使用して ConfigMap を再作成します。

アプリケーション データベース エージェントが管理 Ops Manager サービスの Could not resolve host をログ場合、ノードクラスターの名前空間にistio-injection=enabled ラベルがありません。サイドカーがないと、ポッドはメトリクスを介して中央クラスターの Ops Manager サービスを解決できません。名前空間の手順 に示すように、 ラベルを適用します。

Kubernetes がmetadata.annotations: Too long を含む CA ConfigMap を拒否した場合、結合された CA バンドルはクライアント側の kubectl apply アノテーションのサイズ制限を超えます。 kubectl apply --server-side --force-conflicts を使用して ConfigMap を適用するか、kubectl create を使用して作成します。

外部アプリケーション データベースがMongoDBバージョンが利用できないというメッセージを含む Failed を報告する場合は、管理用 Ops Managerインスタンスが提供するバージョンに spec.version を設定します。 Ops Manager バージョンとアプリケーションデータベースバージョンは同じメジャー バージョンに保持します。

の値は正確にspec.externalApplicationDatabaseRef.name <primary-om-name>-dbであり、MongoDB MultiClusterリソースはOps Managerリソースと同じ名前空間内になければなりません。

外部アプリケーション データベースをバックアップするには、MongoDB Ops Managerインスタンスが管理するプロジェクト内の MongoDB MultiClusterリソースでバックアップを有効にします。詳細については、 「 MongoDB database のバックアップの構成 」を参照してください。