Hospedaje de una nueva base de datos mediante Azure Cosmos DB

Completado

Ahora que hemos revisado los conceptos básicos de los estados externos y cómo tratar con ellos mediante Kubernetes, se crearán los recursos que complementarán la aplicación de su empresa transportista y, después, la propia aplicación.

Crear un grupo de recursos

Importante

Para realizar este ejercicio, se necesita una suscripción de Azure propia y puede que se apliquen cargos. Si aún no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.

  1. Inicie sesión en Azure Portal con una suscripción propia.

  2. Abra Cloud Shell y seleccione Bash.

  3. Cree un grupo de recursos de Azure mediante el comando az group create y especifique una región. En este ejemplo, se crea un grupo de recursos denominado rg-ship-manager en la región eastus:

    az group create --name rg-ship-manager --location eastus
    

    El proceso de creación puede tardar unos minutos en completarse.

Creación del estado

Como se ha descrito anteriormente, es posible (pero no se recomienda) controlar el estado en Kubernetes. La administración de un estado de la aplicación de alta disponibilidad puede resultar demasiado difícil cuando necesita administrar el estado usted mismo.

Para solucionar este problema, se externalizará el estado a una aplicación especializada en tratar con el estado externo: Azure Cosmos DB.

Nota:

Aunque vamos a crear una instancia de Azure Cosmos DB como parte de los recursos necesarios para ejecutar la aplicación, Azure Kubernetes Service (AKS) y Azure Cosmos DB no están relacionados.

  1. Cree variables de Bash para almacenar el nombre de la cuenta de Azure Cosmos DB y el nombre del grupo de recursos para su uso en el resto del módulo.

    export RESOURCE_GROUP=rg-ship-manager
    export COSMOSDB_ACCOUNT_NAME=contoso-ship-manager-$RANDOM
    
  2. Cree una cuenta de Azure Cosmos DB mediante el comando az cosmosdb create.

    az cosmosdb create --name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --kind MongoDB
    

    El proceso de creación puede tardar unos minutos en completarse.

  3. Cree una nueva base de datos mediante el comando az cosmosdb mongodb database create. En este ejemplo, la base de datos se denomina contoso-ship-manager.

    az cosmosdb mongodb database create --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP --name contoso-ship-manager
    
  4. Compruebe que la base de datos se creó correctamente mediante el comando az cosmosdb mongodb database list.

    az cosmosdb mongodb database list --account-name $COSMOSDB_ACCOUNT_NAME --resource-group $RESOURCE_GROUP -o table
    

    El resultado debería ser similar al ejemplo siguiente:

    Name                  ResourceGroup
    --------------------  ---------------
    contoso-ship-manager  rg-ship-manager
    

Ahora que ha creado un estado externo para almacenar todos los datos de la aplicación de administrador de envíos, se creará el recurso de AKS para almacenar la propia aplicación.

Creación del clúster de AKS

  1. Cree una variable de Bash para almacenar el nombre del clúster para su uso en el resto del módulo.

    AKS_CLUSTER_NAME=ship-manager-cluster
    
  2. Cree un clúster de AKS con el comando 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
    

    El proceso de creación puede tardar unos minutos en completarse.

    Nota:

    Todos los servicios de Azure establecen límites y cuotas predeterminados para recursos y características, incluidas restricciones de uso para determinadas SKU de máquina virtual (VM). Si se produce un error que sugiere que la SKU de máquina virtual deseada no está disponible en la región que ha seleccionado, es probable que tenga que aumentar esta cuota mediante una solicitud de Soporte técnico de Azure (para tipo de Problema, seleccione Cuota).

  3. Descargue la configuración de kubectl mediante el comando az aks get-credentials.

    az aks get-credentials --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUP
    

    Si recibe mensajes sobre clústeres existentes, por ejemplo:

    A different object named ship-manager-cluster already exists in your kubeconfig file.
    Overwrite? (y/n):
    

    Escriba y para sobrescribir.

  4. Pruebe la configuración mediante el comando kubectl get nodes.

    kubectl get nodes
    

    El resultado debería ser similar al ejemplo siguiente:

    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
    

Implementación de la aplicación

Para crear la aplicación, debe crear los archivos YAML para implementarlos en Kubernetes.

