이 절차는 Ops Manager 또는 Cloud Manager가 managed하는 모든 복제본 세트를 일반 MongoDB 복제를 사용하여 Kubernetes 연산자 하의 Kubernetes로 마이그레이션합니다. 여기에는 가상 머신이나 베어 메탈에서 실행되는 배포서버와 다른 Kubernetes 연산자 인스턴스에서 이미 managed하는 배포서버가 포함됩니다. 마이그레이션은 실시간으로 점진적으로 수행됩니다. 복제본 세트를 Kubernetes로 확장하고, Kubernetes 노드를 승격한 다음, 외부 노드를 정리합니다. 스냅샷 복원 및 mongosync이(가) 포함되지 않습니다.
시작하기 전에
복제본 세트를 마이그레이션하기 전에 다음 사항을 확인하세요.
Ops Manager 또는 Cloud Manager 연결
ConfigMap이baseUrl,orgId및projectName키를 사용합니다.키
publicKey및privateKey를 가진 API 키Secret입니다.Kubernetes 연산자
ServiceAccount는 가상 실행 연결 작업을 위해batch/jobs권한(create,get,list,watch및delete)을 가집니다.프로젝트는 정확히 하나의 배포서버를 포함합니다.
다음도 필요합니다:
MongoDB Ops Manager 또는 Cloud Manager가 관리하는 기존 복제본 세트입니다.
MongoDB Ops Manager 또는 Cloud Manager 프로젝트에 정확히 하나의 배포서버가 있습니다.
Kubernetes 연산자가 설치된 Kubernetes 클러스터.
Kubernetes 연산자와 일치하는 버전의
kubectl mongodb플러그인. Kubernetes 연산자는 시험 실행을 포함하여 모든 조정 시 이 일치를 시행합니다.가상 머신 호스트와 Kubernetes Pod 간의 양방향 네트워크 연결 및 호스트 이름 확인.
배포서버가 TLS를 사용하는 경우 모든 SAN을 포함하는 사전 구성된 TLS 인증서.
SCRAM 사용자 비밀번호를 확보했습니다. 자동화 구성에서 이를 복구할 수는 없습니다.
시작하기 전에 수행된 백업입니다.
정상적이고 목표 상태에 도달한 배포서버입니다.
항상 최소 3 명의 투표 회원을 유지하세요. Kubernetes 연산자는 7 개 이상의 투표권을 가진 노드를 거부합니다. 7를 초과하는 경우, 투표권이 없는 Kubernetes 노드를 추가하거나 투표권이 있는 외부 노드를 제거합니다.
한 번에 한 가지 유형의 변경만 수행하십시오. Kubernetes 노드 추가, 외부 노드 정리, 또는 한 번에 하나의 노드에 대한 투표 및 우선 순위 변경만 수행하십시오. 마이그레이션이 시작되면 승인 유효성 검사가 혼합된 변경 사항을 거부하며, 마이그레이션 중간에 Kubernetes 노드를 제거하거나 외부 노드를 추가하는 것도 거부합니다.
배포가 목표 상태에 도달했을 때에만 작업하세요.
프라이머리 마지막에 마이그레이션하세요. 노드에 투표 및 우선 순위를 할당하면 투표가 trigger될 수 있으며, 복제본 세트가 새 프라이머리를 투표하는 동안 쓰기 (write)가 일시적으로 실패할 수 있습니다. 프라이머리를 마지막으로 마이그레이션하면 최종 단계까지 해당 투표를 트리거하는 것과 이로 인해 발생하는 쓰기 (write) 다운타임을 방지할 수 있습니다.
참고
Kubernetes에서 노드의 우선 순위를 높여 재투표를 trigger할 수도 있습니다.
spec.externalMembers이 비어 있지 않은 동안 Kubernetes 연산자는 노드 하나씩 확장을 강제합니다. 그러므로 각 변경은 각각 목표 상태를 기다리는 과정이 필요합니다.
절차
MongoDB 사용자 지정 리소스를 생성합니다.
kubectl mongodb migrate-to-mck mongodb 명령을 실행합니다.
kubectl mongodb migrate-to-mck mongodb \ --config-map-name <configmap> \ --secret-name <secret> \ --namespace <namespace> \ -o mongodb-cr.yaml생성된 파일을 검사합니다. 포함된 내용은 다음과 같습니다.
spec.externalMembers, 소스 프로세스를 나열합니다.spec.members0(으)로 설정합니다.mongodb.com/migration-dry-run: true주석(플러그인이 항상 추가함)
명령은 다음 선택 사항 플래그도 지원합니다.
--certs-secret-prefix: TLS가 활성화된 경우 필수입니다.spec.security.certsSecretPrefix을(를) 설정합니다.--prometheus-secret-name: Prometheus가 활성화된 경우 사용합니다.Secret은(는) 이미 존재해야 하며password키를 가지고 있어야 합니다.--resource-name-override: 생성된 리소스에metadata.name을 설정합니다. 플러그인은 유효한 Kubernetes 이름이 아닌 경우 복제본 세트 이름을 자동으로 정규화하고spec.replicaSetNameOverride을(를) 설정해 줍니다.
MongoDBUser 커스텀 리소스를 생성합니다.
데이터베이스 사용자를 마이그레이션하려는 경우에만 이 단계를 완료하세요. 마이그레이션에는 필요하지 않습니다.
각 SCRAM 사용자당 하나의 Secret을(를) 미리 생성하고, 각각 password 키를 할당합니다. 실행:
kubectl mongodb migrate-to-mck users \ --config-map-name <configmap> \ --secret-name <secret> \ --namespace <namespace> \ --users-secrets-file users.csv \ -o users-cr.yamlCSV 파일은 username:database,secret-name 형식으로 한 준에 하나씩 사용자를 Secrets에 매핑합니다. --users-secrets-file을 생략하면 각 사용자에 대해 프롬프트가 표시됩니다.
플러그인이 $external 데이터베이스에 대해 X.509 및 LDAP 사용자를 생성합니다. 자동화 에이전트 사용자를 생략합니다.
배포서버가 TLS를 사용하는 경우 Kubernetes 노드 인증서를 발급합니다.
가상 머신 인증서에 서명한 것과 동일한 인증 기관에서 Kubernetes 노드 인증서를 발급합니다.
Kubernetes 연산자는 <certsSecretPrefix>-<resourceName>-cert (이)라는 이름의 kubernetes.io/tls Secret 및 <resourceName>-ca (이)라는 이름의 CA ConfigMap에서 두 ca-pem 키와 mms-ca.crt 키를 모두 포함하는 것을 예상합니다. 인증서에는 Pod 별 및 Service DNS 이름을 포함하고 서버 인증 및 클라이언트 인증 사용 모둜를 포함하는 SAN이 필요합니다.
소스 배포서버가 TLS를 사용하지 않는 경우, 마이그레이션하기 전에 기존 가상 머신 배포서버의 MongoDB Ops Manager 또는 Cloud Manager에서 net.tls.mode을(를) disabled (으)로 설정하세요. 이 경우에는 MongoDB 커스텀 리소스에 아무것도 설정할 필요가 없습니다.
참고
CA 불일치는 다음 단계의 드라이 런에서 감지됩니다. 원래 그렇게 되도록 설계되어 있습니다.
외부 액세스 설정.
드라이 런을 실행하기 전에, spec.externalAccess을 구성하여 가상 노드가 Kubernetes Pod에 접근할 수 있도록 합니다. 노드가 호스트 이름으로 Pod를 해결하도록 하려면 spec.externalAccess.externalDomain도 설정할 수 있습니다. 관련된 필드 및 DNS 요구 사항에 대해 알아보려면 마이그레이션을 위한 네트워크 요구 사항을 참조하십시오.
이 설정은 사용자가 소유합니다. 사용자가 환경에 맞는 LoadBalancer 또는 NodePort와 DNS 기록을 구성합니다.
중요
이 배포서버에서 MongoDB Search 또는 Vector Search를 사용하는 경우 externalDomain을(를) 설정하지 마십시오. MongoDBSearch은(는) externalDomain을(를) 설정하는 MongoDB 리소스를 지원하지 않으며, 클러스터를 생성한 후에는 필드를 제거할 수 없습니다. 자세한 내용은 MongoDB Search와 마이그레이션 상호 작용을 참조하세요.
시험 실행을 실행하고 연결을 확인합니다.
mongodb.com/migration-dry-run 주석이 여전히 있는 상태에서 생성된 리소스를 적용합니다. 주석이 설정되어 있는 동안 Kubernetes Operator는 자동화 구성 변경을 수행하지 않고 연결만 확인합니다.
Kubernetes Operator는 <resourceName>-connectivity-check이라는 작업을 생성하여 모든 외부 노드에 연결하고 인증합니다. 작업은 ttlSecondsAfterFinished을 사용하여 스스로를 삭제하고 다음 조정 시 다시 생성되므로 유효성 검사가 자동으로 수행됩니다. Kubernetes 또는 MongoDB Ops Manager UI에서 문제를 해결하고 자유롭게 다시 실행할 수 있습니다.
드라이 런은 Kubernetes와 가상 머신 간의 연결성(DNS, TLS, 방화벽 및 노드 주소)과 자격 증명(local 데이터베이스의 __system 역할 포함), 그리고 TLS가 활성화된 경우 CA를 확인합니다. 가상 머신에서 Kubernetes로의 인바운드 연결은 확인하지 않습니다.
해당 방향은 전적으로 네트워킹 설정에 따라 달라지므로 단일 명령으로 보장할 수 없습니다. 대신 다음 체크리스트를 확인하세요.
<metadata.name>-0.<spec.externalAccess.externalDomain>패턴을 따르는 Kubernetes 노드의 호스트 이름을 가상 머신 노드에서 확인할 수 있는지 확인합니다.Kubernetes 노드 또는 LoadBalancer IP에 가상 머신에서 연결할 수 있는지 확인합니다.
status.conditions[type=NetworkConnectivityVerified] 에서 결과를 읽으세요:
검증기 작업 종료 코드 | 조건 상태 | 이유 | 의미 |
|---|---|---|---|
작업이 여전히 실행 중입니다. |
|
|
|
|
|
| 모든 외부 노드는 접근할 수 있고 인증됩니다. |
|
|
| 자격 증명, 인증 메커니즘 또는 누락된 |
|
|
| DNS, TLS, 시간 초과 또는 연결할 수 없는 노드. 작업 Pod 로그를 확인하세요. |
|
|
| 미분류 실패. 작업 Pod 로그를 확인하세요. |
작업 시작 전에 발생하는 오류는 OperatorImageUnknown, BuildStatefulSetOptions, AgentCertSecretFailed, AgentCertSubject 이유로 인해 발생합니다.
Kubernetes 연산자는 외부 노드가 남지 않으면 status.conditions에서 NetworkConnectivityVerified 조건을 완전히 제거합니다.
복제본 세트를 Kubernetes로 확장합니다.
dry-run 주석 제거:
kubectl annotate mdb <resourceName> \ mongodb.com/migration-dry-run-이 시점에서 Kubernetes Operator가 MongoDB Ops Manager 프로젝트에 대한 소유권을 갖게 됩니다.
spec.members을(를) 발생시키고 spec.memberConfig을(를) 함께 쓰기 (write)하세요.
경고
spec.memberConfig 설정 노드 수를 늘리기 전에
기본값으로 새 Kubernetes 노드는 투표 노드로 참여합니다. CRD 기본값은 votes: 1 및 priority: "1"입니다. 이 기본값을 사용하면 아직 동기화 중인 노드가 초기 동기화를 완료하기 전에 투표에 참여할 수 있습니다.
MongoDB에서는 노드 수를 증가시키기 전에 votes: 0 및 priority: "0"를 사용하여 새 Kubernetes 노드 하나당 하나의 spec.memberConfig 엔트리 쓰기 (write)를 하도록 권장합니다. 이렇게 하면 아직 동기화 중인 노드가 투표에서 이길 수 없습니다. votes은 정수입니다. priority은 string입니다.
예를 들어, 투표권이 없는 Kubernetes 노드 3개를 추가하려면 다음과 같이 합니다.
spec: memberConfig: - votes: 0 priority: "0" - votes: 0 priority: "0" - votes: 0 priority: "0"전체 초기 동기화 및 목표 상태를 기다립니다. 위의 선택 사항 단계에서 MongoDBUser 리소스를 생성한 경우, 지금 적용하고 각각 status.phase이(가) Updated에 도달하는지 확인하세요.
외부 노드를 정리합니다.
중요
spec.externalMembers에서 항목 하나만 한 번에 제거하십시오. 다음 엔트리를 제거핕기 전에 각 제거 후에 목표 상태를 기다립니다.
예를 들면 다음과 같습니다.
kubectl patch mdb <resourceName> --type=json \ -p='[{"op":"remove","path":"/spec/externalMembers/0"}]'마이그레이션이 시작되면 항목을 제거할 수 있지만 추가할 수는 없습니다.
status.conditions[type=Migrating].reason이(가) Extending, InProgress, Pruning을(를) 통해 이동하는 것을 지켜보세요:
이유 | 상태 | 의미 |
|---|---|---|
|
| dry-run 어노테이션이 설정되었습니다. |
|
| 원하는 Kubernetes 노드 수가 마지막으로 조정된 수보다 많습니다. |
|
|
|
|
| 외부 노드가 있지만 아무것도 변경되지 않습니다. 이것이 첫 번째 일치 시의 그러한 이유이기도 됩니다. |
|
| 모든 외부 노드가 제거되었습니다. |
우선순위는 Validating > Extending > Pruning > InProgress입니다. Kubernetes 측을 확장하는 프루는 Extending을 보고합니다. 이는 단일 변경을 수행해야 하는 또 다른 이유가 됩니다.
가지치기와 확장은 동시에 수행할 수 없습니다.
마이그레이션 완료를 스크립트로 작성하려면 status.phase을 폴링하는 대신 kubectl wait --for=condition=Migrating=False을 사용하세요.
연결 문자열 시크릿
Kubernetes Operator가 자동으로 자격 증명이 포함되지 않은 <metadata.name>-cluster-connection-string(이)라는 이름의 연결 문자열 Secret을 생성하고 활성 노드와 동기화됩니다. 연결 문자열을 하드 코딩하는 대신 애플리케이션을 이곳 Secret에 연결하세요.
마이그레이션 중 가용성
마이그레이션 동안 읽기 작업은 계속 접근 가능합니다. 투표 중에 쓰기(write)가 일시적으로 실패할 수 있으므로 드라이버는 재시도 가능 쓰기를 사용해야 합니다. 읽기 대상이 이동하면 읽기 지연 시간이 증가할 수 있습니다. 따라서 가상 마신과 동일한 리전에서 Kubernetes 클러스터를 실행합니다. 마이그레이션된 세컨더리에 대한 장기 실행 커서는 정지 모드가 없기 때문에 중단됩니다.