다음을 통해 공유


AKS(Azure Kubernetes Service)에서 OpenAI를 사용하는 애플리케이션 배포

이 문서에서는 AKS에서 Azure OpenAI 또는 OpenAI를 사용하는 애플리케이션을 배포하는 방법을 알아봅니다. OpenAI를 사용하면 콘텐츠 생성, 요약, 의미 체계 검색, 자연어에서 코드 생성에 이르는 같은 다양한 AI 모델을 특정 작업에 맞게 쉽게 조정할 수 있습니다. Azure 구독에 AKS 클러스터를 배포하는 것으로 시작합니다. 그런 다음 OpenAI 서비스 및 샘플 애플리케이션을 배포합니다.

샘플 클라우드 네이티브 애플리케이션은 실제 구현을 대표합니다. 다중 컨테이너 애플리케이션은 다음과 같은 여러 언어와 프레임워크로 작성된 애플리케이션으로 구성됩니다.

  • Gin을 사용하는 Golang
  • Actix-Web을 사용하는 Rust
  • Vue.js 및 Fastify를 사용하는 JavaScript
  • FastAPI를 사용하는 Python

이러한 애플리케이션은 고객 및 스토어 관리자를 위한 프런트 엔드, RabbitMQ 메시지 큐 및 MongoDB 데이터베이스로 데이터를 보내기 위한 REST API, 트래픽을 시뮬레이션하기 위한 콘솔 앱을 제공합니다.

참고 항목

프로덕션을 위한 영구 스토리지 없이 MongoDB 및 Rabbit MQ와 같은 상태 저장 컨테이너를 실행하지 않는 것이 좋습니다. 여기서는 간소화를 위해 이를 사용하지만 Azure CosmosDB 또는 Azure Service Bus와 같은 관리형 서비스를 사용하는 것이 좋습니다.

샘플 애플리케이션의 GitHub 코드베이스에 액세스하려면 AKS 스토어 데모를 참조하세요.

시작하기 전에

사전 요구 사항

리소스 그룹 만들기

Azure 리소스 그룹은 Azure 리소스를 배포하고 관리하는 논리 그룹입니다. 리소스 그룹을 만들 때 위치를 지정하라는 메시지가 표시됩니다. 이 위치는 리소스 그룹 메타데이터의 스토리지 위치이며 리소스를 만드는 중에 다른 지역을 지정하지 않은 경우 Azure에서 리소스가 실행되는 위치입니다.

다음 예제에서는 eastus 위치에 myResourceGroup이라는 리소스 그룹을 만듭니다.

  • az group create 명령을 사용하여 리소스 그룹을 만듭니다.

    az group create --name myResourceGroup --location eastus
    

    다음 예제 출력은 리소스 그룹의 성공적인 만들기를 보여 줍니다.

    {
      "id": "/subscriptions/<guid>/resourceGroups/myResourceGroup",
      "location": "eastus",
      "managedBy": null,
      "name": "myResourceGroup",
      "properties": {
        "provisioningState": "Succeeded"
      },
      "tags": null,
      "type": "Microsoft.Resources/resourceGroups"
    }
    

AKS 클러스터 만들기

다음 예제에서는 myResourceGroupmyAKSCluster라는 클러스터를 만듭니다.

  • az aks create 명령을 사용하여 AKS 클러스터를 만듭니다.

    az aks create --resource-group myResourceGroup --name myAKSCluster --generate-ssh-keys
    

    몇 분 후 명령이 완료되면 클러스터에 대한 JSON 형식 정보가 반환됩니다.

클러스터에 연결

Kubernetes 클러스터를 관리하려면 Kubernetes 명령줄 클라이언트인 kubectl을 사용합니다. Azure Cloud Shell을 사용하는 경우 kubectl이 이미 설치되어 있습니다.

  1. az aks install-cli 명령을 사용하여 kubectl을 로컬로 설치합니다.

    az aks install-cli
    

    참고 항목

    Linux 기반 시스템에 높은 권한이 필요한 경우 sudo az aks install-cli 명령을 사용할 수 있습니다.

  2. az aks get-credentials 명령을 사용하여 Kubernetes 클러스터에 연결하도록 kubectl을 구성합니다.

    이 명령은 다음 작업을 실행합니다.

    • 자격 증명을 다운로드하고 이를 사용하도록 Kubernetes CLI를 구성합니다.
    • Kubernetes 구성 파일의 기본 위치인 ~/.kube/config를 사용합니다. --file 인수를 사용하여 Kubernetes 구성 파일의 다른 위치를 지정합니다.
    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. kubectl get 명령을 사용하여 클러스터에 대한 연결을 확인합니다. 이 명령은 클러스터 노드 목록을 반환합니다.

    kubectl get nodes
    

    다음 예제 출력은 이전 단계에서 만든 노드를 보여줍니다. 노드 상태가 준비인지 확인합니다.

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-31469198-vmss000000   Ready    agent   3h29m   v1.25.6
    aks-nodepool1-31469198-vmss000001   Ready    agent   3h29m   v1.25.6
    aks-nodepool1-31469198-vmss000002   Ready    agent   3h29m   v1.25.6
    

