다중 Kubernetes 클러스터 MongoDB 배포를 사용하면 여러 지리적 리전에 걸쳐 있는 글로벌 클러스터에 MongoDB 인스턴스를 추가하여 데이터의 가용성과 글로벌 배포를 높일 수 있습니다.
전제 조건
다음 절차를 시작하기 전에 다음 조치를 수행하세요.
kubectl설치.Mongosh설치
GKE 클러스터 절차 또는 이에 상응하는 절차를 완료합니다.
외부 DNS 절차 또는 이에 상응하는 절차를 완료합니다.
TLS 인증서 절차 또는 이에 상응하는 절차를 완료합니다.
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}# ${CUSTOM_DOMAIN}
export RS_RESOURCE_NAME=mdbexport MONGODB_VERSION="8.0.5-ent"
export MDB_CLUSTER_0_EXTERNAL_DOMAIN="${K8S_CLUSTER_0}.${CUSTOM_DOMAIN}"export MDB_CLUSTER_1_EXTERNAL_DOMAIN="${K8S_CLUSTER_1}.${CUSTOM_DOMAIN}"export MDB_CLUSTER_2_EXTERNAL_DOMAIN="${K8S_CLUSTER_2}.${CUSTOM_DOMAIN}"소스 코드
포함된 모든 소스 코드 MongoDB Kubernetes Operator 리포지토리 에서 찾을 수 있습니다.
절차
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_CLUSTER_0_EXTERNAL_DOMAIN}" - "*.${MDB_CLUSTER_1_EXTERNAL_DOMAIN}" - "*.${MDB_CLUSTER_2_EXTERNAL_DOMAIN}" duration: 240h0m0s issuerRef: name: my-ca-issuer kind: ClusterIssuer renewBefore: 120h0m0s secretName: cert-prefix-mdb-cert usages: - server auth - client authEOFMongoDBMultiCluster 리소스 를 배포합니다.
spec.credentials, spec.opsManager.configMapRef.name 를 설정합니다. 이는 Multi-Cluster MongoDB Ops Manager without a Service Mesh 절차에서 정의합니다. 보안 설정 을 정의하고 MongoDBMultiCluster 리소스 배포 .
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 security: certsSecretPrefix: cert-prefix tls: ca: ca-issuer authentication: enabled: true modes: ["SCRAM"] clusterSpecList: - clusterName: ${K8S_CLUSTER_0_CONTEXT_NAME} members: 2 externalAccess: externalDomain: "${MDB_CLUSTER_0_EXTERNAL_DOMAIN}" externalService: annotations: external-dns.alpha.kubernetes.io/hostname: "{podName}.${MDB_CLUSTER_0_EXTERNAL_DOMAIN}" - clusterName: ${K8S_CLUSTER_1_CONTEXT_NAME} members: 1 externalAccess: externalDomain: "${MDB_CLUSTER_1_EXTERNAL_DOMAIN}" externalService: annotations: external-dns.alpha.kubernetes.io/hostname: "{podName}.${MDB_CLUSTER_1_EXTERNAL_DOMAIN}" - clusterName: ${K8S_CLUSTER_2_CONTEXT_NAME} members: 2 externalAccess: externalDomain: "${MDB_CLUSTER_2_EXTERNAL_DOMAIN}" externalService: annotations: external-dns.alpha.kubernetes.io/hostname: "{podName}.${MDB_CLUSTER_2_EXTERNAL_DOMAIN}"EOFMongoDBMultiCluster 리소스 실행 중인지 확인합니다.
다음 명령을 실행하여 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: 1760521386, i: 1 }), signature: { hash: Binary.createFromBase64('nCxvHqL7u+BPXpaCj480Z3H0Ilk=', 0), keyId: Long('7561381759598723078') } }, operationTime: Timestamp({ t: 1760521386, i: 1 })}