将数据 API 生成器部署到 Azure Kubernetes 服务

本指南介绍如何使用推送到Azure 容器注册表的自定义容器映像将数据 API 生成器(DAB)部署到Azure Kubernetes 服务 (AKS)。 AKS 提供托管的 Kubernetes,具有内置的扩展、健康检查和密钥管理功能。

部署到Azure Kubernetes 服务后的总体体系结构的Diagram 已完成。

先决条件

生成配置文件

  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 容器注册表,请创建一个。

    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

将 AKS 连接到 ACR

授予 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 密钥保管库。

创建 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

注释

readinessProbelivenessProbe 使用 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. 浏览到 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.replicasdab-deployment.yaml中并重新应用。

清理资源

不再需要部署和服务时,请将其删除。

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

若要删除 AKS 群集和注册表,请删除资源组。

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