マルチ Kubernetes クラスターMongoDB配置では、複数の地理的リージョンにまたがるグローバルクラスターにMongoDBインスタンスを追加して、可用性とデータのグローバル分散を実現できます。
前提条件
次の手順を開始する前に、次のアクションを実行してください。
kubectlをインストールします。Mongosh をインストールする
GKE クラスターの手順または同等の手順を完了します。
TLS 証明書 の手順または同等の手順を実行します。
Istio Service メッシュ手順または同等の手順を完了します。
MongoDB演算子の配置 手順を完了します。
マルチクラスターMongoDB Ops Manager の手順を完了します。MongoDB Ops Manager の代わりにCloud Managerを使用する場合は、この手順をスキップできます。
必要な環境変数を次のように設定します。
# This script builds on top of the environment configured in the setup guides.# It depends (uses) the following env variables defined there to work correctly.# If you don't use the setup guide to bootstrap the environment, then define them here.# ${K8S_CLUSTER_0_CONTEXT_NAME}# ${K8S_CLUSTER_1_CONTEXT_NAME}# ${K8S_CLUSTER_2_CONTEXT_NAME}# ${MDB_NAMESPACE}
export RS_RESOURCE_NAME=mdbexport MONGODB_VERSION="8.0.5-ent"ソースコード
手順
CA 証明書を作成します。
次のスクリプトを実行して、必要な CA 証明書を証明書発行者に作成します。
kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOFapiVersion: cert-manager.io/v1kind: Certificatemetadata: name: mdb-certspec: dnsNames: - "*.${MDB_NAMESPACE}.svc.cluster.local" duration: 240h0m0s issuerRef: name: my-ca-issuer kind: ClusterIssuer renewBefore: 120h0m0s secretName: cert-prefix-mdb-cert usages: - server auth - client authEOFMongoDBMultiClusterリソースを配置します。
spec.credentialsspec.opsManager.configMapRef.nameマルチクラスターMongoDB Ops Manager手順で定義した 、MongoDBMultiCluster を設定します。セキュリティ設定を定義し、 リソースを配置します。次のコードサンプルでは、Istio で DNS プロキシ を有効にするために duplicateServiceObjects が false に設定されています。
注意
Istio サービス メトリクスによるクラスター間での DNS 解決を有効にするために、このチュートリアルでは Kubernetes ポッドごとに 1 つの ClusterIP アドレスを持つサービス オブジェクトを作成します。
kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOFapiVersion: mongodb.com/v1kind: MongoDBMultiClustermetadata: name: ${RS_RESOURCE_NAME}spec: type: ReplicaSet version: ${MONGODB_VERSION} opsManager: configMapRef: name: mdb-org-project-config credentials: mdb-org-owner-credentials duplicateServiceObjects: false persistent: true backup: mode: enabled externalAccess: {} security: certsSecretPrefix: cert-prefix tls: ca: ca-issuer authentication: enabled: true modes: ["SCRAM"] clusterSpecList: - clusterName: ${K8S_CLUSTER_0_CONTEXT_NAME} members: 2 - clusterName: ${K8S_CLUSTER_1_CONTEXT_NAME} members: 1 - clusterName: ${K8S_CLUSTER_2_CONTEXT_NAME} members: 2EOFMongoDBMultiClusterリソースがを実行中いることを確認します。
次のコマンドを実行して、MongoDBMultiClusterリソースがを実行中ことを確認します。
echo; echo "Waiting for MongoDB to reach Running phase..."kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" wait --for=jsonpath='{.status.phase}'=Running "mdbmc/${RS_RESOURCE_NAME}" --timeout=900secho; echo "Pods running in cluster ${K8S_CLUSTER_0_CONTEXT_NAME}"kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get podsecho; echo "Pods running in cluster ${K8S_CLUSTER_1_CONTEXT_NAME}"kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get podsecho; echo "Pods running in cluster ${K8S_CLUSTER_2_CONTEXT_NAME}"kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get podsMongoDBユーザーとパスワードを作成します。
次のコマンドを実行して、 MongoDBユーザーとパスワードを作成します。配置には強力なパスワードを使用してください。
kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOFapiVersion: v1kind: Secretmetadata: name: rs-user-passwordtype: OpaquestringData: password: password---apiVersion: mongodb.com/v1kind: MongoDBUsermetadata: name: rs-userspec: passwordSecretKeyRef: name: rs-user-password key: password username: "rs-user" db: "admin" mongodbResourceRef: name: ${RS_RESOURCE_NAME} roles: - db: "admin" name: "root"EOF
kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" wait --for=jsonpath='{.status.phase}'=Updated -n "${MDB_NAMESPACE}" mdbu/rs-user --timeout=300s接続を確認します。
次のコマンドを mongosh 実行して、実行中のMongoDBインスタンスにアクセスできることを確認します。
external_ip="$(kubectl get --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" svc "${RS_RESOURCE_NAME}-0-0-svc-external" -o=jsonpath="{.status.loadBalancer.ingress[0].ip}")"
mkdir -p certskubectl get --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" cm/ca-issuer -o=jsonpath='{.data.ca-pem}' > certs/ca.crt
mongosh --host "${external_ip}" --username rs-user --password password --tls --tlsCAFile certs/ca.crt --tlsAllowInvalidHostnames --eval "db.runCommand({connectionStatus : 1})"{ authInfo: { authenticatedUsers: [ { user: 'rs-user', db: 'admin' } ], authenticatedUserRoles: [ { role: 'root', db: 'admin' } ] }, ok: 1, '$clusterTime': { clusterTime: Timestamp({ t: 1765972900, i: 9 }), signature: { hash: Binary.createFromBase64('qIChICPU9KLlu7pdZH67Bvc8wwI=', 0), keyId: Long('7584795846827311110') } }, operationTime: Timestamp({ t: 1765972900, i: 9 })}