Implementación de la API de back-end

  1. Obtenga la cadena de conexión de la base de datos de Azure Cosmos DB mediante el comando az cosmosdb keys list.

    az cosmosdb keys list --type connection-strings -g $RESOURCE_GROUP -n $COSMOSDB_ACCOUNT_NAME --query "connectionStrings[0].connectionString" -o tsv
    

    El resultado debería ser similar al ejemplo siguiente:

    mongodb://contoso-ship-manager-12345678.documents.azure.com:10255/?ssl=true&replicaSet=globaldb
    
  2. Cree un nuevo archivo denominado backend-deploy.yml y pegue la siguiente especificación de implementación:

    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. Reemplace el marcador de posición {your database connection string} por la cadena de conexión de base de datos que ha recuperado en el paso anterior.

    Nota:

    No olvide agregar comillas " a las variables de entorno, ya que la cadena de conexión a veces presenta caracteres YAML no válidos. Puede considerar el uso de secretos como una manera segura de almacenar y recuperar la cadena de conexión en AKS.

  4. Guarde y cierre el archivo.

  5. Aplique la implementación de la API de back-end mediante el comando kubectl apply.

    kubectl apply -f backend-deploy.yml
    

    Debe ver un mensaje similar al siguiente ejemplo:

    deployment.apps/ship-manager-backend created
    

Para que esta aplicación esté disponible para todos los usuarios, debe crear un servicio y una entrada para cuidar el tráfico.

  1. Obtenga la dirección del servidor de API del clúster mediante el comando az aks show.

    az aks show -g $RESOURCE_GROUP -n $AKS_CLUSTER_NAME -o tsv --query fqdn
    

    El resultado debería ser similar al ejemplo siguiente:

    ship-manag-rg-ship-manager-a1bcd2-efghij56.hcp.eastus.azmk8s.io
    
  2. Cree un nuevo archivo denominado backend-network.yml y pegue la siguiente especificación de red:

    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. Reemplace el marcador de posición <host-name> por la cadena de conexión que ha recuperado en el paso anterior.

  4. Guarde y cierre el archivo.

  5. Aplique la implementación de redes de back-end mediante el comando kubectl apply.

    kubectl apply -f backend-network.yml
    

    El resultado debería ser similar al ejemplo siguiente:

    service/ship-manager-backend created
    ingress.networking.k8s.io/ship-manager-backend created
    

    Puede acceder a la API a través del nombre de host que ha pegado en el recurso de entrada. El recurso de zona de Azure DNS puede tardar hasta cinco minutos en completar la detección de DNS. Si no puede acceder a la API de inmediato, espere unos minutos y vuelva a intentarlo.

  6. Compruebe el estado de entrada consultando Kubernetes para ver las entradas disponibles mediante el comando kubectl get ingress.

    kubectl get ingress
    

    Una vez rellenado el campo ADDRESS de la salida, significa que se ha implementado la entrada y está lista para permitir el acceso, como se muestra en el siguiente ejemplo.

    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
    

Implementación de la interfaz de front-end

  1. Cree un nuevo archivo denominado frontend-deploy.yml y pegue la especificación de implementación siguiente:

    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. Reemplace el marcador de posición {YOUR_BACKEND_URL} por la dirección URL del nombre de host de la API de back-end que ha recuperado en la sección anterior.

  3. Guarde y cierre el archivo.

  4. Aplique la implementación de front-end mediante el comando kubectl apply.

    kubectl apply -f frontend-deploy.yml
    

    El resultado debería ser similar al ejemplo siguiente:

    deployment.apps/ship-manager-frontend created
    configmap/frontend-config created
    

A continuación, puede crear los recursos de red que esta aplicación debe abrir en la Web.

  1. Cree un nuevo archivo denominado frontend-network.yml y pegue la especificación de red siguiente:

    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. Reemplace el marcador de posición <host-name> por la cadena de conexión que ha recuperado en la sección anterior.

  3. Guarde y cierre el archivo.

  4. Aplique la implementación de red de front-end mediante el comando kubectl apply.

    kubectl apply -f frontend-network.yml
    

    El resultado debería ser similar al ejemplo siguiente:

    service/ship-manager-frontend created
    ingress.networking.k8s.io/ship-manager-frontend created
    

    Puede acceder a la API a través del nombre de host que ha pegado en el recurso de entrada. El recurso de zona de Azure DNS puede tardar hasta cinco minutos en completar la detección de DNS. Si no puede acceder a la API de inmediato, espere unos minutos y vuelva a intentarlo.

  5. Compruebe el estado de entrada consultando Kubernetes para ver las entradas disponibles mediante el comando kubectl get ingress.

    kubectl get ingress
    

    Una vez rellenado el campo ADDRESS de la salida, significa que se ha implementado la entrada y está lista para permitir el acceso, como se muestra en el siguiente ejemplo.

    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
    

Ahora puede acceder a la dirección URL desde el nombre de host del recurso de entrada para entrar en la aplicación de administrador de envíos.