使用 Azure Cosmos DB 托管新数据库

已完成

现在,我们已经回顾了外部状态的基本概念,以及如何使用 Kubernetes 处理它们,接下来创建支持货运公司应用程序的资源,然后创建应用程序本身。

创建资源组

重要

需要自己的 Azure 订阅才能运行此练习,这可能会产生费用。 如果还没有 Azure 订阅,请在开始前创建一个免费帐户

  1. 使用你自己的订阅登录到 Azure 门户

  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 实例作为运行应用程序所需资源的一部分,但是 Azure Kubernetes 服务 (AKS) 和 Azure Cosmos DB 是不相关的。

  1. 创建 Bash 变量以存储 Azure Cosmos DB 帐户名称和资源组名称,以便在模块的其余部分使用。

    export RESOURCE_GROUP=rg-ship-manager
    export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
    
  2. 使用 az cosmosdb create 命令创建新的 Azure Cosmos DB 帐户。

    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
    

现在,你已创建外部状态来存储船舶管理器应用程序中的所有数据,接下来请创建 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 字符。 可以考虑使用机密作为在 AKS 中存储和检索连接字符串的安全方法。

  4. 保存并关闭该文件。

  5. 使用 kubectl apply 命令应用后端 API 部署。

    kubectl apply -f backend-deploy.yml
    

    应会看到类似于以下示例输出的消息:

    deployment.apps/ship-manager-backend created
    

为了让所有人都可使用此应用程序,需要创建一个服务和入口来处理流量。

  1. 使用 az aks show 命令获取群集 API 服务器地址。

    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 检测。 如果无法立即访问 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
    

接下来,可以创建此应用程序需要将其向 Web 开放的网络资源。

  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 检测。 如果无法立即访问 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,以进入船舶管理器应用程序。