MongoDB Kubernetes 설치 수행하는 방법

쿠버네티스에서의 애플리케이션 배포는 특히 몽고디비와 같은 상태 유지 애플리케이션의 경우에는 어려울 수 있습니다. 배포를 어떻게 용이하게 할 수 있을까요? 몽고디비 쿠버네티스 오퍼레이터를 사용하여 쿠버네티스 클러스터 내에서 상태 유지 애플리케이션을 자동으로 배포하고 관리할 수 있습니다.

이 튜토리얼에서는 몽고디비 쿠버네티스 오퍼레이터를 사용하여 몽고디비를 쿠버네티스에 배포하는 방법을 배우게 됩니다.

계속해서 쿠버네티스 배포를 자동화해 보세요!

사전 준비 사항

이 튜토리얼은 실습을 위한 것입니다. 따라하기 위해 다음 요구 사항을 충족해야 합니다:

  • A Kubernetes cluster – This demo uses the Kubernetes cluster v1.23.

몽고디비를 위한 네임스페이스 생성

쿠버네티스에 애플리케이션을 배포할 때, 프로젝트를 위한 특정 네임스페이스를 만드는 것이 항상 권장됩니다.

네임스페이스는 관리자가 쿠버네티스 리소스를 관리하기 쉽게 하며, 이름 충돌을 방지합니다. 동시에, 네임스페이스를 생성하면 쿠버네티스 환경에서 잘못된 리소스 사용을 방지할 수 있습니다.

터미널을 열고, 아래의 kubectl create 명령을 실행하여 쿠버네티스 클러스터에 새로운 네임스페이스(ns)인 mongodb를 만듭니다.

kubectl create ns mongodb

이제 아래의 kubectl get 명령을 실행하여 쿠버네티스 클러스터의 네임스페이스 목록을 확인합니다.

kubectl get ns

아래와 같이 새로운 몽고디비 네임스페이스가 클러스터에 생성되었음을 확인할 수 있습니다.

Creating and Verifying the mongodb Namespace

몽고디비 쿠버네티스 오퍼레이터 다운로드

네임스페이스를 생성한 후에는 MongoDB Kubernetes Operator를 다운로드할 차례입니다. MongoDB Kubernetes Operator는 쿠버네티스 연산자의 집합입니다. 이러한 쿠버네티스 연산자는 쿠버네티스 환경에서 MongoDB 커뮤니티의 자동 배포, 구성, 관리를 제공합니다.

아래의 git 명령어를 실행하여 MongoDB Kubernetes Operator 프로젝트를 로컬 기기로 clone하십시오.

git clone <https://github.com/mongodb/mongodb-kubernetes-operator.git>

이제, 아래 각 명령어를 실행하여 현재 작업 디렉토리를 mongodb-kubernetes-operator로 변경하고 모든 사용 가능한 파일과 디렉토리를 나열하십시오(ls).

# 작업 디렉토리를 mongodb-kubernetes-operator로 변경
cd mongodb-kubernetes-operator/

# 파일과 디렉토리 목록 표시
ls

아래에 표시된 것처럼 ~/mongodb-kubernetes-operator 프로젝트 디렉토리 내에 config라는 하위 디렉토리가 있습니다. 이 config 하위 디렉토리는 쿠버네티스에 MongoDB를 배포하기 위한 YAML 파일의 예시를 포함하고 있습니다.

Downloading mongodb-kubernetes-operator Source Code

MongoDB Operator 배포

사용자 정의 네임스페이스와 MongoDB Kubernetes Operator가 설정된 이제 Kubernetes 클러스터에 MongoDB Operator를 배포할 준비가 되었습니다. 어떻게 하실까요? config 디렉토리 내의 구성을 사용하실 것입니다.

MongoDB Operator는 Kubernetes 클러스터에서 MongoDB 배포의 수명 주기를 처리합니다. 연산자는 자동으로 MongoDB 배포의 상태를 생성, 관리, 그리고 확장할 것입니다.

