Azure Cosmos DB를 사용하여 새 데이터베이스 호스트

완료됨

이제 외부 상태의 기본 개념과 Kubernetes를 사용하여 처리하는 방법을 검토했으므로 화물 회사의 애플리케이션을 지원하는 리소스를 만든 다음 애플리케이션 자체를 만들어 보겠습니다.

리소스 그룹 만들기

중요합니다

이 연습을 완료하려면 사용자 고유의 Azure 구독이 필요하며 요금이 발생할 수 있습니다. Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.

  1. 사용자 고유의 구독을 사용하여 Azure Portal 에 로그인합니다.

  2. Cloud Shell을 열고 Bash를 선택합니다.

  3. 명령을 사용하여 az group create Azure 리소스 그룹을 만들고 지역을 지정합니다. 이 예제에서는 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는 서로 관련이 없습니다 .

  1. Bash 변수를 만들어 Azure Cosmos DB 계정 이름 및 모듈의 나머지 부분 전체에서 사용할 리소스 그룹 이름을 저장합니다.

    export RESOURCE_GROUP=rg-ship-manager
    export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
    
  2. 명령을 사용하여 새 Azure Cosmos DB 계정을 만듭니다 az cosmosdb create .

    az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB
    

    만들기 프로세스를 완료하는 데 몇 분 정도 걸릴 수 있습니다.

  3. 명령을 사용하여 새 데이터베이스를 만듭니다 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
    
  4. 명령을 사용하여 데이터베이스가 성공적으로 만들어졌는지 확인합니다 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 클러스터 만들기

  1. Bash 변수를 만들어 모듈의 나머지 부분 전체에서 사용할 클러스터 이름을 저장합니다.

    AKS_CLUSTER_NAME=ship-manager-cluster
    
  2. az 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 지원 요청을 통해 이 할당량을 늘려야 할 가능성이 큽니다( 문제 유형, 할당량 선택).

  3. 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을(를) 입력하여 덮어쓰세요.

  4. 명령을 사용하여 구성을 테스트합니다 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 배포

  1. 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=globaldb
    
  2. backend-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
    
  3. {your database connection string} 자리 표시자를 이전 단계에서 검색한 데이터베이스 연결 문자열로 바꿉다.

    비고

    연결 문자열에 잘못된 YAML 문자가 표시되기 때문에 환경 변수에 따옴표를 " 추가하는 것을 잊지 마세요.

  4. 파일을 저장하고 닫습니다.

  5. 명령을 사용하여 백 엔드 API 배포를 적용합니다 kubectl apply .

    kubectl apply -f backend-deploy.yml
    

    다음 예제 출력과 유사한 메시지가 표시됩니다.

    deployment.apps/ship-manager-backend created
    

모든 사용자가 이 애플리케이션을 사용할 수 있도록 하려면 트래픽을 처리할 서비스와 인그레스를 만들어야 합니다.

  1. 명령을 사용하여 클러스터 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.io
    
  2. backend-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
    
  3. <host-name> 자리 표시자를 이전 단계에서 검색한 연결 문자열로 바꿉다.

  4. 파일을 저장하고 닫습니다.

  5. 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에 바로 액세스할 수 없는 경우 몇 분 정도 기다렸다가 다시 시도하세요.

  6. 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
    

프런트 엔드 인터페이스 배포

  1. 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}',
          }
        })()
    
  2. {YOUR_BACKEND_URL} 자리 표시자를 이전 섹션에서 검색한 백 엔드 API의 호스트 이름 URL로 바꿉다.

  3. 파일을 저장하고 닫습니다.

  4. 명령을 사용하여 프런트 엔드 배포를 적용합니다 kubectl apply .

    kubectl apply -f frontend-deploy.yml
    

    출력은 다음 예제 출력과 비슷하게 됩니다.

    deployment.apps/ship-manager-frontend created
    configmap/frontend-config created
    

다음으로, 이 애플리케이션을 웹에 열어야 하는 네트워킹 리소스를 만들 수 있습니다.

  1. 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
    
  2. <host-name> 자리 표시자를 이전 섹션에서 검색한 연결 문자열로 바꿉다.

  3. 파일을 저장하고 닫습니다.

  4. 명령을 사용하여 프런트 엔드 네트워킹 배포를 적용합니다 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에 바로 액세스할 수 없는 경우 몇 분 정도 기다렸다가 다시 시도하세요.

  5. 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에 접속하여 관리자 애플리케이션에 접근할 수 있습니다.