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

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

이 페이지의 내용

  • 절차
  • Prepare Kubernetes clusters.
  • 각 Kubernetes 클러스터 에서 네임스페이스를 구성합니다.
  • Kubernetes Operator를 설치하고 구성합니다.
  • MongoDB 리소스 배포합니다.
  • 예시 세부 정보 및 고려 사항

멀티 클러스터 샤딩된 클러스터 배포서버 에서 리소스 간 연결을 용이하게 하기 위해 서비스 메시를 배포하는 것이 좋습니다. 그러나 서비스 메시 없이 멀티 클러스터 샤딩된 클러스터 배포서버 유지하려는 경우 이 가이드 에 따라 멀티 클러스터 리소스 간에 필요한 네트워킹을 구성할 수 있습니다.

서비스 메시 없이 여러 Kubernetes 클러스터에 대해 샤드 클러스터를 배포하려면 각 프로세스 외부에 노출하고 외부에서 사용 가능한 호스트 이름으로 자신을 식별하도록 구성해야 합니다. 각 호스트 이름에 대한 네트워킹이 올바르게 구성되어 있으면(즉, 특정 호스트 이름에서 연결할 때 트래픽이 특정 프로세스/pod로 라우팅됨) 다른 모든 MongoDB 프로세스 와 클라이언트는 클러스터 의 모든 프로세스에 연결할 수 있습니다. 클라이언트는 mongos 프로세스에만 연결하지만, 샤딩된 클러스터 배포서버 에서는 모든 프로세스가 샤딩된 클러스터 의 다른 모든 프로세스 에 연결할 수 있어야 하므로 다른 구성 요소를 노출해야 합니다.

1
2
  1. kubectl mongodb 플러그인을 사용하여 필요한 구성을 수행하는 것이 좋습니다(예: 다른 Kubernetes 클러스터에 대한 자격 증명 포함된 Kubernetes Operator의 RBAC, 서비스 계정 및 Kubernetes 시크릿)이 모든 클러스터에서 자동으로 업데이트됩니다. 자세한 학습 은 멀티 클러스터 샤드 클러스터 를 참조하세요.

3

멀티 클러스터 MongoDB Ops Manager 배포서버 가이드에서 이 병렬 절차 를 따를 수 있습니다.

4

다음 예시 와 같이 typetopologytype=ShardedClustertopology=MultiCluster로 구성합니다.

apiVersion: mongodb.com/v1
kind: MongoDB
metadata:
annotations:
mongodb.com/v1.architecture: non-static
name: mdb-sharded
namespace: ls
spec:
shardCount: 1
topology: MultiCluster
type: ShardedCluster
version: 8.0.4
credentials: my-credentials
opsManager:
configMapRef:
name: my-project
persistent: true
security:
authentication:
agents:
mode: X509
enabled: true
internalCluster: X509
modes:
- X509
certsSecretPrefix: prefix
tls:
ca: issuer-ca
enabled: true
externalAccess: {}
configSrv:
clusterSpecList:
- clusterName: kind-e2e-cluster-1
externalAccess:
externalDomain: kind-e2e-cluster-1.interconnected
externalService: {}
members: 1
- clusterName: kind-e2e-cluster-2
externalAccess:
externalDomain: kind-e2e-cluster-2.interconnected
externalService: {}
members: 1
- clusterName: kind-e2e-cluster-3
externalAccess:
externalDomain: kind-e2e-cluster-3.interconnected
externalService: {}
members: 1
mongos:
clusterSpecList:
- clusterName: kind-e2e-cluster-1
externalAccess:
externalDomain: kind-e2e-cluster-1.interconnected
externalService: {}
members: 1
- clusterName: kind-e2e-cluster-2
externalAccess:
externalDomain: kind-e2e-cluster-2.interconnected
externalService: {}
members: 1
- clusterName: kind-e2e-cluster-3
externalAccess:
externalDomain: kind-e2e-cluster-3.interconnected
externalService: {}
members: 1
shard:
clusterSpecList:
- clusterName: kind-e2e-cluster-1
externalAccess:
externalDomain: kind-e2e-cluster-1.interconnected
externalService: {}
members: 1
- clusterName: kind-e2e-cluster-2
externalAccess:
externalDomain: kind-e2e-cluster-2.interconnected
externalService: {}
members: 1
- clusterName: kind-e2e-cluster-3
externalAccess:
externalDomain: kind-e2e-cluster-3.interconnected
externalService: {}
members: 1