MongoDB 오퍼레이터를 배포하려면 Kubernetes 사용자 정의 리소스 정의 (CRD)와 컨트롤러를 만들어야 합니다. Kubernetes CRD는 Kubernetes API에 확장 가능하며 Kubernetes에서 사용자 정의 리소스를 생성할 수 있게 해줍니다.

1. MongoDB 배포를 위한 새로운 Kubernetes CRD를 생성하려면 아래의 kubectl apply 명령을 실행하세요.

Kubernetes 오퍼레이터 는 Kubernetes에서 애플리케이션을 자동으로 배포하고 관리하는 팟 컨트롤러로 모든 인간 상호 작용을 대체합니다.

kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
Creating New Kubernetes CRD MongoDB Kubernetes Deployment

2. 다음으로, 다음 kubectl get 명령을 실행하여 Kubernetes에 있는 crd 목록을 확인합니다.

kubectl get crd/mongodbcommunity.mongodbcommunity.mongodb.com

아래에서는 이름이 mongodbcommunity.mongodbcommunity.mongodb.org인 CRD를 볼 수 있습니다.

Checking List of CRDs

3. 아래 명령을 실행하여 MongoDB 오퍼레이터에 대한 새로운 사용자 정의 역할 기반 액세스 제어 (RBAC)를 만들고 RBAC 구현을 mongodb 네임스페이스로 지정하세요.

이 명령은 MongoDB operator에 대한 새 역할, 역할바인딩 및 서비스 계정을 생성하며, 이는 Kubernetes 클러스터에서 사용자 정의 권한입니다. 이러한 사용자 정의 권한은 MongoDB를 자동으로 배포하고 관리하는 데 필요합니다.

kubectl apply -k config/rbac/ -n mongodb
Deploying RBAC for MongoDB Deployment

4. 이제 MongoDB operator의 역할, 역할바인딩 및 서비스 계정을 확인하려면 아래의 각 kubectl 명령을 실행하십시오.

# 역할 목록 확인
kubectl get role mongodb-kubernetes-operator -n mongodb

# 역할바인딩 목록 확인
kubectl get rolebinding mongodb-kubernetes-operator -n mongodb

# 서비스 계정 확인
kubectl get serviceaccount mongodb-kubernetes-operator -n mongodb

아래 출력에서는 역할, 역할바인딩 및 서비스 계정 mongodb-kubernetes-operator이 mongodb 네임스페이스에 생성된 것을 보여줍니다.

Checking role, rolebinding, and serviceaccount on Kubernetes

5. 확인이 완료되면 아래의 kubectl 명령을 사용하여 MongoDB Operator를 mongodb 네임스페이스에 배포하십시오.

이 명령은 새로운 pod (mongodb-kubernetes-operator)을 생성하며 기본 Docker 이미지(quay.io/mongodb/mongodb-kubernetes-operator)를 사용합니다. 이 pod은 Kubernetes 클러스터에서 MongoDB ReplicaSets을 자동으로 배포하는 컨트롤러 역할을 합니다.

kubectl create -f config/manager/manager.yaml -n mongodb

아래에서는 MongoDB operator 배포가 생성되었지만 pod은 아직 초기화 중입니다.

Deploying MongoDB Operator to the mongodb Namespace

6. 마지막으로, mongodb 네임스페이스에서 배포 및 pod을 확인하는 다음 명령을 실행하십시오.

# mongodb 네임스페이스에서 배포 확인
kubectl get deployment.apps -n mongodb

# mongodb 네임스페이스에서 pod 확인
kubectl get pods -n mongodb

아래에서 볼 수 있듯이, MongoDB Operator pod이 실행 중입니다.

Verifying MongoDB Operator Deployment and Pod

배포 MongoDB ReplicaSet to Kubernetes

MongoDB 배포 후 Kubernetes에 ReplicaSet을 배포하여 MongoDB 배포에 대한 고가용성과 견고성을 제공합니다. 배포 중에 다운타임이 발생하지 않도록합니다.

