Размещение новой базы данных с помощью Azure Cosmos DB

Завершено

Теперь, когда мы рассмотрели основные понятия внешних состояний и как справиться с ними с помощью Kubernetes, давайте создадим ресурсы, которые будут поддерживать приложение вашей грузовой компании, а затем создадим само приложение.

Создание группы ресурсов

Важный

Для выполнения этого упражнения вам потребуется собственная подписка Azure, и вы можете понести расходы. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись перед началом работы.

  1. Войдите на портал Azure с помощью собственной подписки.

  2. Откройте Cloud Shell и выберите Bash.

  3. Создайте группу ресурсов Azure с помощью команды az group create и укажите регион. В этом примере создаётся группа ресурсов под названием rg-ship-manager в регионе eastus.

    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. Создайте новую учетную запись Azure Cosmos DB с помощью команды az cosmosdb create.

    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. Создайте кластер AKS с помощью команды az aks create.

    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 устанавливают ограничения по умолчанию и квоты для ресурсов и функций, включая ограничения использования для определенных номеров SKU виртуальных машин. Если возникла ошибка, предполагающая, что нужный номер SKU виртуальной машины недоступен в выбранном регионе, скорее всего, потребуется увеличить эту квоту с помощью запроса на поддержку Azure (для типа проблемы выберите квоту).

  3. Скачайте конфигурацию kubectl с помощью команды az aks get-credentials.

    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
    

Развертывание приложения

Чтобы создать приложение, необходимо создать файлы YAML для развертывания в Kubernetes.

Развертывание серверного API

  1. Получите строку подключения к базе данных Azure Cosmos DB с помощью команды az cosmosdb keys list.

    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. Примените серверное развертывание API с помощью команды kubectl apply.

    kubectl apply -f backend-deploy.yml
    

    Должно появиться сообщение, аналогичное следующему примеру выходных данных:

    deployment.apps/ship-manager-backend created
    

Чтобы сделать это приложение доступным для всех, необходимо создать службу и входной ресурс, чтобы управлять трафиком.

  1. Получите адрес сервера API кластера с помощью команды az aks show.

    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. Проверьте состояние Ingress, запросив у Kubernetes доступные записи Ingress с помощью команды kubectl get ingress.

    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} на URL-адрес хоста внутреннего API, полученного в предыдущем разделе.

  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. Проверьте состояние ингрессов, совершив запрос к Kubernetes о доступных ингрессах с помощью команды kubectl get ingress.

    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-адресу из имени узла ресурса ingress, чтобы войти в приложение диспетчера судна.