위의 예시 프로덕션 준비가 되지 않았습니다. 다음 세부 정보 및 고려 사항을 기록해 두세요.

  • 예시 의 도메인(kind-e2e-cluster-3.interconnected)은 인공적인 도메인이므로 외부에서 액세스할 수 있는 적절한 도메인으로 교체해야 합니다.

  • 구성은 TLS(TLS 없이 MongoDB 프로세스를 외부에 안전하게 노출할 수 없음) 및 x509 인증 사용합니다. 이는 필요에 따라 임의로 구성할 수 있습니다. 자세한 학습 은 해당 암호화인증 을 참조하세요.

  • 샤딩된 클러스터 의 TLS 인증서는 다음 구성 요소에 대해 발급되어야 합니다.

    • 각 샤드 복제본 세트

    • config 서버 복제본 세트

    • mongos

  • 각 TLS 인증서(TLS 유형의 -cert 시크릿, 수동으로 제공되거나 cert-manager에서 발급)는 Kubernetes Operator가 실행 Kubernetes 클러스터 에 제공되어야 합니다. 여기에서 Kubernetes Operator는 필요한 리소스(-cert-pem 시크릿 생성)를 다른 Kubernetes 클러스터에 자동으로 복제합니다.

  • 각 구성 요소의 각 TLS 인증서에는 해당 구성 요소의 복제본 세트 있는 모든 프로세스의 모든 호스트 이름이 포함되어야 합니다. 예시 를 들어, 첫 번째 샤드 (인덱스 0)에 대해 발급된 인증서에는 인증서의 SAN 필드 에 다음과 같은 호스트 이름이 있어야 합니다(배포된 각 클러스터 에 대해, 파드 이름은 규칙 mdb-sharded-<shardIdx>-<clusterIdx>-<podIdxInThisCluster>을 따릅니다).

    • mdb-sharded-0-0-0.kind-e2e-cluster-1.interconnected

    • mdb-sharded-0-1-0.kind-e2e-cluster-2.interconnected

    • mdb-sharded-0-2-0.kind-e2e-cluster-3.interconnected

  • 참고로 제공된 예시 사용하여 배포된 샤딩된 클러스터 의 모든 프로세스는 다음 호스트 이름으로 구성됩니다.

    mdb-sharded-0-0-0.kind-e2e-cluster-1.interconnected (shard-0)
    mdb-sharded-0-1-0.kind-e2e-cluster-2.interconnected (shard-0)
    mdb-sharded-0-2-0.kind-e2e-cluster-3.interconnected (shard-0)
    mdb-sharded-config-0-0.kind-e2e-cluster-1.interconnected (cs)
    mdb-sharded-config-1-0.kind-e2e-cluster-2.interconnected (cs)
    mdb-sharded-config-2-0.kind-e2e-cluster-3.interconnected (cs)
    mdb-sharded-mongos-0-0.kind-e2e-cluster-1.interconnected (mongos)
    mdb-sharded-mongos-1-0.kind-e2e-cluster-2.interconnected (mongos)
    mdb-sharded-mongos-2-0.kind-e2e-cluster-3.interconnected (mongos)
  • externalService: 는 기본값 객체 {}로 정의됩니다.

    즉, Kubernetes Operator는 기본값 을 사용하여 External Services(외부 트래픽 라우팅에 사용해야 하는 각 포드에 대해 생성된 서비스)를 생성합니다.

    • type: LoadBalancer

    • ports: 27017, 백업 목적의 경우 27018

  • Kubernetes 클러스터 의 클러스터 구성 및 로드 밸런서 컨트롤러에 따라 외부 서비스에 LoadBalancer 유형을 사용하면 샤딩된 클러스터의 각 프로세스에 대해 로드 밸런서 리소스가 프로비저닝 됩니다. 이로 인해 많은 수의 LoadBalancer 리소스가 할당될 수 있습니다. 최소 배포서버 (1 mongos, 3- 노드 config 서버 복제본 세트, 3의 1 샤드 - 노드 복제본 세트)에서 7 LoadBalancer 서비스를 생성합니다.

    생성되는 LoadBalancer 리소스 수를 최소화하려면 다음 예시 와 같이 ClusterIP 서비스를 사용하여 외부 액세스 구성하는 것이 좋습니다.

    - clusterName: kind-e2e-cluster-3
    externalAccess:
    externalDomain: kind-e2e-cluster-3.interconnected
    externalService:
    type: ClusterIP
  • 각 프로세스 (포드)에 하나의 연결된 ClusterIP 외부 서비스가 있는 경우, Kubernetes 클러스터 에 대한 하나의 외부 "진입 점 " 프록시 구성 요소를 생성해야 하며, 이는 임의의 프록시일 수 있습니다(예: HAProxy, Nginx)는 TLS 패스스루 라우팅을 지원합니다.

    • 프록시 구성 요소는 각 Kubernetes 클러스터 에 배포되어야 하며 각 클러스터 의 구성 요소에 대해 정의된 호스트 이름으로 외부에 노출되어야 합니다.

      • 위의 예시 에서 kind-e2e-cluster-3 에 정의된 각 구성 요소(mongos, config 서버, 샤드)는 externalDomain을 사용합니다: externalDomain: kind-e2e-cluster-3.interconnected

        즉, *.kind-e2e-cluster-3.interconnected에 대한 모든 연결을 수신하도록 프록시 구성 요소를 구성해야 합니다.

        각 연결은 예시 과 같은 명명 규칙 <pod-name>.<externalDomain>을 따르는 호스트 이름입니다.

        샤드 포드: mdb-sharded-0-2-0.kind-e2e-cluster-2.interconnected (mdb-sharded-<shardIdx>-<clusterIdx>-<podIdx>

    • 프록시 구성 요소는 모든 트래픽(포트 27017 또는 27018)이 해당 외부 서비스로 프록시되도록(트래픽을 다시 암호화하지 않고 TCP 수준에서) 구성해야 합니다.

      • 예시 를 들어 mdb-sharded-0-2-0-svc-external 의 경우 <pod-name>-mdb-sharded-0-2-0-svc-external에 전달된 <pod-name>.kind-e2e-cluster-2.interconnected 로 디스패치를 구성할 때 일반 규칙을 사용할 수 있습니다.

  • 예시 에 사용된 externalDomain 은(는) 인공적인 것입니다. 적절한 도메인 이름으로 바꿔야 합니다.

  • 연산자 필요한 모든 외부 서비스와 함께 Kubernetes 클러스터 전체에 모든 프로세스를 배포합니다.

  • 각 클러스터 의 각 외부 서비스는 정의된 외부 도메인에서 외부 트래픽을 수신해야 합니다. 네트워킹이 완전히 구성될 때까지는 클러스터 mongod 복제 되지 않습니다.

  • 외부 도메인을 사용하는 경우, 모든 네트워킹( 복제 및 MongoDB Agent 와 MongoDB 연결용)은 기본값 으로 외부 도메인을 통해 라우팅되므로 비효율적일 수 있습니다. 이를 개선하는 방법 중 하나는 동일한 Kubernetes 클러스터에 배포된 파드의 외부 호스트 이름이 외부 서비스의 클러스터 로컬 IP 주소 로 확인되도록 클러스터 내부의 네트워킹 또는 DNS 확인을 구성하는 것입니다.

돌아가기

샤딩된 클러스터