Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs Menu
Docs Home
/
엔터프라이즈 Kubernetes 운영자
/ /

서비스 메시가 없는 멀티 클러스터 복제본 세트

다중 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=mdb
export 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 리포지토리에서 찾을 수 있습니다.

1

다음 스크립트실행하여 인증서 발급자에 필요한 CA 인증서를 생성합니다.

1kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOF
2apiVersion: cert-manager.io/v1
3kind: Certificate
4metadata:
5 name: mdb-cert
6spec:
7 dnsNames:
8 - "*.${MDB_CLUSTER_0_EXTERNAL_DOMAIN}"
9 - "*.${MDB_CLUSTER_1_EXTERNAL_DOMAIN}"
10 - "*.${MDB_CLUSTER_2_EXTERNAL_DOMAIN}"
11 duration: 240h0m0s
12 issuerRef:
13 name: my-ca-issuer
14 kind: ClusterIssuer
15 renewBefore: 120h0m0s
16 secretName: cert-prefix-mdb-cert
17 usages:
18 - server auth
19 - client auth
20EOF
2

spec.credentials, spec.opsManager.configMapRef.name 를 설정합니다. 이는 Multi-Cluster MongoDB Ops Manager without a Service Mesh 절차에서 정의합니다. 보안 설정 을 정의하고 MongoDBMultiCluster 리소스 배포 .

1kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOF
2apiVersion: mongodb.com/v1
3kind: MongoDBMultiCluster
4metadata:
5 name: ${RS_RESOURCE_NAME}
6spec:
7 type: ReplicaSet
8 version: ${MONGODB_VERSION}
9 opsManager:
10 configMapRef:
11 name: mdb-org-project-config
12 credentials: mdb-org-owner-credentials
13 duplicateServiceObjects: false
14 persistent: true
15 backup:
16 mode: enabled
17 security:
18 certsSecretPrefix: cert-prefix
19 tls:
20 ca: ca-issuer
21 authentication:
22 enabled: true
23 modes: ["SCRAM"]
24 clusterSpecList:
25 - clusterName: ${K8S_CLUSTER_0_CONTEXT_NAME}
26 members: 2
27 externalAccess:
28 externalDomain: "${MDB_CLUSTER_0_EXTERNAL_DOMAIN}"
29 externalService:
30 annotations:
31 external-dns.alpha.kubernetes.io/hostname: "{podName}.${MDB_CLUSTER_0_EXTERNAL_DOMAIN}"
32 - clusterName: ${K8S_CLUSTER_1_CONTEXT_NAME}
33 members: 1
34 externalAccess:
35 externalDomain: "${MDB_CLUSTER_1_EXTERNAL_DOMAIN}"
36 externalService:
37 annotations:
38 external-dns.alpha.kubernetes.io/hostname: "{podName}.${MDB_CLUSTER_1_EXTERNAL_DOMAIN}"
39 - clusterName: ${K8S_CLUSTER_2_CONTEXT_NAME}
40 members: 2
41 externalAccess:
42 externalDomain: "${MDB_CLUSTER_2_EXTERNAL_DOMAIN}"
43 externalService:
44 annotations:
45 external-dns.alpha.kubernetes.io/hostname: "{podName}.${MDB_CLUSTER_2_EXTERNAL_DOMAIN}"
46EOF
3

다음 명령을 실행하여 MongoDBMultiCluster 리소스 실행 중인지 확인합니다.

1echo; echo "Waiting for MongoDB to reach Running phase..."
2kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" wait --for=jsonpath='{.status.phase}'=Running "mdbmc/${RS_RESOURCE_NAME}" --timeout=900s
3echo; echo "Pods running in cluster ${K8S_CLUSTER_0_CONTEXT_NAME}"
4kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get pods
5echo; echo "Pods running in cluster ${K8S_CLUSTER_1_CONTEXT_NAME}"
6kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get pods
7echo; echo "Pods running in cluster ${K8S_CLUSTER_2_CONTEXT_NAME}"
8kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get pods
4

다음 명령을 실행하여 MongoDB 사용자와 비밀번호를 생성합니다. 배포서버에 강력한 비밀번호를 사용하세요.

1kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOF
2apiVersion: v1
3kind: Secret
4metadata:
5 name: rs-user-password
6type: Opaque
7stringData:
8 password: password
9---
10apiVersion: mongodb.com/v1
11kind: MongoDBUser
12metadata:
13 name: rs-user
14spec:
15 passwordSecretKeyRef:
16 name: rs-user-password
17 key: password
18 username: "rs-user"
19 db: "admin"
20 mongodbResourceRef:
21 name: ${RS_RESOURCE_NAME}
22 roles:
23 - db: "admin"
24 name: "root"
25EOF
26
27kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" wait --for=jsonpath='{.status.phase}'=Updated -n "${MDB_NAMESPACE}" mdbu/rs-user --timeout=300s
5

mongosh 다음 명령을 실행하여 실행 MongoDB 인스턴스 에 액세스 할 수 있는지 확인합니다.

1external_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}")"
2
3mkdir -p certs
4kubectl get --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" cm/ca-issuer -o=jsonpath='{.data.ca-pem}' > certs/ca.crt
5
6mongosh --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: 1743589744, i: 1 }),
signature: {
hash: Binary.createFromBase64('fiBrPX9aaxTmMmLb1K2q6d4/XfQ=', 0),
keyId: Long('7488660369775263749')
}
},
operationTime: Timestamp({ t: 1743589744, i: 1 })
}

돌아가기

멀티 클러스터 MongoDB Ops Manager

이 페이지의 내용