Azure Kubernetes Service에 데이터 API 작성기 배포

이 가이드에서는 Azure Container Registry 푸시된 사용자 지정 컨테이너 이미지를 사용하여 DAB(Data API Builder)를 AKS(Azure Kubernetes Service) 배포하는 방법을 보여 줍니다. AKS는 관리형 Kubernetes를 제공하며, 기본 제공 크기 조정, 상태 프로브 및 비밀 관리 기능을 포함합니다.

 Azure Kubernetes Service 배포 후 전체 아키텍처의 다이어그램이 완료되었습니다.

사전 요구 사항

구성 파일 빌드

  1. 구성 파일에 대한 로컬 디렉터리를 만듭니다.

  2. 를 사용하여 dab init기본 구성 파일을 초기화합니다. 연결 문자열에 @env() 함수를 사용하므로 비밀이 이미지에 구워지지 않고 런타임에 삽입됩니다.

    dab init \
      --database-type mssql \
      --connection-string "@env('DATABASE_CONNECTION_STRING')"
    
  3. 를 사용하여 dab add엔터티를 하나 이상 추가합니다. 노출하려는 각 테이블 또는 뷰에 대해 반복합니다.

    dab add Books \
      --source dbo.Books \
      --permissions "anonymous:read"
    
  4. 계속하기 전에 dab-config.json를 검토하십시오.

사용자 지정 컨테이너 이미지 빌드 및 푸시

dab-config.json포함된 /App/dab-config.json 이미지를 빌드합니다.

  1. 아직 없는 경우 Azure Container Registry를 만듭니다.

    az acr create \
      --resource-group <resource-group> \
      --name <registry-name> \
      --sku Basic \
      --admin-enabled true
    
  2. 동일한 디렉터리에 Dockerfile를 생성하고 dab-config.json를 만듭니다.

    FROM mcr.microsoft.com/azure-databases/data-api-builder:latest
    COPY dab-config.json /App/dab-config.json
    
  3. ACR 작업을 사용하여 이미지를 빌드하고 푸시합니다.

    az acr build \
      --registry <registry-name> \
      --image dab:latest \
      .
    
  4. 전체 이미지 참조: <registry-name>.azurecr.io/dab:latest.

ACR에 AKS 연결

AKS 클러스터에 레지스트리 풀 액세스 권한을 부여합니다.

az aks update \
  --name <cluster-name> \
  --resource-group <resource-group> \
  --attach-acr <registry-name>

연결 문자열을 Kubernetes 비밀로 저장

매니페스트 파일에 절대로 표시되지 않도록 데이터베이스 연결 문자열을 Kubernetes 비밀로 저장합니다.

kubectl create secret generic dab-secrets \
  --from-literal=DATABASE_CONNECTION_STRING="<your-connection-string>"

경고

연결 문자열을 Kubernetes 매니페스트 파일 또는 컨테이너 이미지에 직접 배치하지 마세요. 비밀을 사용하거나 Azure Key Vault를 사용합니다.

Kubernetes 매니페스트 만들기

다음 내용으로 명명된 dab-deployment.yaml 파일을 만듭니다. <registry-name>을(를) ACR 이름으로 교체하세요.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dab
  labels:
    app: dab
spec:
  replicas: 2
  selector:
    matchLabels:
      app: dab
  template:
    metadata:
      labels:
        app: dab
    spec:
      containers:
        - name: dab
          image: <registry-name>.azurecr.io/dab:latest
          ports:
            - containerPort: 5000
          env:
            - name: DATABASE_CONNECTION_STRING
              valueFrom:
                secretKeyRef:
                  name: dab-secrets
                  key: DATABASE_CONNECTION_STRING
          readinessProbe:
            httpGet:
              path: /health
              port: 5000
            initialDelaySeconds: 5
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /health
              port: 5000
            initialDelaySeconds: 15
            periodSeconds: 20
---
apiVersion: v1
kind: Service
metadata:
  name: dab-service
spec:
  selector:
    app: dab
  ports:
    - protocol: TCP
      port: 80
      targetPort: 5000
  type: LoadBalancer

메모

readinessProbe livenessProbe 및 DAB /health 엔드포인트를 사용합니다. 자세한 내용은 상태 검사를 참조하세요.

AKS에 배포

  1. 클러스터에 대한 자격 증명을 가져옵니다.

    az aks get-credentials \
      --resource-group <resource-group> \
      --name <cluster-name>
    
  2. 매니페스트를 적용합니다.

    kubectl apply -f dab-deployment.yaml
    
  3. Pod가 준비될 때까지 배포 상태를 모니터링합니다.

    kubectl rollout status deployment/dab
    
  4. 서비스에 할당된 외부 IP 주소를 가져옵니다.

    kubectl get service dab-service
    

    열에는 EXTERNAL-IP 공용 IP 주소가 표시됩니다. 부하 분산 장치가 프로비전되는 데 1분이 소요됩니다.

배포 확인

  1. http://<external-ip>/health로 이동합니다. 정상 응답은 다음과 같습니다.

    {
      "status": "healthy",
      "version": "2.0.0",
      "app-name": "dab_oss_2.0.0"
    }
    
  2. 엔터티 엔드포인트를 테스트합니다.

    curl http://<external-ip>/api/Books
    

배포 크기 조정

수평으로 크기를 조정하도록 복제본 수를 변경합니다.

kubectl scale deployment/dab --replicas=4

spec.replicas에서 dab-deployment.yaml를 업데이트하고 다시 적용하세요.

자원을 정리하세요

더 이상 필요하지 않은 경우 배포 및 서비스를 제거합니다.

kubectl delete -f dab-deployment.yaml
kubectl delete secret dab-secrets

AKS 클러스터 및 레지스트리를 삭제하려면 리소스 그룹을 제거합니다.

az group delete \
  --name <resource-group> \
  --yes --no-wait