문서 메뉴

문서 홈MongoDB Enterprise Kubernetes 연산자

Kubernetes 외부에서 멀티 cluster 리소스에 연결하기

이 페이지의 내용

  • 전제 조건
  • 고려 사항
  • 절차

다음 절차에서는 Kubernetes cluster 외부에서 Kubernetes에 배포된 MongoDBMultiCluster 리소스에 연결하는 방법을 설명합니다.

MongoDB 4.2.3 이상을 실행하는 데이터베이스를 사용하면 Kubernetes cluster 외부에서 데이터베이스에 액세스할 수 있습니다.

Kubernetes 연산자가 배포한 MongoDB 사용자 지정 리소스에 대한 외부 액세스가 필요한 사용자 지정 서비스를 생성하고 Kubernetes에서 준비 프로브를 사용하는 경우, Kubernetes의 publishNotReadyAddresses 설정을 true로 설정합니다.

publishNotReadyAddresses 설정은 이 서비스의 엔드포인트와 상호 작용하는 에이전트가 서비스의 준비 상태를 무시해야 함을 나타냅니다. publishNotReadyAddressestrue로 설정하면 서비스를 호스팅하는 파드에 대해 구성된 준비성 프로브의 동작이 재정의됩니다.

기본적으로 publishNotReadyAddresses 설정은 false로 설정되어 있습니다. 이 경우, Kubernetes 오퍼레이터에서 MongoDB 커스텀 리소스를 호스팅하는 Pods가 Cloud Manager 또는 Ops Manager에 대한 연결을 잃을 경우 해당 Pods에 대해 구성된 준비성 프로브가 실패합니다. 그러나 publishNotReadyAddresses 설정을 true으로 설정하면 다음과 같은 상황이 발생합니다:

  • Kubernetes는 준비성 프로브가 실패한 서비스를 종료하지 않습니다.

  • Kubernetes는 이러한 엔드포인트에 대한 서비스를 호스팅하는 파드에 대한 프로브가 준비되지 않았다고 표시하더라도 모든 엔드포인트를 준비된 것으로 간주합니다.

  • MongoDB 사용자 지정 리소스는 읽기 및 쓰기 작업에 계속 사용할 수 있습니다.

다음도 참조하세요.

Kubernetes cluster 외부에서 MongoDBMultiCluster 리소스를 사용하여 Kubernetes 연산자 배포 복제본 세트에 연결하려면 다음을 수행합니다.

1
2

다음에 대한 값을 제공합니다.

  • TLS spec.security.certsSecretPrefix시크릿입니다.

  • 의 사용자 지정 CA spec.security.tls.ca인증서.

3

외부 리소스에서 다중 Kubernetes cluster 배포에 연결하려면 spec.externalAccess 를 구성합니다. 설정:

externalAccess: {}

이 설정은 Kubernetes 연산자가 외부 로드 밸런서를 생성하도록 지시합니다. 멀티-Kubernetes cluster 배포에서 MongoDB Pods에 대한 서비스를 제공합니다. 외부 서비스는 외부 연결을 위한 진입점을 제공합니다. 값 없이 이 설정을 추가하면 다음 기본값을 사용하여 외부 서비스가 생성됩니다.

필드
설명
Name
<pod-name>-svc-external
외부 서비스의 이름입니다. 이 값은 변경할 수 없습니다.
Type
LoadBalancer
외부 LoadBalancer 서비스를 생성합니다.
Port
<Port Number>
mongod의 포트입니다.
publishNotReadyAddress
true
Pod가 준비되지 않은 경우에도 DNS 레코드가 생성되도록 지정합니다. 모든 데이터베이스 Pod에 대해 이를 false로 설정하지 마세요.

선택적으로 서비스에 값을 추가하거나 기본값을 재정의해야 하는 경우 다음을 지정합니다.

예를 들어, 다음 설정은 NodePort 서비스 를 생성하도록 다중 Kubernetes 클러스터 배포를 구성하기 위해 외부 서비스의 기본값을 재정의합니다. MongoDB Pod를 노출합니다.

externalAccess:
externalService:
annotations:
# cloud-specific annotations for the service
spec:
type: NodePort # default is LoadBalancer
port: 27017
# you can specify other spec overrides if necessary

자세한 내용은 Kubernetes 문서에서 주석서비스스펙을 참조하세요.

4

다른 cloud 공급자에서 멤버를 호스팅하는 경우와 같이 특정 cluster 멤버에 대한 설정을 구성해야 하는 경우 글로벌 spec.externalAccess 를 재정의할 수 있습니다. spec.clusterSpecList.externalAccess.externalService 를 사용하여 특정 멤버에 대한 설정 설정.