참고 항목

프라이빗 클러스터의 경우 공용 IP 주소를 통해 연결하려고 하면 노드에 연결하지 못할 수도 있습니다. 이 문제를 해결하려면 연결할 클러스터와 동일한 VNET 내에 엔드포인트를 만들어야 합니다. 지침에 따라 프라이빗 AKS 클러스터를 만든 다음 연결합니다.

애플리케이션 배포

AKS AI 데모의 아키텍처 다이어그램

AKS 스토어 애플리케이션 매니페스트에는 다음과 같은 Kubernetes 배포와 서비스가 포함되어 있습니다.

  • 제품 서비스: 제품 정보를 표시합니다.
  • 주문 서비스: 주문을 합니다.
  • Makeline 서비스: 큐에서 주문을 처리하고 해당 주문을 완료합니다.
  • 스토어 프런트: 고객이 제품을 보고 주문을 할 수 있는 웹 애플리케이션입니다.
  • 스토어 관리자: 스토어 직원이 큐에서 주문을 보고 제품 정보를 관리할 수 있는 웹 애플리케이션입니다.
  • 가상 고객: 예약 기준으로 주문 생성을 시뮬레이션합니다.
  • 가상 작업자: 예약 기준으로 주문 완료를 시뮬레이션합니다.
  • Mongo DB: 지속형 데이터에 대한 NoSQL 인스턴스입니다.
  • Rabbit MQ: 주문 큐에 대한 메시지 큐입니다.

참고 항목

프로덕션을 위한 영구 스토리지 없이 MongoDB 및 Rabbit MQ와 같은 상태 저장 컨테이너를 실행하지 않는 것이 좋습니다. 여기서는 간소화를 위해 이를 사용하지만 Azure CosmosDB 또는 Azure Service Bus와 같은 관리형 서비스를 사용하는 것이 좋습니다.

  1. 애플리케이션에 대한 YAML 매니페스트를 검토합니다.

  2. kubectl apply 명령을 사용하여 애플리케이션을 배포하고 YAML 매니페스트의 이름을 지정합니다.

    kubectl apply -f https://raw.githubusercontent.com/Azure-Samples/aks-store-demo/main/aks-store-all-in-one.yaml
    

    다음 예제 출력은 성공적으로 만들어진 배포 및 서비스를 보여 줍니다.

    deployment.apps/mongodb created
    service/mongodb created
    deployment.apps/rabbitmq created
    service/rabbitmq created
    deployment.apps/order-service created
    service/order-service created
    deployment.apps/makeline-service created
    service/makeline-service created
    deployment.apps/product-service created
    service/product-service created
    deployment.apps/store-front created
    service/store-front created
    deployment.apps/store-admin created
    service/store-admin created
    deployment.apps/virtual-customer created
    deployment.apps/virtual-worker created
    

OpenAI 배포

Azure OpenAI 또는 OpenAI를 사용하고 AKS에서 애플리케이션을 실행할 수 있습니다.

  1. Azure OpenAI 서비스에 대한 액세스 요청 양식을 작성하여 Azure 구독에서 Azure OpenAI를 사용하도록 설정합니다.
  2. Azure Portal에서 Azure OpenAI 인스턴스를 만듭니다.
  3. 만든 Azure OpenAI 인스턴스를 선택합니다.
  4. 키 및 엔드포인트를 선택하여 키를 생성합니다.
  5. 모델 배포>관리형 배포를 선택하여 Azure OpenAI 스튜디오를 엽니다.
  6. gpt-35-turbo 모델을 사용하여 새 배포를 만듭니다.

Azure OpenAI에서 배포를 만드는 방법에 대한 자세한 내용은 Azure OpenAI 서비스를 사용하여 텍스트 생성 시작하기를 참조하세요.

AI 서비스 배포

이제 애플리케이션이 배포되었으므로 OpenAI를 사용하여 스토어 카탈로그에 추가되는 새 제품에 대한 설명을 자동으로 생성하는 Python 기반 마이크로 서비스를 배포할 수 있습니다.

  1. 파일 ai-service.yaml을 만들고 다음 매니페스트에 복사합니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ai-service
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: ai-service
      template:
        metadata:
          labels:
            app: ai-service
        spec:
          nodeSelector:
            "kubernetes.io/os": linux
          containers:
          - name: ai-service
            image: ghcr.io/azure-samples/aks-store-demo/ai-service:latest
            ports:
            - containerPort: 5001
            env:
            - name: USE_AZURE_OPENAI 
              value: "True"
            - name: AZURE_OPENAI_DEPLOYMENT_NAME 
              value: ""
            - name: AZURE_OPENAI_ENDPOINT 
              value: ""
            - name: OPENAI_API_KEY 
              value: ""
            resources:
              requests:
                cpu: 20m
                memory: 50Mi
              limits:
                cpu: 50m
                memory: 128Mi
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ai-service
    spec:
      type: ClusterIP
      ports:
      - name: http
        port: 5001
        targetPort: 5001
      selector:
        app: ai-service
    
  2. USE_AZURE_OPENAI 환경 변수를 "True"로 설정합니다.

  3. Azure OpenAI 스튜디오에서 Azure OpenAI 배포 이름을 가져와서 AZURE_OPENAI_DEPLOYMENT_NAME 값을 입력합니다.

  4. 리소스의 왼쪽 블레이드에서 키 및 엔드포인트를 선택하여 Azure Portal에서 Azure OpenAI 엔드포인트 및 Azure OpenAI API 키를 가져옵니다. 그에 따라 YAML의 AZURE_OPENAI_ENDPOINTOPENAI_API_KEY를 업데이트합니다.

  5. kubectl apply 명령을 사용하여 애플리케이션을 배포하고 YAML 매니페스트의 이름을 지정합니다.

    kubectl apply -f ai-service.yaml
    

    다음 예제 출력은 성공적으로 만들어진 배포 및 서비스를 보여 줍니다.

      deployment.apps/ai-service created
      service/ai-service created
    

