티스토리 뷰
[특집 시리즈] Azure Kubernetes Service 워크샵 - 4. MongoDB 배포
zerobig-k8s 2021. 4. 26. 07:30Fruit Smoothies의 평가 웹 사이트는 여러 구성 요소로 구성된다. 웹 프런트 엔드, 캡처된 데이터를 저장하는 문서 데이터베이스 및 웹 프런트 엔드가 데이터베이스와 통신할 수 있도록 하는 RESTful API가 있다. 개발 팀은 MongoDB를 평가 웹 사이트에 대해 선택한 문서 저장 데이터베이스로 사용하고 있다.
이 실습에서는 Helm을 사용하여 AKS(Azure Kubernetes Service) 클러스터로 MongoDB를 배포한다. 또한 Kubernetes 시크릿을 사용하여 MongoDB 연결 사용자 이름 및 암호를 저장하는 방법도 확인할 수 있다.
이 예제 아키텍처는 애플리케이션에서 데이터를 저장하는 데 사용할 클러스터에 MongoDB를 배포한다. 이 방법은 테스트 환경과 개발 환경에서 사용할 수 있지만 프로덕션 환경에서는 권장되지 않는다. 프로덕션의 경우 CosmosDB와 같은 확장성 있는 데이터 스토리지 플랫폼에 애플리케이션 상태 및 데이터를 저장하는 것이 좋다.
이 실습에서 다음을 수행한다.
- Helm 안정화 리포지토리 구성
- MongoDB 차트 설치
- 데이터베이스 자격 증명을 보관할 Kubernetes 시크릿 만들기
Helm bitnami 리포지토리 추가
Helm은 Kubernetes용 애플리케이션 패키지 관리자이며 차트를 사용해 애플리케이션과 서비스를 쉽게 배포할 수 있는 방법을 제공한다.
Helm 클라이언트는 Azure Cloud Shell에 이미 설치되어 있으며 helm 명령을 사용하여 실행할 수 있다. Helm은 다양한 소프트웨어 패키지에 표준 차트 리포지토리를 제공한다. Helm에는 공식 Helm bitnami 차트 리포지토리의 일부인 MongoDB용 차트가 있다다.
1. 아래 helm repo add 명령을 실행하여 안정적 리포지토리를 사용하도록 Helm 클라이언트를 구성한다.
helm repo add bitnami https://charts.bitnami.com/bitnami
|
kim@Azure:~$ helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
2. 이제 helm search repo 명령을 실행하여 설치할 차트를 나열할 수 있다. 아래 명령의 안정화 채널에서 모든 차트를 나열하는 방법을 확인한다.
|
다음 예제와 같이 사용 가능한 차트 목록이 표시된다.
kim@Azure:~$ helm search repo bitnami
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/bitnami-common 0.0.9 0.0.9 DEPRECATED Chart with custom templates used in ...
bitnami/airflow 9.0.5 2.0.1 Apache Airflow is a platform to programmaticall...
bitnami/apache 8.5.2 2.4.46 Chart for Apache HTTP Server
...
Helm 차트 설치
Helm 차트는 Kubernetes 리소스의 관련 집합을 설명하는 파일 컬렉션이다. 단일 차트를 사용하여 Memcached Pod와 같이 단순한 항목이나, HTTP 서버, 데이터베이스 및 캐시가 포함된 전체 웹앱 스택과 같이 복잡한 항목을 배포할 수 있다.
Helm 차트는 Helm 차트 리포지토리에 저장된다. 공식 차트 리포지토리는 GitHub에서 유지 관리된다. Helm Hub는 이러한 차트에 대한 설명서를 검색하고 볼 수 있는 방법을 제공한다.
이제 MonogoDB 인스턴스를 설치할 준비가 되었다. 이전에 ratingsapp 네임스페이스를 사용하여 클러스터를 구성했음을 기억할 것이다. 네임스페이스를 helm install 명령의 일부로 지정하고 데이터베이스 릴리즈의 이름을 지정한다. 릴리즈는 ratings라고 하며 ratingsapp 네임스페이스에 배포된다.
1. 아래 helm install 명령을 실행한다. <username> 및 <password>를 적절한 값으로 바꾸고 나중에 사용할 수 있도록 기록해 둔다.
MongoDB 연결 문자열은 URI이다. 사용자 이름 또는 암호에서 특수 문자를 선택하는 경우 표준 URI 이스케이프 메커니즘을 사용하여 특수 문자를 이스케이프해야 한다.
helm repo add bitnami https://charts.bitnami.com/bitnamihelm install ratings bitnami/mongodb \ --namespace ratingsapp \ --set auth.username=<username>,auth.password=<password>,auth.database=ratingsdb
|
매개 변수에 --set 스위치와 쉼표로 구분된 key=value 쌍 목록을 제공한다. 각각 사용자 이름, 암호, 데이터베이스 이름을 설정하는 mongodbUsername, mongodbPassword 및 mongodbDatabase 매개 변수와 해당 값에도 주의한다. 애플리케이션에서는 ratingsdb라는 데이터베이스가 예상된다. helm install 명령은 다양한 기능을 지원하는 유용한 명령이다.
2. 설치가 완료되면 다음 예제와 비슷한 출력을 얻게 된다. 동일한 매개 변수를 사용했다면 ratings-mongodb.ratingsapp.svc.cluster.local일 MongoDB 호스트를 기록해 둔다.
kim@Azure:~$ helm install ratings bitnami/mongodb \
> --namespace ratingsapp \
> --set auth.username=zerobig,auth.password=xxxxxxxxxxxx,auth.database=ratingsdb
NAME: ratings
LAST DEPLOYED: Sun Apr 25 04:29:43 2021
NAMESPACE: ratingsapp
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
MongoDB(R) can be accessed on the following DNS name(s) and ports from within your cluster:
ratings-mongodb.ratingsapp.svc.cluster.local
To get the root password run:
export MONGODB_ROOT_PASSWORD=$(kubectl get secret --namespace ratingsapp ratings-mongodb -o jsonpath="{.data.mongodb-root-password}" | base64 --decode)
To get the password for "zerobig" run:
export MONGODB_PASSWORD=$(kubectl get secret --namespace ratingsapp ratings-mongodb -o jsonpath="{.data.mongodb-password}" | base64 --decode)
To connect to your database, create a MongoDB(R) client container:
kubectl run --namespace ratingsapp ratings-mongodb-client --rm --tty -i --restart='Never' --env="MONGODB_ROOT_PASSWORD=$MONGODB_ROOT_PASSWORD" --image docker.io/bitnami/mongodb:4.4.5-debian-10-r0 --command -- bash
Then, run the following command:
mongo admin --host "ratings-mongodb" --authenticationDatabase admin -u root -p $MONGODB_ROOT_PASSWORD
To connect to your database from outside the cluster execute the following commands:
kubectl port-forward --namespace ratingsapp svc/ratings-mongodb 27017:27017 &
mongo --host 127.0.0.1 --authenticationDatabase admin -p $MONGODB_ROOT_PASSWORD
helm uninstall 명령을 실행하여 Helm 릴리즈를 쉽게 제거할 수 있다. 전체 명령은 helm uninstall ratings --namespace ratingsapp 이다. 이 실습에서는 이스케이프되지 않은 사용자 이름 또는 암호를 지정하는 실수를 한 경우에만 차트를 제거하면 된다.
MongoDB 세부 정보를 보관할 Kubernetes 시크릿 만들기
이전 단계에서는 Helm을 사용하여 이름, 암호, 데이터베이스 이름이 지정된 MongoDB를 설치했다. 이제 Kubernetes 시크릿에 이러한 세부 정보를 저장한다. 이 단계를 통해 구성 파일에 하드 코드하여 시크릿을 유출하지 않도록 한다.
Kubernetes에는 시크릿이라는 개념이 있다. 시크릿을 사용해 암호와 같이 민감한 정보를 저장하고 관리할 수 있다. 이 정보를 시크릿에 저장하면 Pod 정의 또는 컨테이너 이미지에 하드 코드할 때보다 안전하고 유연하다.
평가 API는 mongodb://<username>:<password>@<endpoint>:27017/ratingsdb 형식으로 MongoDB 데이터베이스에 대한 연결 세부 정보를 찾을 것이다. <username>, <password> 및 <endpoint>를 데이터베이스를 만들 때 사용한 값(예: mongodb://ratingsuser:ratingspassword@ratings-mongodb.ratingsapp:27017/ratingsdb)으로 바꾼다.
1. kubectl create secret generic 명령을 사용하여 ratingsapp 네임스페이스에 mongosecret 라는 시크릿을 만든다. Kubernetes 시크릿은 여러 항목을 보유할 수 있으며 키로 인덱싱된다. 이 경우에서는 시크릿이 MONGOCONNECTION이라는 키 하나만 포함한다. 값은 이전 단계에서 생성된 연결 문자열이다. <username> 및 <password>를 데이터베이스를 만들 때 사용한 값으로 바꾼다.
kubectl create secret generic mongosecret \ --namespace ratingsapp \ --from-literal=MONGOCONNECTION="mongodb://<username>:<password>@ratings-mongodb.ratingsapp:27017/ratingsdb"
|
kim@Azure:~$ kubectl create secret generic mongosecret \
> --namespace ratingsapp \
> --from-literal=MONGOCONNECTION="mongodb://zerobig:xxxxxxxxxxxxx@ratings-mongodb.ratingsapp:27017/ratingsdb"
secret/mongosecret created
2. kubectl describe secret 명령을 실행하여 시크릿의 유효성을 검사한다.
kubectl describe secret mongosecret --namespace ratingsapp |
이 명령의 출력은 다음 예제와 비슷하다.
kim@Azure:~$ kubectl describe secret mongosecret --namespace ratingsapp
Name: mongosecret
Namespace: ratingsapp
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
MONGOCONNECTION: 73 bytes
이제 ratingsapp이라는 네임스페이스에 구성된 MongoDB 데이터베이스를 포함한 AKS 클러스터가 있다. 이 네임스페이스에서 다음 리소스를 찾을 수 있다.
- Deployment/ratings-mongodb: Kubernetes Deployment Controller로 관리되는 하나 이상의 동일한 Pod를 나타내는 디플로이먼트이다. 이 배포는 MongoDB에 대해 만들 복제본(Pod) 수를 정의한다. Kubernetes Scheduler는 Pod 또는 노드에 문제가 발생할 경우 정상 노드에 추가 Pod가 예약되도록 한다.
- Pod/ratings-mongodb-{random-string}: Kubernetes는 Pod를 사용하여 MongoDB 인스턴스를 실행한다.
- Service/ratings-mongodb: 네트워크 구성을 간소화하기 위해 Kubernetes에서는 서비스를 사용해 Pod 집합을 그룹화하고 네트워크 연결을 논리적으로 제공한다. MongoDB 데이터베이스에 대한 연결은 DNS 이름 ratings-mongodb.ratingsapp.svc.cluster.local을 통해 이 서비스로 공개된다.
- Secret/mongosecret: Kubernetes 시크릿은 액세스 자격 증명 또는 키와 같은 민감한 데이터를 Pod에 삽입하는 데 사용된다. 이 시크릿에는 MongoDB 연결 세부 정보가 저장된다. 다음 단원에서는 이 API를 사용하여 MongoDB와 통신하도록 API를 구성한다.
요약
이 연습에서는 Helm 안정화 리포지토리를 구성한 다음, MongoDB를 클러스터에 배포하는 Helm 차트를 사용했다. 그런 다음, 데이터베이스 자격 증명을 저장하는 Kubernetes 시크릿을 만들었다.
다음으로, AKS 클러스터에 Fruit Smoothies ratings-api를 배포한다.
5편에서 계속
'AKS(Azure Kubernetes Service)' 카테고리의 다른 글
[특집 시리즈] Azure Kubernetes Service 워크샵 - 6. ratings front end 배포 (0) | 2021.05.10 |
---|---|
[특집 시리즈] Azure Kubernetes Service 워크샵 - 5. ratings API 배포 (0) | 2021.05.03 |
[특집 시리즈] Azure Kubernetes Service 워크샵 - 3. AKS 배포 (0) | 2021.04.19 |
[특집 시리즈] Azure Kubernetes Service 워크샵 - 2. AKS 배포 (0) | 2021.04.12 |
[특집 시리즈] Azure Kubernetes Service 워크샵 - 1. 소개 (0) | 2021.04.05 |