MongoDB Kubernetes Operator를 사용한 MongoDB ReplicaSets 배포는 기본적으로 사용자를 위한 SCRAM 인증을 사용하여 안전합니다. 동시에 사용자 및 애플리케이션 연결에 대해 TLS 보안 연결을 사용하고 모니터링 리소스를 위해 Prometheus 메트릭을 노출할 수 있습니다.

관련: Grafana 및 Prometheus Kubernetes 클러스터 모니터링 시작하기

config/samples/ 디렉토리 내에서 여러 ReplicaSet 배포에 대한 YAML 파일 샘플을 볼 수 있습니다. 각 파일은 다양한 배포 시나리오에서 사용할 수 있지만 기본 ReplicaSet 배포 파일은 mongodb.com_v1_mongodbcommunity_cr.yaml입니다.

1. 선호하는 편집기를 사용하여 배포용 YAML 파일을 편집합니다. 이 데모에서는 /mongodb.com_v1_hostpath.yaml 파일을 로컬 배포에 사용합니다. 이 YAML 파일은 config/samples/arbitrary_statefulset_configuration/ 디렉토리에 위치합니다.

만약 GKE나 AKS와 같은 클라우드 서비스에 MongoDB Kubernetes Operator를 배포하는 경우, YAML 파일 mongodb.com_v1_mongodbcommunity_cr.yaml을 사용하십시오. 그러나 Kind나 Minikube 내에서 로컬로 배포하는 경우, 임의의 YAML 파일 arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml을 사용할 수 있으며, 이 파일은 MongoDB ReplicaSet 팟을 위해 사용자 정의 PV와 PVC를 자동으로 생성합니다.

아래에서 ReplicaSet의 수(멤버 수)를 환경에 맞게 변경하십시오. 기본값은 3입니다. 이 튜토리얼에서는 ReplicaSet의 수를 2로 설정했습니다.

spec:
  members: 2 # 생성할 ReplicaSet 수
  security:
    authentication:
      modes:
      - SCRAM
  statefulSet:

<your-password-here>를 강력한 비밀번호로 대체하십시오. 이 비밀번호는 MongoDB 데이터베이스에 로그인할 때 사용하며, 기본적으로 SCRAM 인증을 사용합니다.

비밀번호를 만족할 때까지 변경하고 편집기를 닫으십시오.

---
apiVersion: v1
kind: Secret
metadata:
  name: my-user-password
type: Opaque
stringData:
  password: <your-password-here> # MongoDB 관리자 비밀번호 설정

2. 다음으로, 아래의 kubectl 명령을 실행하여 mongodb.com_v1_hostpath.yaml을 사용하여 mongodb 네임스페이스에 MongoDB ReplicaSet을 배포합니다.

이 명령은 다음을 생성합니다:

  • A new custom resource (MongoDBCommunity) with the name mdb0 under the mongodbcommunity.mongodb.com/v1 CRD
  • MongoDB 사용자 비밀번호를 저장하기 위한 Kubernetes 시크릿. 동시에 MongoDB Replica Set을 위한 일부 PV와 PVC, 그 종류는 hostPath입니다.

배포에는 시간이 소요될 것이며, 이는 생성할 ReplicaSets의 크기와 Kubernetes 클러스터 자체에 따라 다를 것입니다.

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Deploying MongoDB Replica Sets

3. 배포 후 아래 명령을 실행하여 mongodb 네임스페이스의 사용자 지정 리소스와 파드를 확인하세요.

# mongodbcommunity crd 확인
kubectl get mongodbcommunity -n mongodb

# mongodb 네임스페이스의 파드 확인
kubectl get pods -n mongodb

아래 출력은 다음을 보여줍니다:

  • 이름이 mdb0 인 사용자 지정 리소스 MongoDBCommunity가 MongoDB v4.4.0으로 실행 중입니다.
  • 두 MongoDB ReplicaSet 파드의 이름은 mdb0-0 및 mdb0-1입니다. 각 파드에는 mongod, 및 mongodb-agent 컨테이너가 포함되어 있습니다.