참고 항목

API 키와 같은 중요한 정보를 Kubernetes 매니페스트 파일에 직접 추가하는 것은 안전하지 않으며 실수로 코드 리포지토리에 커밋될 수 있습니다. 여기서는 간소화하기 위해 추가했습니다. 프로덕션 워크로드의 경우 관리 ID를 사용하여 대신 Azure OpenAI 서비스에 인증하거나 Azure Key Vault에 비밀을 저장합니다.

애플리케이션 테스트

  1. 배포된 Pod의 상태는 kubectl get pods 명령을 사용하여 확인합니다.

    kubectl get pods
    

    다음 단계로 진행하기 전에 모든 Pod가 실행 중인지 확인합니다.

    NAME                                READY   STATUS    RESTARTS   AGE
    makeline-service-7db94dc7d4-8g28l   1/1     Running   0          99s
    mongodb-78f6d95f8-nptbz             1/1     Running   0          99s
    order-service-55cbd784bb-6bmfb      1/1     Running   0          99s
    product-service-6bf4d65f74-7cbvk    1/1     Running   0          99s
    rabbitmq-9855984f9-94nlm            1/1     Running   0          99s
    store-admin-7f7d768c48-9hn8l        1/1     Running   0          99s
    store-front-6786c64d97-xq5s9        1/1     Running   0          99s
    virtual-customer-79498f8667-xzsb7   1/1     Running   0          99s
    virtual-worker-6d77fff4b5-7g7rj     1/1     Running   0          99s
    
  2. kubectl get service 명령을 사용하여 스토어 관리 웹 애플리케이션의 IP를 가져오고 스토어 프런트 웹 애플리케이션을 가져옵니다.

    kubectl get service store-admin
    

    애플리케이션은 Kubernetes 서비스에서 프로비전된 퍼블릭 부하 분산 장치를 통해 스토어 관리자 사이트를 인터넷에 노출합니다. 이 프로세스를 완료하는 데 몇 분이 걸릴 수 있습니다. 외부 IP는 처음에 서비스가 나타나고 IP 주소를 표시할 때까지 보류 중으로 표시됩니다.

    NAME          TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
    store-admin   LoadBalancer   10.0.142.228   40.64.86.161    80:32494/TCP   50m    
    

    'store-front``라는 이름의 서비스에 대해 동일한 단계를 반복합니다.

  3. 웹 브라우저를 열고 서비스의 외부 IP 주소를 찾습니다. 여기에 표시된 예제에서는 40.64.86.161을 열어 브라우저에서 스토어 관리자를 확인합니다. 스토어 프런트에 대해 동일한 단계를 반복합니다.

  4. 스토어 관리자에서 제품 탭을 선택한 다음 제품 추가를 선택합니다.

  5. `ai-service``가 성공적으로 실행되면 설명 필드 옆에 OpenAI에 질문 단추가 표시됩니다. 이름, 가격, 키워드를 입력한 다음 OpenAI에 질문>제품 저장을 선택하여 제품 설명을 생성합니다.

    OpenAI를 사용하여 제품 설명을 생성하는 방법에 대한 스크린샷

  6. 이제 판매자가 사용하는 스토어 관리자에서 만든 새 상품을 확인할 수 있습니다. 사진에서 정글 몽키 츄 토이가 추가된 것을 볼 수 있습니다.

    스토어 관리 페이지에서 새 제품을 보는 스크린샷

  7. 또한 구매자가 사용하는 스토어 프런트에서 만든 새 제품을 볼 수 있습니다. 사진에서 정글 몽키 츄 토이가 추가된 것을 볼 수 있습니다. kubectl get service 명령을 사용하여 스토어 프런트의 IP 주소를 가져와야 합니다.

    스토어 프런트 페이지에서 새 제품을 보는 스크린샷

다음 단계

이제 AKS 애플리케이션에 OpenAI 기능을 추가했으므로 AKS(Azure Kubernetes Service)에서 Azure OpenAI에 대한 액세스를 보호할 수 있습니다.

생성 AI 사용 사례에 대한 자세한 내용은 다음 리소스를 참조하세요.