Docs Menu
Docs Home
/
엔터프라이즈 Kubernetes 운영자
/ /

서비스 메시가 없는 멀티 클러스터 샤드 클러스터

이 페이지의 내용

  • 전제 조건
  • 소스 코드
  • 절차

여러 Kubernetes 클러스터에 MongoDB Sharded Clusters를 배포할 수 있습니다. 멀티 클러스터 기능을 사용하면 다음을 수행할 수 있습니다.

  • 각각 다른 지리적 리전 에 있는 여러 Kubernetes 클러스터에 배포하여 배포서버 의 회복 탄력성 개선합니다.

  • 해당 데이터에 의존하는 애플리케이션 또는 클라이언트에 더 가까운 다양한 Kubernetes 클러스터에 지정된 샤드의 프라이머리 노드를 배포하여 지리적 샤딩 위한 배포서버 구성하고 지연 시간 줄입니다.

  • 성능 향상을 위해 배포서버 조정합니다. 예시 를 들어, 다른 Kubernetes 클러스터의 모든 또는 지정된 샤드에 대해 또는 사용자 지정된 리소스 할당을 사용하여 읽기 전용 분석 노드를 배포 할 수 있습니다.

다음 절차를 시작하기 전에 다음 조치를 수행하세요.

  • 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}
export SC_RESOURCE_NAME=mdb-sh
export MONGODB_VERSION="8.0.5-ent"

포함된 모든 소스 코드 MongoDB Kubernetes Operator 리포지토리에서 찾을 수 있습니다.

1

다음 명령을 실행하여 각 샤드, mongos 및 config 서버에 필요한 TLS 인증서를 생성합니다.

kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOF
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: mdb-sh-cert
spec:
dnsNames:
- "*.${MDB_NAMESPACE}.svc.cluster.local"
duration: 240h0m0s
issuerRef:
name: my-ca-issuer
kind: ClusterIssuer
renewBefore: 120h0m0s
secretName: cert-prefix-mdb-sh-cert
usages:
- server auth
- client auth
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: mdb-sh-0-cert
spec:
dnsNames:
- "*.${MDB_NAMESPACE}.svc.cluster.local"
duration: 240h0m0s
issuerRef:
name: my-ca-issuer
kind: ClusterIssuer
renewBefore: 120h0m0s
secretName: cert-prefix-mdb-sh-0-cert
usages:
- server auth
- client auth
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: mdb-sh-1-cert
spec:
dnsNames:
- "*.${MDB_NAMESPACE}.svc.cluster.local"
duration: 240h0m0s
issuerRef:
name: my-ca-issuer
kind: ClusterIssuer
renewBefore: 120h0m0s
secretName: cert-prefix-mdb-sh-1-cert
usages:
- server auth
- client auth
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: mdb-sh-2-cert
spec:
dnsNames:
- "*.${MDB_NAMESPACE}.svc.cluster.local"
duration: 240h0m0s
issuerRef:
name: my-ca-issuer
kind: ClusterIssuer
renewBefore: 120h0m0s
secretName: cert-prefix-mdb-sh-2-cert
usages:
- server auth
- client auth
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: mdb-sh-config-cert
spec:
dnsNames:
- "*.${MDB_NAMESPACE}.svc.cluster.local"
duration: 240h0m0s
issuerRef:
name: my-ca-issuer
kind: ClusterIssuer
renewBefore: 120h0m0s
secretName: cert-prefix-mdb-sh-config-cert
usages:
- server auth
- client auth
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: mdb-sh-mongos-cert
spec:
dnsNames:
- "*.${MDB_NAMESPACE}.svc.cluster.local"
duration: 240h0m0s
issuerRef:
name: my-ca-issuer
kind: ClusterIssuer
renewBefore: 120h0m0s
secretName: cert-prefix-mdb-sh-mongos-cert
usages:
- server auth
- client auth
EOF
2

다음 명령을 실행하여 사용자 지정 리소스를 배포 .

kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOF
apiVersion: mongodb.com/v1
kind: MongoDB
metadata:
name: ${SC_RESOURCE_NAME}
spec:
shardCount: 3
# we don't specify mongodsPerShardCount, mongosCount and configServerCount as they don't make sense for multi-cluster
topology: MultiCluster
type: ShardedCluster
version: ${MONGODB_VERSION}
opsManager:
configMapRef:
name: mdb-org-project-config
credentials: mdb-org-owner-credentials
persistent: true
backup:
mode: enabled
externalAccess: {}
security:
certsSecretPrefix: cert-prefix
tls:
ca: ca-issuer
authentication:
enabled: true
modes: ["SCRAM"]
mongos:
clusterSpecList:
- clusterName: ${K8S_CLUSTER_0_CONTEXT_NAME}
members: 2
configSrv:
clusterSpecList:
- clusterName: ${K8S_CLUSTER_0_CONTEXT_NAME}
members: 3 # config server will have 3 members in main cluster
- clusterName: ${K8S_CLUSTER_1_CONTEXT_NAME}
members: 1 # config server will have additional non-voting, read-only member in this cluster
memberConfig:
- votes: 0
priority: "0"
shard:
clusterSpecList:
- clusterName: ${K8S_CLUSTER_0_CONTEXT_NAME}
members: 3 # each shard will have 3 members in this cluster
- clusterName: ${K8S_CLUSTER_1_CONTEXT_NAME}
members: 1 # each shard will have additional non-voting, read-only member in this cluster
memberConfig:
- votes: 0
priority: "0"
EOF
3

다음 명령을 실행하여 모든 리소스가 실행 확인합니다.

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 "mdb/${SC_RESOURCE_NAME}" --timeout=900s
echo; echo "Pods running in cluster ${K8S_CLUSTER_0_CONTEXT_NAME}"
kubectl --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get pods
echo; echo "Pods running in cluster ${K8S_CLUSTER_1_CONTEXT_NAME}"
kubectl --context "${K8S_CLUSTER_1_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get pods
echo; echo "Pods running in cluster ${K8S_CLUSTER_2_CONTEXT_NAME}"
kubectl --context "${K8S_CLUSTER_2_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" get pods
4

다음 명령을 실행하여 샤딩된 클러스터 에 사용자 및 자격 증명 생성합니다.

kubectl apply --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: sc-user-password
type: Opaque
stringData:
password: password
---
apiVersion: mongodb.com/v1
kind: MongoDBUser
metadata:
name: sc-user
spec:
passwordSecretKeyRef:
name: sc-user-password
key: password
username: "sc-user"
db: "admin"
mongodbResourceRef:
name: ${SC_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/sc-user --timeout=300s
5

다음 명령을 실행하여 샤딩된 클러스터 의 MongoDB 리소스 에 액세스할 수 있는지 확인합니다.

external_ip="$(kubectl get --context "${K8S_CLUSTER_0_CONTEXT_NAME}" -n "${MDB_NAMESPACE}" svc "${SC_RESOURCE_NAME}-mongos-0-0-svc-external" -o=jsonpath="{.status.loadBalancer.ingress[0].ip}")"
mkdir -p certs
kubectl 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 sc-user --password password --tls --tlsCAFile certs/ca.crt --tlsAllowInvalidHostnames --eval "db.runCommand({connectionStatus : 1})"
{
authInfo: {
authenticatedUsers: [ { user: 'sc-user', db: 'admin' } ],
authenticatedUserRoles: [ { role: 'root', db: 'admin' } ]
},
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1741702735, i: 1 }),
signature: {
hash: Binary.createFromBase64('kVqqNDHTI1zxYrPsU0QaYqyksJA=', 0),
keyId: Long('7480555706358169606')
}
},
operationTime: Timestamp({ t: 1741702735, i: 1 })
}

돌아가기

멀티 클러스터 복제본 세트

이 페이지의 내용