Verifying MongoDB ReplicaSet Deployment and Pods

4. 마지막으로 다른 kubectl 명령을 실행하여 mongodb 네임스페이스의 pvpvc를 확인하세요.

kubectl get pv,pvc -n mongodb

아래 출력에서는 MongoDB ReplicaSet 파드에서 사용되는 일부 pv와 pvc가 표시됩니다.

Checking PV and PVC on the mongodb Namespace

MongoDB 배포를 위한 새로운 사용자 및 데이터베이스 생성

이 시점에서 Kubernetes 클러스터에 MongoDB 오퍼레이터 및 ReplicaSets를 성공적으로 배포했습니다. 다음 단계는 응용 프로그램을 위한 새로운 MongoDB 데이터베이스와 사용자를 만드는 것입니다.

새로운 사용자를 위한 Kubernetes 비밀번호를 만들고, ReplicaSet 배포의 사용자 지정 리소스를 편집하고, 클러스터에 ReplicaSet을 업데이트합니다.

1. 선호하는 편집기를 사용하여 새로운 YAML 파일을 만들고 다음 Kubernetes 시크릿을 채워 넣습니다. YAML 파일의 이름은 마음대로 지정할 수 있지만, 이 튜토리얼에서는 파일 이름을 new-user.yaml로 지정합니다.

이 YAML 파일은 이름을 myappdata로, 비밀번호를 myapppassword로 하는 새로운 Kubernetes 시크릿을 생성합니다.

---
apiVersion: v1
kind: Secret
metadata:
  name: myappdata # 시크릿 meta.data의 이름
type: Opaque
stringData:
  password: myapppassword # 새로운 사용자의 비밀번호

2. 다음으로, 아래의 kubectl 명령어를 실행하여 new-user.yaml 설정을 적용합니다.

이 명령은 새로운 Kubernetes 시크릿을 클러스터에 생성 및 적용하며, 이 시크릿을 mongodb 네임스페이스에 적용합니다.

kubectl apply -f new-user.yaml -n mongodb
Creating Secret to Kubernetes Cluster

3. ReplicaSet CRD 구성의 YAML 파일(mongodb.com_v1_hostpath.yaml)을 config/samples/arbitrary_statefulset_configuration 디렉토리에서 편집합니다.

mongodb.com_v1_hostpath.yaml 파일에 다음 구성을 추가하여 MongoDB를 위한 데이터베이스와 사용자를 생성합니다.

반드시 scram-secret-myapp을 사용자의 scram 자격 증명으로 대체하고, 파일에 변경 사항을 저장하고 편집기를 닫으세요.

    - name: appuser # 새로운 사용자 appuser
      db: admin # 데이터베이스 admin에 대한 인증을 허용합니다
      passwordSecretRef:
        name: myappdata # Kubernetes 시크릿
      roles:
        - name: dbAdmin # 역할 dbAdmin 설정
          db: appdb1 # appdb1로 설정합니다
      scramCredentialsSecretName: scram-secret-myapp

4. 이제, 아래 명령어를 실행하여 스텝 세에서 만든 mongodb.com_v1_hostpath.yaml 파일에 대한 새로운 변경 사항을 적용합니다.

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Creating New MongoDB User and Database on Kubernetes

5. 마지막으로, 애플리케이션에 대한 자세한 MongoDB 연결을 생성하기 위해 아래 명령어를 각각 실행합니다. 이 명령어들은 JSON 형식으로 애플리케이션의 MongoDB 연결을 생성하고, 출력을 jq 명령어를 사용하여 파싱합니다.

다음과 같이 환경 세부 정보로 mdb0-admin-mongoadmin을 대체합니다:

  • mdb0 – MongoDB 리소스의 메타데이터 이름입니다.
  • admin – 인증할 데이터베이스입니다.
  • mongoadmin – 인증에 사용할 사용자입니다.
