Kubernetes 외부에서 MongoDB 데이터베이스 리소스에 연결하기
다음 절차에서는 Kubernetes 클러스터 외부에서 Kubernetes에 배포된 MongoDB 리소스에 연결하는 방법을 설명합니다.
전제 조건
호환되는 MongoDB 버전
Kubernetes 외부에서 데이터베이스에 액세스하려면 MongoDB 4.2.3 이상을 실행해야 합니다.
고려 사항
준비성 프로브 재정의 구성
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 연산자에 내장된 구성 옵션을 사용하여 배포를 위한 외부 연결을 구성하는 프로세스를 안내합니다.
Kubernetes Operator가 Kubernetes cluster 외부에서 배포한 MongoDB 리소스에 연결하는 방법은 리소스에 따라 다릅니다.
Kubernetes 클러스터 외부에서 Kubernetes 연산자가 배포한 MongoDB 독립형 리소스에 연결하려면 다음 안내를 따르세요.
Kubernetes 연산자를 사용하여 독립형 리소스를 배포합니다.
독립형 리소스 를 배포하지 않은 경우 지침에 따라 리소스를 배포 합니다.
이 절차에서는 다음 예시를 사용합니다.
20 21 apiVersion: mongodb.com/v1 22 kind: MongoDB 23 metadata: 24 name: <my-standalone> 25 spec: 26 version: "4.2.2-ent" 27 opsManager: 28 configMapRef: 29 name: <configMap.metadata.name> 30 # Must match metadata.name in ConfigMap file 31 credentials: <mycredentials> 32 type: Standalone 33 ...
MongoDB Pod에 대한 외부 서비스를 생성합니다.
외부 리소스에서 독립형 리소스에 연결하려면 spec.externalAccess를 구성하세요. 설정:
externalAccess: {}
이 설정은 Kubernetes 연산자가 독립형 리소스에서 MongoDB Pod에 대한 외부 LoadBalancer 서비스를 생성하도록 지시합니다. 외부 서비스는 외부 연결을 위한 진입점을 제공합니다. 값 없이 이 설정을 추가하면 다음 기본값을 사용하여 외부 서비스가 생성됩니다.
필드 | 값 | 설명 |
---|---|---|
Name | <pod-name>-svc-external | 외부 서비스의 이름입니다. 이 값은 변경할 수 없습니다. |
Type | LoadBalancer | 외부 LoadBalancer 서비스를 생성합니다. |
Port | <Port Number> | mongod 에 대한 포트입니다. |
publishNotReadyAddress | true | DNS 레코드 가 파드가 준비되지 않은 경우에도 생성됩니다. 데이터베이스 Pod에 대해 false 로 설정하지 마세요. |
선택적으로 서비스에 값을 추가하거나 기본값을 재정의해야 하는 경우 다음을 지정합니다.
cloud 제공자 와 관련된 주석
spec.externalAccess.externalService.annotations
예를 들어, 다음 설정은 외부 서비스의 기본값을 재정의하여 독립형 리소스를 구성하여 MongoDB Pod를 노출하는 NodePort 서비스를 생성하도록 합니다.
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 Operator가 배포서버용 외부 서비스를 생성했는지 확인합니다.
kubectl get services
이 명령은 다음 출력과 유사한 서비스 목록을 반환합니다. 크럴스터의 각 데이터베이스 Pod에 대해 Kubernetes 연산자는 <pod-name>-0-svc-external이라는 외부 서비스를 만듭니다. 이 서비스는 외부 서비스 사양에서 제공하는 값 및 재정의에 따라 구성됩니다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE <my-standalone>-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s
클러스터 구성 또는 cloud 제공자 에 따라 LoadBalancer 서비스의 IP 주소 는 외부에서 액세스할 수 있는 IP 주소 또는 FQDN 입니다. IP 주소 또는 FQDN 을 사용하여 외부 도메인의 트래픽을 라우팅할 수 있습니다.
중요
이 절차에서는 외부 연결을 활성화하는 가장 간단한 방법을 설명합니다. 프로덕션에서 다른 유틸리티를 사용할 수 있습니다.
Kubernetes 클러스터 외부에서 Kubernetes Operator가 배포한 MongoDB 복제본 세트 리소스에 연결하려면 다음 안내를 따르세요.
Kubernetes Operator로 복제본 세트 를 배포합니다.
복제본 세트를 배포하지 않은 경우 지침에 따라 배포하세요.
설정에 spec.security.certsSecretPrefix
값을 제공하여 복제본 세트 에 대해 TLS 를 활성화 해야 합니다. 복제본 세트 spec.security.tls.ca
는 에 저장된 사용자 지정 CA 인증서를 사용해야 합니다.
MongoDB 파드에 대한 외부 서비스를 생성합니다.
외부 리소스 에서 복제본 세트 에 연결하려면 spec.externalAccess 를 구성합니다. 설정:
externalAccess: {}
이 설정은 Kubernetes Operator가 외부 LoadBalancer 를 생성하도록 지시합니다. 복제본 세트 의 MongoDB 파드에 대한 서비스입니다. 외부 서비스는 외부 연결을 위한 진입 점 을 제공합니다. 값 없이 이 설정을 추가하면 다음 기본값 을 사용하여 외부 서비스가 생성됩니다.
필드 | 값 | 설명 |
---|---|---|
Name | <pod-name>-svc-external | 외부 서비스의 이름입니다. 이 값은 변경할 수 없습니다. |
Type | LoadBalancer | 외부 LoadBalancer 서비스를 생성합니다. |
Port | <Port Number> | mongod 에 대한 포트입니다. |
publishNotReadyAddress | true | DNS 레코드 가 파드가 준비되지 않은 경우에도 생성됩니다. 데이터베이스 Pod에 대해 false 로 설정하지 마세요. |
선택적으로 서비스에 값을 추가하거나 기본값을 재정의해야 하는 경우 다음을 지정합니다.
cloud 제공자 와 관련된 주석
spec.externalAccess.externalService.annotations
예를 예시, 다음 설정은 외부 서비스의 기본값 을 재정의하여 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
TLS 인증서에 주체 대체이름을 추가합니다.
각 외부 DNS 이름을 인증서 SAN 에 추가합니다.
외부 서비스를 확인합니다.
복제본 세트 에서 다음 명령을 실행 하여 Kubernetes Operator가 배포서버 서버를 위한 외부 서비스를 생성했는지 확인합니다.
kubectl get services
이 명령은 다음 출력과 유사한 서비스 목록을 반환합니다. 클러스터 의 각 데이터베이스 Pod에 대해 Kubernetes Operator는 <pod-name>-<pod-idx>-svc-external라는 외부 서비스를 생성합니다. 이 서비스는 외부 서비스 사양에서 제공하는 값 및 재정의에 따라 구성됩니다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE <my-replica-set>-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s
cluster 구성 또는 클라우드 공급자에 따라 LoadBalancer 서비스의 IP 주소는 외부에서 액세스할 수 있는 IP 주소 또는 FQDN 입니다. IP 주소 또는 FQDN 을 사용하여 외부 도메인의 트래픽을 라우팅할 수 있습니다.
샘플 복제본 세트 리소스 를 복사합니다.
원하는 복제본 세트 구성과 일치하도록 이 YAML파일의 설정을 변경합니다.
1 2 apiVersion: mongodb.com/v1 3 kind: MongoDB 4 metadata: 5 name: <my-replica-set> 6 spec: 7 members: 3 8 version: "4.2.2-ent" 9 type: ReplicaSet 10 opsManager: 11 configMapRef: 12 name: <configMap.metadata.name> 13 credentials: <mycredentials> 14 persistent: true
15 security: 16 tls: 17 enabled: true 18 connectivity: 19 replicaSetHorizons: 20 - "example-website": "web1.example.com:30907" 21 - "example-website": "web2.example.com:32350" 22 - "example-website": "web3.example.com:31185" 23 ...
복사한 예시 섹션을 기존 복제본 세트 리소스 에 붙여넣습니다.
원하는 텍스트 편집기를 열고 객체 를 spec
붙여넣습니다. 섹션의 리소스 파일 끝에 있습니다.
강조 표시된 설정을 원하는 값으로 변경합니다.
키 | 유형 | 필요성 | 설명 | 예시 |
---|---|---|---|---|
spec.connectivity | 컬렉션 | 조건부 | Kubernetes 외부에서 데이터베이스에 액세스해야 하는 경우 이 매개변수와 값을 추가하세요. 이 설정을 사용하면 Kubernetes 클러스터 내와 Kubernetes 클러스터에 다양한 DNS 설정을 제공할 수 있습니다. Kubernetes Operator는 복제본 세트 멤버에 대해 분할 수평 DNS를 사용합니다. 이 기능을 사용하면 Kubernetes 클러스터 내부와 Kubernetes 외부 모두에서 통신할 수 있습니다. 호스트당 여러 개의 외부 매핑을 추가할 수 있습니다. 스플릿 호라이즌(Split Horizon) 요구 사항
| |
spec.security | 문자열 | 필수 사항 | MongoDB deployment의 TLS 인증서가 포함된 시크릿 이름의 <prefix> 을(를) 추가합니다. | devDb |
복제본 세트 리소스 에서 외부 호스트 이름 및 외부 서비스 값을 확인합니다.
spec.connectivity.replicaSetHorizons
설정의 외부 호스트 이름이 올바른지 확인하세요.
외부 호스트 이름은 Kubernetes 작업자 노드의 DNS 이름과 일치해야 합니다. 이는 Kubernetes 클러스터의 모든 노드가 될 수 있습니다. Kubernetes 노드는 파드가 다른 노드에서 실행되는 경우 내부 라우팅을 사용합니다.
spec.connectivity.replicaSetHorizons
의 포트를 외부 서비스 값으로 설정합니다.
예시
15 security: 16 tls: 17 enabled: true 18 connectivity: 19 replicaSetHorizons: 20 - "example-website": "web1.example.com:30907" 21 - "example-website": "web2.example.com:32350" 22 - "example-website": "web3.example.com:31185" 23 ...
복제본 세트 구성 파일 을 저장합니다.
복제본 세트 배포서버 를 업데이트하고 다시시작합니다.
임의의 디렉토리 에서 다음 Kubernetes 명령을 호출하여 복제본 세트를 업데이트 하고 다시 시작합니다.
kubectl apply -f <replica-set-conf>.yaml
복제본 세트에 대한 연결을 테스트합니다.
개발 환경에서 복제본 세트의 각 호스트에 대해 다음 명령을 실행합니다.
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]
Kubernetes 클러스터 외부에서 Kubernetes 연산자가 배포한 MongoDB 샤딩된 클러스터 리소스 에 연결하려면 다음을 수행합니다.
Kubernetes Operator로 샤딩된 클러스터 를 배포합니다.
샤드 클러스터를 배포하지 않은 경우 지침에 따라 샤딩된 클러스터 를 배포 합니다.
다음 설정을 구성하여 샤딩된 클러스터 에 대해 TLS 를 활성화 해야 합니다.
키 | 유형 | 필요성 | 설명 | 예시 |
---|---|---|---|---|
spec.security | 문자열 | 필수 사항 | MongoDB deployment의 TLS 인증서가 포함된 시크릿 이름의 <prefix> 을(를) 추가합니다. | devDb |
spec.security.tls | 컬렉션 | 옵션 | 이 배포의 각 포드에 대한 TLS 인증서에 추가해야 하는 모든 도메인의 목록입니다. 이 매개 변수를 설정하면 Kubernetes Operator가 TLS 인증서로 변환하는 모든 CSR에 <pod
name>.<additional cert domain> 형식의 SAN이 포함됩니다. | example.com |
파드에 대한 외부 mongos
서비스를 생성합니다.
외부 리소스 에서 샤딩된 클러스터 를 구성합니다. 설정:
externalAccess: {}
이 설정은 Kubernetes Operator가 외부 LoadBalancer 를 생성하도록 mongos
지시합니다. 샤딩된 클러스터 의 파드에 대한 서비스입니다. 외부 서비스는 외부 연결을 위한 진입 점 을 제공합니다. 값 없이 이 설정을 추가하면 다음 기본값 을 사용하여 외부 서비스가 생성됩니다.
필드 | 값 | 설명 |
---|---|---|
Name | <pod-name>-svc-external | 외부 서비스의 이름입니다. 이 값은 변경할 수 없습니다. |
Type | LoadBalancer | 외부 LoadBalancer 서비스를 생성합니다. |
Port | <Port Number> | mongod 에 대한 포트입니다. |
publishNotReadyAddress | true | DNS 레코드 가 파드가 준비되지 않은 경우에도 생성됩니다. 데이터베이스 Pod에 대해 false 로 설정하지 마세요. |
선택적으로 서비스에 값을 추가하거나 기본값을 재정의해야 하는 경우 다음을 지정합니다.
cloud 제공자 와 관련된 주석
spec.externalAccess.externalService.annotations
예를 예시, 다음 설정은 외부 서비스의 기본값 을 재정의하여 NodePort 서비스 를 생성하도록 샤딩된 클러스터 를 구성합니다.mongos
파드를 노출합니다.
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
TLS 인증서에 주체 대체이름을 추가합니다.
각 외부 DNS 이름을 인증서 SAN 에 추가합니다.
각 MongoDB 호스팅하다 는 다음 SAN을 사용합니다.
<my-sharded-cluster>-<shard>-<pod-index>.<external-domain> <my-sharded-cluster>-config-<pod-index>.<external-domain> <my-sharded-cluster>-mongos-<pod-index>.<external-domain>
mongos
인스턴스 는 다음 SAN 을 사용합니다.
<my-sharded-cluster>-mongos-<pod-index>-svc-external.<external-domain>
다음 예시 와 유사하게 spec.security.tls.additionalCertificateDomains
설정을 구성합니다. 사용하는 각 TLS 인증서에는 샤드, config 서버 또는 mongos
인스턴스 에 해당하는 SAN 이 포함되어야 합니다. Kubernetes Operator가 구성의 유효성을 검사합니다.
1 2 apiVersion: mongodb.com/v1 3 kind: MongoDB 4 metadata: 5 name: <my-sharded-cluster> 6 spec: 7 version: "4.2.2-ent" 8 opsManager: 9 configMapRef: 10 name: <configMap.metadata.name> 11 # Must match metadata.name in ConfigMap file 12 shardCount: 2 13 mongodsPerShardCount: 3 14 mongosCount: 2 15 configServerCount: 3 16 credentials: my-secret 17 type: ShardedCluster 18 externalAccess: {} 19 security: 20 tls: 21 certsSecretPrefix: <prefix> 22 additionalCertificateDomains: 23 - "<external-domain>" 24 ...
외부 서비스를 확인합니다.
샤딩된 클러스터 에서 다음 명령을 실행 하여 Kubernetes Operator가 배포서버 서버를 위한 외부 서비스를 생성했는지 확인합니다.
kubectl get services
이 명령은 다음 출력과 유사한 서비스 목록을 반환합니다. 클러스터 의 각 mongos
인스턴스 에 대해 Kubernetes Operator는 <pod-name>-<pod-idx>-svc-external
이라는 외부 서비스를 생성합니다. 이 서비스는 외부 서비스 사양에서 제공하는 값 및 재정의에 따라 구성됩니다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE <my-sharded-cluster>-mongos-0-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s <my-sharded-cluster>-mongos-1-svc-external LoadBalancer 10.102.27.116 <lb-ip-or-fqdn> 27017:27017/TCP 8m30s
클러스터 구성 또는 cloud 제공자 에 따라 LoadBalancer 서비스의 IP 주소 는 외부에서 액세스할 수 있는 IP 주소 또는 FQDN 입니다. IP 주소 또는 FQDN 을 사용하여 외부 도메인의 트래픽을 라우팅할 수 있습니다. 이 예시 에는 두 개의 mongos
인스턴스가 있으므로 Kubernetes Operator는 두 개의 외부 서비스를 생성합니다.
샤딩된 클러스터 에 대한 연결을 테스트합니다.
Kubernetes 클러스터 외부에서 배포서버 서버에 연결하려면 MongoDB Shell (mongosh
)을 사용하고 외부 도메인을 통해 노출한 mongos
인스턴스의 주소를 지정합니다.
예시
및 의 FQDN 이 있는 경우 <my-sharded-cluster>-mongos-0-svc-external.<external-domain>
<my-sharded-cluster>-mongos-1-svc-external.<external-domain>
MongoDB<my-sharded-cluster>- mongos-0<external-domain><my-sharded-cluster>1<external-domain>-svc-external., 다음 명령을 사용하여 Kubernetes 클러스터 외부에서 이 샤딩된 클러스터 인스턴스 에 연결할 수 있습니다.
mongosh ""