Ejercicio: implementación de una aplicación en un clúster de Azure Kubernetes Service
En este ejercicio, implementará el sitio web de la empresa como una aplicación de prueba en Azure Kubernetes Service (AKS). Es un sitio web estático con una pila tecnológica subyacente de HTML, CSS y JavaScript. No recibe tantas solicitudes como otros servicios y proporciona una manera segura de probar las opciones de implementación.
Nota:
El código de la aplicación web está disponible en este repositorio de GitHub si quiere explorarlo con profundidad. Además, esta aplicación de muestra solo se implementará en un grupo de nodos de Linux.
Importante
Necesita su propia suscripción de Azure para completar este ejercicio y podría incurrir en cargos. Si aún no tiene una suscripción de Azure, cree una cuenta gratuita antes de comenzar.
Creación de un manifiesto de implementación
Cree un archivo de manifiesto de implementación para implementar la aplicación. El archivo de manifiesto permite definir el tipo de recurso que quiere implementar y todos los detalles asociados a la carga de trabajo.
Kubernetes agrupa los contenedores en estructuras lógicas denominadas pods, que no tienen inteligencia. Las implementaciones agregan la inteligencia que falta para crear la aplicación. Vamos a crear un archivo de implementación.
Inicie sesión en Azure Cloud Shell.
En Cloud Shell, cree un archivo de manifiesto para la implementación de Kubernetes denominado
deployment.yamlmediante el editor integrado.touch deployment.yamlAbra el editor integrado en Cloud Shell escribiendo
code ..Abra el archivo
deployment.yamly agregue la siguiente sección de código de YAML.# deployment.yaml apiVersion: apps/v1 # The API resource where this workload resides kind: Deployment # The kind of workload we're creating metadata: name: contoso-website # This will be the name of the deploymentEn este código, ha agregado las dos primeras claves para indicar a Kubernetes los elementos
apiVersionykinddel manifiesto que va a crear.namees el nombre de la implementación. Lo utilizará para identificar y consultar la información de la implementación cuando usekubectl.Sugerencia
Para más información sobre
apiVersiony los valores que se van a poner en esta clave, consulte la documentación oficial de Kubernetes. Busque un vínculo al final de este módulo.Una implementación encapsula un pod. Use una definición de plantilla para definir la información del pod dentro del archivo de manifiesto. La plantilla se coloca en el archivo de manifiesto, bajo la sección de especificación de la implementación.
Actualice el archivo
deployment.yamlpara que coincida con el código YAML siguiente.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: # Metadata for the pod labels: app: contoso-websiteLos pods no usan los mismos nombres que las implementaciones. El nombre del pod será una combinación del nombre de la implementación con un identificador aleatorio agregado al final.
Fíjese en el uso de la clave
labels. La clavelabelsse agrega para permitir que las implementaciones busquen y agrupen los pods.Un pod encapsula uno o varios contenedores. Todos los pods tienen una sección de especificación que le permite definir los contenedores dentro de ese pod.
Actualice el archivo
deployment.yamlpara que coincida con el código YAML siguiente.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: # Here we define all containers - name: contoso-websiteLa clave
containerses una matriz de especificaciones de contenedor porque un pod puede tener uno o más contenedores. La especificación define los elementosimage,name,resources,portsy otra información importante sobre el contenedor.Todos los pods en ejecución seguirán el nombre
contoso-website-<UUID>, donde UUID es un identificador generado para identificar todos los recursos de forma única.Se recomienda definir una cantidad mínima y máxima de los recursos que la aplicación puede usar desde el clúster. La clave
resourcesse usa para especificar esta información.Actualice el archivo
deployment.yamlpara que coincida con el código YAML siguiente.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: # Minimum amount of resources requested cpu: 100m memory: 128Mi limits: # Maximum amount of resources requested cpu: 250m memory: 256MiObserve cómo la sección de recursos le permite especificar la cantidad mínima de recursos como una solicitud y la cantidad máxima de recursos como un límite.
El último paso consiste en definir los puertos que este contenedor expone externamente a través de la clave
ports. La claveportses una matriz de objetos, lo que significa que un contenedor de un pod puede exponer varios puertos con varios nombres.Actualice el archivo
deployment.yamlpara que coincida con el código YAML siguiente.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 # This container exposes port 80 name: http # We named that port "http" so we can refer to it laterObserve cómo se asigna un nombre al puerto con la clave
name. La asignación de nombres a puertos permite cambiar el puerto expuesto sin modificar los archivos que le hacen referencia.Por último, agregue una sección de selector para definir las cargas de trabajo que administra la implementación. La clave
selectorse coloca dentro de la sección de especificación de implementación del archivo de manifiesto. Use la clavematchLabelspara mostrar las etiquetas de todos los pods administrados por la implementación.Actualice el archivo
deployment.yamlpara que coincida con el código YAML siguiente.# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: contoso-website spec: selector: # Define the wrapping strategy matchLabels: # Match all pods with the defined labels app: contoso-website # Labels follow the `name: value` template template: # This is the template of the pod inside the deployment metadata: labels: app: contoso-website spec: nodeSelector: kubernetes.io/os: linux containers: - image: mcr.microsoft.com/mslearn/samples/contoso-website name: contoso-website resources: requests: cpu: 100m memory: 128Mi limits: cpu: 250m memory: 256Mi ports: - containerPort: 80 name: httpNota:
En un clúster de AKS que tiene varios grupos de nodos (Linux y Windows), el archivo de manifiesto de implementación mencionado anteriormente también define un
nodeSelectorpara indicar al clúster de AKS que ejecute el pod de la aplicación de ejemplo en un nodo que pueda ejecutar contenedores de Linux.Los nodos de Linux no pueden ejecutar contenedores de Windows, y viceversa.
Guarde el archivo de manifiesto y cierre el editor.
Aplicación del manifiesto
En Cloud Shell, ejecute el comando
kubectl applypara enviar el manifiesto de implementación al clúster.kubectl apply -f ./deployment.yamlEste comando debe generar una salida similar a la del ejemplo siguiente.
deployment.apps/contoso-website createdEjecute el comando
kubectl get deploypara comprobar si la implementación se ha realizado correctamente.kubectl get deploy contoso-websiteEl comando debe generar una tabla similar a la del ejemplo siguiente.
NAME READY UP-TO-DATE AVAILABLE AGE contoso-website 0/1 1 0 16sEjecute el comando
kubectl get podspara comprobar si se está ejecutando el pod.kubectl get podsEl comando debe generar una tabla similar a la del ejemplo siguiente.
NAME READY STATUS RESTARTS AGE contoso-website-7c58c5f699-r79mv 1/1 Running 0 63s