使用 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
    

接下来,您可以创建使此应用程序可以在网络上访问的网络资源。

  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,以进入船舶管理器应用程序。