Размещение новой базы данных с помощью Azure Cosmos DB
Теперь, когда мы рассмотрели основные понятия внешних состояний и как справиться с ними с помощью Kubernetes, давайте создадим ресурсы, которые будут поддерживать приложение вашей грузовой компании, а затем создадим само приложение.
Создание группы ресурсов
Важный
Для выполнения этого упражнения вам потребуется собственная подписка Azure, и вы можете понести расходы. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись перед началом работы.
Откройте Cloud Shell и выберите Bash.
Создайте группу ресурсов 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 не связаны друг с другом.
Создайте переменные Bash для хранения имени учетной записи Azure Cosmos DB и имени группы ресурсов для использования в остальной части модуля.
export RESOURCE_GROUP=rg-ship-manager export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
Создайте новую учетную запись Azure Cosmos DB с помощью команды
az cosmosdb create
.az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB
Процесс создания может занять несколько минут.
Создайте базу данных с помощью команды
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
Убедитесь, что база данных была успешно создана с помощью команды
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
Создайте переменную Bash, чтобы сохранить имя кластера для использования в остальной части модуля.
AKS_CLUSTER_NAME=ship-manager-cluster
Создайте кластер 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 (для типа проблемы выберите квоту).
Скачайте конфигурацию 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
для перезаписи.Проверьте конфигурацию с помощью команды
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
Получите строку подключения к базе данных 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
Создайте файл с именем 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
Замените заполнитель
{your database connection string}
строкой подключения к базе данных, полученной на предыдущем шаге.Заметка
Не забудьте добавить кавычки
"
в переменные среды, так как строка подключения иногда представляет недопустимые символы YAML. Вы можете использовать секреты в качестве безопасного способа хранения и получения строки подключения в AKS.Сохраните и закройте файл.
Примените серверное развертывание API с помощью команды
kubectl apply
.kubectl apply -f backend-deploy.yml
Должно появиться сообщение, аналогичное следующему примеру выходных данных:
deployment.apps/ship-manager-backend created
Чтобы сделать это приложение доступным для всех, необходимо создать службу и входной ресурс, чтобы управлять трафиком.
Получите адрес сервера 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
Создайте файл с именем 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
Замените заполнитель
<host-name>
строкой подключения, полученной на предыдущем шаге.Сохраните и закройте файл.
Примените внутреннее сетевое развертывание с помощью команды
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 сразу, подождите несколько минут и повторите попытку.
Проверьте состояние 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
Развертывание пользовательского интерфейса
Создайте файл с именем 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}', } })()
Замените заполнитель
{YOUR_BACKEND_URL}
на URL-адрес хоста внутреннего API, полученного в предыдущем разделе.Сохраните и закройте файл.
Примените развертывание фронтенда с помощью команды
kubectl apply
.kubectl apply -f frontend-deploy.yml
Выходные данные должны выглядеть примерно так:
deployment.apps/ship-manager-frontend created configmap/frontend-config created
Затем можно создать сетевые ресурсы, которые необходимы для того, чтобы это приложение было доступно в Интернете.
Создайте файл с именем 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
Замените заполнитель
<host-name>
строкой подключения, полученной в предыдущем разделе.Сохраните и закройте файл.
Примените развертывание фронтенд-сети с помощью команды
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 сразу, подождите несколько минут и повторите попытку.
Проверьте состояние ингрессов, совершив запрос к 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, чтобы войти в приложение диспетчера судна.