# admin 인증 세부 정보와 연결을 검색합니다
kubectl get secrets mdb0-admin-mongoadmin -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

# appuser 인증 세부 정보와 연결을 검색합니다
kubectl get secrets mdb0-admin-appuser -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

아래 출력에서는 표준 및 standardSrv 연결을 사용하여 MongoDB에 연결할 수 있음을 확인할 수 있습니다. 또한 MongoDB 배포의 사용자 이름과 비밀번호도 확인할 수 있습니다.

Retrieving Details of MongoDB User and Password, and Connections

MongoDB 배포에 연결하기

MongoDB Kubernetes 오퍼레이터를 사용하여 Kubernetes 클러스터에 MongoDB를 배포하는 작업이 완료되었습니다. 그러나 배포가 작동하는지 어떻게 알 수 있을까요? 로컬 컴퓨터의 데이터베이스와 MongoDB 클러스터 내부의 사용자 연결을 확인할 것입니다.

MongoDB 배포에 대한 연결을 확인하기 위해 포트 포워딩을 사용할 것입니다. Kubernetes의 포트 포워딩을 사용하면 어떤 Kubernetes 서비스의 포트를 로컬 포트로 포워딩할 수 있습니다.

1. 아래의 kubectl 명령을 실행하여 mongodb 네임스페이스(-n)에서 서비스(svc) 목록을 가져옵니다.

kubectl get svc -n mongodb

아래에서는 mdb0-svc라는 서비스를 볼 수 있습니다. 이 서비스는 MongoDB의 기본 포트인 27017을 노출합니다.

Listing Services on the mongodb Namespace

2. 그다음, 아래 명령을 실행하여 Kubernetes 클러스터에 포트 포워딩을 생성합니다.

이 명령은 Kubernetes 서비스(mdb0-svc)에 새로운 포트 포워딩을 생성하고 로컬 포트 27017을 Kubernetes 서비스 포트 27017로 전달합니다.

kubectl port-forward service/mdb0-svc -n mongodb 27017:27017
Setting up Port-forward

3. 마지막으로, 로컬 머신에서 MongoDB Compass 애플리케이션을 열고, 다음 형식으로 새로운 연결을 추가하고 Connect를 클릭하여 MongoDB에 연결합니다.

사용자 이름과 비밀번호 필드를 MongoDB 사용자 이름과 비밀번호로 변경하세요.

# mongoadmin으로 연결
mongodb://mongoadmin:secretpassword@localhost:27017/admin?ssl=false

# appuser로 연결
mongodb://appuser:myapppassword@localhost:27017/admin?ssl=false
Connecting as mongoadmin user to MongoDB
Connecting as appuser to MongoDB

연결이 성공하면 Kubernetes에 MongoDB 배포가 올바르게 작동되고 있음을 확인하는 다음 창을 받게 됩니다.

mongoadmin 사용자의 경우, 기본 데이터베이스(local, config 및 admin)를 볼 수 있습니다.

Verifying Connection to the MongoDB mongoadmin

appuser의 경우, appdb1이라는 하나의 권한 데이터베이스만 볼 수 있습니다.

Verifying Connection to the MongoDB as appuser

결론

이 튜토리얼을 통해 MongoDB를 Kubernetes 클러스터에 배포하는 방법과 MongoDB Kubernetes Operator의 기본 사용법을 배웠습니다. 또한 Kubernetes operator의 기본 사용법도 살펴보았습니다. 이제는 Kubernetes에 자동으로 애플리케이션을 배포하고 관리하는 데에 대해 충분한 지식을 가지고 있습니다.

왜 MongoDB 배포에 TLS 연결을 설정하지 않으시겠습니까? TLS 연결은 복제 세트 간의 연결을 보호하고 클라이언트 또는 앱 연결을 MongoDB에 안전하게 보호합니다.

Source:
https://adamtheautomator.com/mongodb-kubernetes/