Hospedaje de una nueva base de datos mediante Azure Cosmos DB
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.
Inicie sesión en Azure Portal con una suscripción propia.
Abra Cloud Shell y seleccione Bash.
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.
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
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.
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
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
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
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).
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.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
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
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
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.Guarde y cierre el archivo.
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.
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
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
Reemplace el marcador de posición
<host-name>
por la cadena de conexión que ha recuperado en el paso anterior.Guarde y cierre el archivo.
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.
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
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}', } })()
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.Guarde y cierre el archivo.
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.
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
Reemplace el marcador de posición
<host-name>
por la cadena de conexión que ha recuperado en la sección anterior.Guarde y cierre el archivo.
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.
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.