서비스에 값을 추가하거나 cluster 멤버의 기본값을 재정의하려면 다음을 지정합니다.

예를 들어, 다음 파일은 GKE(Google Kubernetes Engine) 에 배포된 cluster 멤버에 대해 다중 Kubernetes cluster 배포를 노출하는 로드 balancer 서비스를 생성하기 위해 다중 Kubernetes cluster 배포를 구성합니다. 및 Amazon Web Services EKS.

참고

다음 예제에서는 재정의를 구성하지 않으므로 외부 서비스는 spec.externalAccess 의 기본값을 사용합니다. 설정.

clusterSpecList:
- clusterName: gke-cluster-0.mongokubernetes.com
members: 2
externalAccess:
externalService:
annotations:
"cloud.google.com/l4-rbs": "enabled"
- clusterName: eks-cluster-1.mongokubernetes.com
members: 2
externalAccess:
externalService:
annotations:
"service.beta.kubernetes.io/aws-load-balancer-type": "external",
"service.beta.kubernetes.io/aws-load-balancer-nlb-target-type": "instance",
"service.beta.kubernetes.io/aws-load-balancer-scheme": "internet-facing"
5

각 외부 DNS 이름을 인증서 SAN 에 추가합니다.

6

각 cluster에서 다음 명령을 실행하여 Kubernetes Operator가 배포서버를 위한 외부 서비스를 생성했는지 확인합니다.

$ kubectl get services

이 명령은 다음 출력과 유사한 서비스 목록을 반환합니다. cluster의 각 데이터베이스 Pod에 대해 Kubernetes Operator는 <pod-name>-<cluster-idx>-<pod-idx>-svc-external이라는 외부 서비스를 만듭니다. 이 서비스는 외부 서비스 사양에서 제공하는 값 및 재정의에 따라 구성됩니다.

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
<my-replica-set>-0-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s

cluster 구성 또는 클라우드 공급자에 따라 LoadBalancer 서비스의 IP 주소는 외부에서 액세스할 수 있는 IP 주소 또는 FQDN 입니다. IP 주소 또는 FQDN 을 사용하여 외부 도메인의 트래픽을 라우팅할 수 있습니다.

7

spec.connectivity.replicaSetHorizons 의 호스트 이름과 포트를 이전 단계에서 생성한 외부 서비스 값으로 설정합니다.

올바른 외부 호스트 이름을 지정했는지 확인합니다. 외부 호스트 이름은 Kubernetes 작업자 노드의 DNS 이름과 일치해야 합니다. 이것들은 Kubernetes cluster의 모든 노드가 될 수 있습니다. 파드가 다른 노드에서 실행되는 경우, Kubernetes 노드는 내부 라우팅을 사용합니다.

apiVersion: mongodb.com/v1
kind: MongoDBMultiCluster
metadata:
name: multi-cluster-replica-set
namespace: mongodb
spec:
clusterSpecList:
- clusterName: e2e.cluster1.example.com
members: 1
- clusterName: e2e.cluster2.example.com
members: 1
- clusterName: e2e.cluster3.example.com
members: 1
connectivity:
replicaSetHorizons:
- sample-horizon: web1.example.com:30907
- sample-horizon: web2.example.com:30907
- sample-horizon: web3.example.com:30907
credentials: my-credentials
duplicateServiceObjects: false
opsManager:
configMapRef:
name: my-project
persistent: true
security:
certsSecretPrefix: clustercert
tls:
ca: ca-issuer
type: ReplicaSet
version: 4.4.0-ent"
8

각 클러스터에서 다음 명령을 실행하여 업데이트된 복제본 세트 파일을 적용합니다.

$ Kubectl apply -f <file_name.yaml>
9

개발 환경에서 복제본 세트의 각 호스트에 대해 다음 명령을 실행합니다.

mongosh --host <my-replica-set>/web1.example.com \
--port 30907
--ssl \
--sslAllowInvalidCertificates

참고

프로덕션 환경에서는 --sslAllowInvalidCertificates 플래그를 사용하지 마세요.

프로덕션 환경에서는 복제본 세트의 각 호스트에 대해 클라이언트 도구 또는 애플리케이션에 안전하게 연결할 수 있도록 TLS 인증서와 CA 를 지정합니다.

mongosh --host <my-replica-set>/web1.example.com \
--port 30907 \
--tls \
--tlsCertificateKeyFile server.pem \
--tlsCAFile ca-pem

연결에 성공하면 다음과 같은 내용이 표시됩니다.

Enterprise <my-replica-set> [primary]
←  MongoDB 다중 Kubernetes 클러스터 리소스에 연결재해 복구 →

이 페이지의 내용