Azure Cosmos DB를 사용하여 새 데이터베이스 호스트
이제 외부 상태의 기본 개념과 Kubernetes를 사용하여 처리하는 방법을 검토했으므로 화물 회사의 애플리케이션을 지원하는 리소스를 만든 다음 애플리케이션 자체를 만들어 보겠습니다.
리소스 그룹 만들기
중요합니다
이 연습을 완료하려면 사용자 고유의 Azure 구독이 필요하며 요금이 발생할 수 있습니다. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.
사용자 고유의 구독을 사용하여 Azure Portal 에 로그인합니다.
Cloud Shell을 열고 Bash를 선택합니다.
명령을 사용하여
az group createAzure 리소스 그룹을 만들고 지역을 지정합니다. 이 예제에서는 eastus 지역에 rg-ship-manager라는 리소스 그룹을 만듭니다.az group create --name rg-ship-manager --location eastus만들기 프로세스를 완료하는 데 몇 분 정도 걸릴 수 있습니다.
상태 만들기
앞에서 설명한 대로 Kubernetes에서 상태를 처리하는 것은 가능하지만 권장되지는 않습니다. 상태를 직접 관리해야 할 때 고가용성 애플리케이션 상태를 관리하는 것이 너무 어려워질 수 있습니다.
이 문제를 해결하기 위해 상태를 외부 상태를 처리하는 애플리케이션(Azure Cosmos DB)으로 외부화합니다.
비고
애플리케이션을 실행하는 데 필요한 리소스의 일부로 Azure Cosmos DB 인스턴스를 만들고 있지만 AKS(Azure Kubernetes Service) 및 Azure Cosmos DB는 서로 관련이 없습니다 .
Bash 변수를 만들어 Azure Cosmos DB 계정 이름 및 모듈의 나머지 부분 전체에서 사용할 리소스 그룹 이름을 저장합니다.
export RESOURCE_GROUP=rg-ship-manager export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM명령을 사용하여 새 Azure Cosmos DB 계정을 만듭니다
az cosmosdb create.az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB만들기 프로세스를 완료하는 데 몇 분 정도 걸릴 수 있습니다.
명령을 사용하여 새 데이터베이스를 만듭니다
az cosmosdb mongodb database create. 이 예제에서 데이터베이스의 이름은 contoso-ship-manager입니다.az cosmosdb mongodb database create --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --name contoso-ship-manager명령을 사용하여 데이터베이스가 성공적으로 만들어졌는지 확인합니다
az cosmosdb mongodb database list.az cosmosdb mongodb database list --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP -o table출력은 다음 예제 출력과 비슷하게 됩니다.
Name ResourceGroup -------------------- --------------- contoso-ship-manager rg-ship-manager
이제 Ship Manager 애플리케이션의 모든 데이터를 저장하는 외부 상태를 만들었으므로 애플리케이션 자체를 저장할 AKS 리소스를 만들어 보겠습니다.
AKS 클러스터 만들기
Bash 변수를 만들어 모듈의 나머지 부분 전체에서 사용할 클러스터 이름을 저장합니다.
AKS_CLUSTER_NAME=ship-manager-clusteraz aks create명령을 사용하여 AKS 클러스터를 만듭니다.az aks create --resource-group $RESOURCE_GROUP \ --name $AKS_CLUSTER_NAME \ --node-count 3 \ --generate-ssh-keys \ --node-vm-size Standard_B2s \ --enable-addons http_application_routing만들기 프로세스를 완료하는 데 몇 분 정도 걸릴 수 있습니다.
비고
모든 Azure 서비스는 특정 VM(가상 머신) SKU에 대한 사용 제한을 포함하여 리소스 및 기능에 대한 기본 제한 및 할당량을 설정합니다. 선택한 지역에서 원하는 VM SKU를 사용할 수 없다는 오류가 발생하는 경우 Azure 지원 요청을 통해 이 할당량을 늘려야 할 가능성이 큽니다( 문제 유형, 할당량 선택).
az aks get-credentials명령을 사용하여 kubectl 구성을 다운로드합니다.az aks get-credentials --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUP예를 들어 기존 클러스터에 대한 메시지를 수신하는 경우:
A different object named ship-manager-cluster already exists in your kubeconfig file. Overwrite? (y/n):y을(를) 입력하여 덮어쓰세요.명령을 사용하여 구성을 테스트합니다
kubectl get nodes.kubectl get nodes출력은 다음 예제 출력과 비슷하게 됩니다.
NAME STATUS ROLES AGE VERSION aks-nodepool1-12345678-vmss000000 Ready agent 3m19s v1.27.7 aks-nodepool1-12345678-vmss000001 Ready agent 3m25s v1.27.7 aks-nodepool1-12345678-vmss000002 Ready agent 3m20s v1.27.7
애플리케이션 배포
애플리케이션을 만들려면 Kubernetes에 배포할 YAML 파일을 만들어야 합니다.
백 엔드 API 배포
az cosmosdb keys list명령을 사용하여 Azure Cosmos DB 데이터베이스 연결 문자열을 가져옵니다.az cosmosdb keys list --type connection-strings -g $RESOURCE_GROUP -n $COSMOSDB_ACCOUNT_NAME --query "connectionStrings[0].connectionString" -o tsv출력은 다음 예제 출력과 비슷하게 됩니다.
mongodb://contoso-ship-manager-12345678.documents.azure.com:10255/?ssl=true&replicaSet=globaldbbackend-deploy.yml 새 파일을 만들고 다음 배포 사양에 붙여넣습니다.
apiVersion: apps/v1 kind: Deployment metadata: name: ship-manager-backend spec: replicas: 1 selector: matchLabels: app: ship-manager-backend template: metadata: labels: app: ship-manager-backend spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-ship-manager:backend name: ship-manager-backend resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 3000 name: http env: - name: DATABASE_MONGODB_URI value: "{your database connection string}" - name: DATABASE_MONGODB_DBNAME value: contoso-ship-manager{your database connection string}자리 표시자를 이전 단계에서 검색한 데이터베이스 연결 문자열로 바꿉다.비고
연결 문자열에 잘못된 YAML 문자가 표시되기 때문에 환경 변수에 따옴표를
"추가하는 것을 잊지 마세요.파일을 저장하고 닫습니다.
명령을 사용하여 백 엔드 API 배포를 적용합니다
kubectl apply.kubectl apply -f backend-deploy.yml다음 예제 출력과 유사한 메시지가 표시됩니다.
deployment.apps/ship-manager-backend created
모든 사용자가 이 애플리케이션을 사용할 수 있도록 하려면 트래픽을 처리할 서비스와 인그레스를 만들어야 합니다.
명령을 사용하여 클러스터 API 서버 주소를 가져옵니다
az aks show.az aks show -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME -o tsv --query fqdn출력은 다음 예제 출력과 비슷하게 됩니다.
ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.iobackend-network.yml 새 파일을 만들고 다음 네트워킹 사양에 붙여넣습니다.
apiVersion: v1 kind: Service metadata: name: ship-manager-backend spec: type: ClusterIP ports: - port: 80 targetPort: 3000 selector: app: ship-manager-backend --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ship-manager-backend spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: <host-name> http: paths: - backend: service: name: ship-manager-backend port: number: 80 path: / pathType: Prefix<host-name>자리 표시자를 이전 단계에서 검색한 연결 문자열로 바꿉다.파일을 저장하고 닫습니다.
kubectl apply명령을 사용하여 백엔드 네트워킹 배포를 적용합니다.kubectl apply -f backend-network.yml출력은 다음 예제 출력과 비슷하게 됩니다.
service/ship-manager-backend created ingress.networking.k8s.io/ship-manager-backend created수신 리소스에 붙여넣은 호스트 이름을 통해 API에 액세스할 수 있습니다. Azure DNS 영역 리소스는 DNS 검색을 완료하는 데 최대 5분이 걸릴 수 있습니다. API에 바로 액세스할 수 없는 경우 몇 분 정도 기다렸다가 다시 시도하세요.
kubectl get ingress명령을 사용하여 Kubernetes에서 사용 가능한 인그레스를 쿼리하여 인그레스 상태를 확인합니다.kubectl get ingress출력의 ADDRESS 필드가 채워지면, 인그레스가 배포되어 이제 액세스할 수 있음을 다음 예제 출력과 같이 의미합니다.
NAME CLASS HOSTS ADDRESS PORTS AGE ship-manager-backend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 2m40s
프런트 엔드 인터페이스 배포
frontend-deploy.yml 새 파일을 만들고 다음 배포 사양에 붙여넣습니다.
apiVersion: apps/v1 kind: Deployment metadata: name: ship-manager-frontend spec: replicas: 1 selector: matchLabels: app: ship-manager-frontend template: metadata: labels: app: ship-manager-frontend spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-ship-manager:frontend name: ship-manager-frontend imagePullPolicy: Always resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 volumeMounts: - name: config mountPath: /usr/src/app/dist/config.js subPath: config.js volumes: - name: config configMap: name: frontend-config --- apiVersion: v1 kind: ConfigMap metadata: name: frontend-config data: config.js: | const config = (() => { return { 'VUE_APP_BACKEND_BASE_URL': 'http://{YOUR_BACKEND_URL}', } })(){YOUR_BACKEND_URL}자리 표시자를 이전 섹션에서 검색한 백 엔드 API의 호스트 이름 URL로 바꿉다.파일을 저장하고 닫습니다.
명령을 사용하여 프런트 엔드 배포를 적용합니다
kubectl apply.kubectl apply -f frontend-deploy.yml출력은 다음 예제 출력과 비슷하게 됩니다.
deployment.apps/ship-manager-frontend created configmap/frontend-config created
다음으로, 이 애플리케이션을 웹에 열어야 하는 네트워킹 리소스를 만들 수 있습니다.
frontend-network.yml 새 파일을 만들고 다음 네트워킹 사양에 붙여넣습니다.
apiVersion: v1 kind: Service metadata: name: ship-manager-frontend spec: type: ClusterIP ports: - port: 80 targetPort: 80 selector: app: ship-manager-frontend --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ship-manager-frontend spec: ingressClassName: webapprouting.kubernetes.azure.com rules: - host: <host-name> http: paths: - backend: service: name: ship-manager-frontend port: number: 80 path: / pathType: Prefix<host-name>자리 표시자를 이전 섹션에서 검색한 연결 문자열로 바꿉다.파일을 저장하고 닫습니다.
명령을 사용하여 프런트 엔드 네트워킹 배포를 적용합니다
kubectl apply.kubectl apply -f frontend-network.yml출력은 다음 예제 출력과 비슷하게 됩니다.
service/ship-manager-frontend created ingress.networking.k8s.io/ship-manager-frontend created수신 리소스에 붙여넣은 호스트 이름을 통해 API에 액세스할 수 있습니다. Azure DNS 영역 리소스는 DNS 검색을 완료하는 데 최대 5분이 걸릴 수 있습니다. API에 바로 액세스할 수 없는 경우 몇 분 정도 기다렸다가 다시 시도하세요.
kubectl get ingress명령을 사용하여 Kubernetes에서 사용 가능한 인그레스를 쿼리하여 인그레스 상태를 확인합니다.kubectl get ingress출력의 ADDRESS 필드가 채워지면, 인그레스가 배포되어 이제 액세스할 수 있음을 다음 예제 출력과 같이 의미합니다.
NAME CLASS HOSTS ADDRESS PORTS AGE ship-manager-backend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 2m40s ship-manager-frontend webapprouting.kubernetes.azure.com ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io xx.xx.xx.xx 80 100s
이제 인그레스 리소스의 호스트 이름에서 URL에 접속하여 관리자 애플리케이션에 접근할 수 있습니다.