Kubernetes 외부에서 멀티 cluster 리소스에 연결하기
다음 절차에서는 Kubernetes cluster 외부에서 Kubernetes에 배포된 MongoDBMultiCluster
리소스에 연결하는 방법을 설명합니다.
전제 조건
호환되는 MongoDB 버전
MongoDB 4.2.3 이상을 실행하는 데이터베이스를 사용하면 Kubernetes cluster 외부에서 데이터베이스에 액세스할 수 있습니다.
고려 사항
준비성 프로브 재정의 구성
Kubernetes 연산자가 배포한 MongoDB 사용자 지정 리소스에 대한 외부 액세스가 필요한 사용자 지정 서비스를 생성하고 Kubernetes에서 준비 프로브를 사용하는 경우, Kubernetes의 publishNotReadyAddresses
설정을 true
로 설정합니다.
publishNotReadyAddresses
설정은 이 서비스의 엔드포인트와 상호 작용하는 에이전트 가 서비스의 준비된 를 무시해야 함을 나타냅니다. 상태. 를 publishNotReadyAddresses
로 true
설정하면 서비스를 호스팅하는 파드에 대해 구성된 준비성 프로브의 동작이 재정의됩니다.
기본적으로 publishNotReadyAddresses
설정은 false
로 설정되어 있습니다. 이 경우, Kubernetes 오퍼레이터에서 MongoDB 커스텀 리소스를 호스팅하는 Pods가 Cloud Manager 또는 Ops Manager에 대한 연결을 잃을 경우 해당 Pods에 대해 구성된 준비성 프로브가 실패합니다. 그러나 publishNotReadyAddresses
설정을 true
으로 설정하면 다음과 같은 상황이 발생합니다:
Kubernetes는 준비성 프로브가 실패한 서비스를 종료하지 않습니다.
Kubernetes는 이러한 엔드포인트에 대한 서비스를 호스팅하는 파드에 대한 프로브가 준비되지 않았다고 표시하더라도 모든 엔드포인트를 준비된 것으로 간주합니다.
MongoDB 사용자 지정 리소스는 읽기 및 쓰기 작업에 계속 사용할 수 있습니다.
절차
Kubernetes cluster 외부에서 MongoDBMultiCluster
리소스를 사용하여 Kubernetes 연산자 배포 복제본 세트에 연결하려면 다음을 수행합니다.
다중 Kubernetes 클러스터 복제본 세트를 배포합니다 .
TLS로 멀티 Kubernetes 클러스터를 보호하세요.
다음에 대한 값을 제공합니다.
의 사용자 지정 CA
spec.security.tls.ca
인증서.
MongoDB 파드에 대한 외부 서비스를 생성합니다.
외부 리소스에서 다중 Kubernetes cluster 배포에 연결하려면 spec.externalAccess 를 구성합니다. 설정:
externalAccess: {}
이 설정은 Kubernetes Operator가 외부 LoadBalancer 를 생성하도록 지시합니다. 멀티 Kubernetes cluster 배포에서 MongoDB Pods에 대한 서비스를 제공합니다. 외부 서비스는 외부 연결을 위한 진입점을 제공합니다. 값 없이 이 설정을 추가하면 다음 기본값을 사용하여 외부 서비스가 생성됩니다.
필드 | 값 | 설명 |
---|---|---|
Name | <pod-name>-svc-external | 외부 서비스의 이름입니다. 이 값은 변경할 수 없습니다. |
Type | LoadBalancer | 외부 LoadBalancer 서비스를 생성합니다. |
Port | <Port Number> | mongod 에 대한 포트입니다. |
publishNotReadyAddress | true | DNS 레코드 가 파드가 준비되지 않은 경우에도 생성됩니다. 데이터베이스 Pod에 대해 false 로 설정하지 마세요. |
선택적으로 서비스에 값을 추가하거나 기본값을 재정의해야 하는 경우 다음을 지정합니다.
spec.externalAccess.externalService.annotations에 있는 클라우드 공급자와 관련된 주석
예를 들어, 다음 설정은 외부 서비스의 기본값을 재정의하여 다중 Kubernetes 클러스터 배포를 구성하여 NodePort 서비스 를 생성합니다. MongoDB Pods를 노출합니다.
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
선택 사항: cluster 멤버를 위한 외부 서비스를 구성합니다.
다른 cloud 공급자에서 멤버를 호스팅하는 경우와 같이 특정 cluster 멤버에 대한 설정을 구성해야 하는 경우 글로벌 spec.externalAccess 를 재정의할 수 있습니다. spec.clusterSpecList.externalAccess.externalService 를 사용하여 특정 멤버에 대한 설정 설정.
서비스에 값을 추가하거나 cluster 멤버의 기본값을 재정의하려면 다음을 지정합니다.
cluster 멤버에 대한 cloud 공급자와 관련된 주석( spec.clusterSpecList.externalAccess.externalService.annotations)입니다.
spec.clusterSpecList.externalAccess.externalService.spec에서 클러스터 멤버와 관련된 재정의.
예를 들어, 다음 파일은Kubernetes MongoDB 멀티 하는 로드 밸런서 서비스를Kubernetes MongoDB Kubernetes 생성합니다. 및 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"
외부 서비스를 확인합니다.
각 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 을 사용하여 외부 도메인의 트래픽을 라우팅할 수 있습니다.
복제본 세트 리소스 YAML 파일 을 업데이트합니다.
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: 6.0.0-ent"
복제본 세트에 대한 연결을 테스트합니다.
개발 환경에서 복제본 세트의 각 호스트에 대해 다음 명령을 실행합니다.
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]