マルチクラスターの外部アプリケーションデータベースを使用する Ops Managerリソースを配置できます。これは、 が に設定されている MongoDB MultiClusterspec.role AppDBカスタムリソース。このリソースは、アプリケーション データベース ノードを複数のKubernetesクラスターに分散します。 2 番目の Ops Managerインスタンスは、リソースをプロジェクトとして管理します。これにより、Ops Manager はアプリケーション データベースをバックアップして復元できます。詳細については、「 Ops Manager Application Database のバックアップ 」を参照してください。
この手順では、新しい Ops Managerインスタンスを配置します。内部管理型マルチクラスター アプリケーション データベースを使用する既存の Ops Managerインスタンスを変換するには、「 マルチクラスター アプリケーション データベースの移行 」を参照してください。この手順の単一クラスターのバリアントについては、「 外部アプリケーション データベースを使用して Ops Manager を配置する 」を参照してください。
この手順では、以下のリソースを配置します。
中央クラスターで実行中、独自の内部管理型アプリケーションデータベースを持つマネジメント Ops Managerインスタンス。このインスタンスは、外部アプリケーション データベースを含むプロジェクトを管理します。
外部アプリケーション データベース:
spec.roleAppDBが に設定されている MongoDB レプリカセット(<primary-om-name>-dbという名前)。 Kubernetes Operator は、 という名前のノードクラスターごとに 1<primary-om-name>-db-<cluster-index>つのステートフルセットを作成します。MongoDB Ops Manager のプライマリインスタンスで、
spec.applicationDatabaseを省略し、 が に設定されている外部アプリケーションspec.externalApplicationDatabaseRefMongoDBMultiClusterデータベースを参照します。
前提条件
始める前に、次のタスクを完了してください。
それぞれがデフォルトの
StorageClassである 3 つのKubernetesクラスターを配置します。1 つの中央クラスターと 2 つのノードクラスター。クラスターをまたがるサービス メトリクスを配置し、クラスター間のサービス検出を提供します。アプリケーション データベース ノードは、メッシュを介してクラスター全体で通信します。
この手順では Istio を使用しますが、クラスター全体のポッド間で FQDN ホスト名解決を提供する任意のサービス メトリクスを使用できます。サービス メトリクスは、マルチクラスターの外部アプリケーション データベース自体には必要ありません。メッシュなし配置パターンについては、「 サービス メッシュを使用しないマルチクラスター Ops Manager 」を参照してください。
kubectl、helm、kubectl mongodbプラグインをインストールし、3 つのクラスターすべてにそれらを構成します。Kubernetes 演算子 Helmチャートへのアクセスを取得します。
Considerations
配置する前に、次の考慮事項を確認してください。
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.comCA に加えて、 に署名するパブリック ルートを含める必要があります。マルチクラスター配置の TLS 証明書を構成するには、「 TLS 証明書の管理 」を参照してください。
手順
配置の環境変数を設定します。
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から派生しています。
各クラスターに名前空間を作成します。
名前空間は、中央クラスターと両方のノードクラスターに存在する必要があります。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}"doneKubernetes Operator を マルチクラスターモードでインストールします。
プラグイン を使用してクラスター全体でサービス アカウントとロールを構成し、ノード クラスターが登録されている中央クラスターに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=300sMongoDB Ops Manager の管理者シークレットを作成します。
両方の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}"中央クラスターに cert-manager をインストールします。
マルチクラスターのアプリケーション データベース ノードは TLS を使用するため、証明書マネージャーは CA とアプリケーション データベースサーバー証明書を発行する必要があります。
helm upgrade --install --kube-context "${K8S_CTX_0}" \ cert-manager jetstack/cert-manager \ --namespace "${CERT_MANAGER_NAMESPACE}" --create-namespace \ --set crds.enabled=trueTLS CA を構成します。
署名チェーンを作成し、 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}"アプリケーション データベースサーバー証明書を生成します。
証明書シークレット名は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マネジメント MongoDB Ops Manager インスタンスを配置します。
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.2EOFmms.* メール設定が必要です。mms.ignoreInitialUiSetup が true の場合、mms.fromEmailAddr と関連するメール設定が存在しない限り、MongoDB Ops Manager の事前チェックは MongoDB Ops Manager を開始しません。
マネジメント Ops Manager インスタンスが準備完了になるまで待機します。
内部でマネージドされているアプリケーションデータベースと 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=1800sMongoDB 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 10doneKubernetes 演算子がマネジメント Ops Manager インスタンス用のプログラム用 API キー シークレットを作成したことを確認します。
kubectl get secret "${MANAGEMENT_OM_ADMIN_KEY_SECRET}" \ --context "${K8S_CTX_0}" -n "${MDB_NS}"
外部アプリケーションデータベース用のプロジェクト ConfigMap を作成します。
エントリは、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 -外部のアプリケーションデータベースを作成します。
中央クラスターに 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 を参照してください。
プライマリ MongoDB Ops Manager インスタンスを配置します。
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.2EOFMongoDB 配置のバックアップを有効にするには、このリソースで spec.backup.enabled を true に設定し、スナップショット ストレージを構成します。詳しく学ぶには、ファイル システム バックアップ 保存を Kubernetes 演算子 で構成するを参照してください。
プライマリ MongoDB Ops Manager インスタンスの準備が完了するまで待機します。
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 を報告します。これは予期される動作ですので、エラーではありません。
配置を確認します。
マルチクラスター配置では、アプリケーション データベースのステートメントはノード クラスターで実行され、 Kubernetes演算子は所有者参照ではなく mongodbmulticluster ラベルで所有権を追跡します。
アプリケーション データベース ポッドが各ノードクラスターで実行中であること、および各ステートフルセットが
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))doneKubernetes 演算子がプライマリ 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 を解決できません
アプリケーション データベース エージェントが管理 Ops Manager サービスの Could not resolve host をログ場合、ノードクラスターの名前空間にistio-injection=enabled ラベルがありません。サイドカーがないと、ポッドはメトリクスを介して中央クラスターの Ops Manager サービスを解決できません。名前空間の手順 に示すように、 ラベルを適用します。
CA ConfigMap が長すぎるため拒否される
Kubernetes がmetadata.annotations: Too long を含む CA ConfigMap を拒否した場合、結合された CA バンドルはクライアント側の kubectl apply アノテーションのサイズ制限を超えます。 kubectl apply --server-side --force-conflicts を使用して ConfigMap を適用するか、kubectl create を使用して作成します。
MongoDB MultiCluster リソースがバージョン エラーを報告する
外部アプリケーション データベースが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 のバックアップの構成 」を参照してください。