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
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.
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.yaml
mediante el editor integrado.touch deployment.yaml
Abra el editor integrado en Cloud Shell escribiendo
code .
.Abra el archivo
deployment.yaml
y 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 deployment
En este código, ha agregado las dos primeras claves para indicar a Kubernetes los elementos
apiVersion
ykind
del manifiesto que va a crear.name
es 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
apiVersion
y 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.yaml
para 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-website
Los 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 clavelabels
se 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.yaml
para 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-website
La clave
containers
es una matriz de especificaciones de contenedor porque un pod puede tener uno o más contenedores. La especificación define los elementosimage
,name
,resources
,ports
y 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
resources
se usa para especificar esta información.Actualice el archivo
deployment.yaml
para 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: 256Mi
Observe 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 claveports
es una matriz de objetos, lo que significa que un contenedor de un pod puede exponer varios puertos con varios nombres.Actualice el archivo
deployment.yaml
para 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 later
Observe 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
selector
se coloca dentro de la sección de especificación de implementación del archivo de manifiesto. Use la clavematchLabels
para mostrar las etiquetas de todos los pods administrados por la implementación.Actualice el archivo
deployment.yaml
para 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: http
Nota:
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
nodeSelector
para 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 apply
para enviar el manifiesto de implementación al clúster.kubectl apply -f ./deployment.yaml
Este comando debe generar una salida similar a la del ejemplo siguiente.
deployment.apps/contoso-website created
Ejecute el comando
kubectl get deploy
para comprobar si la implementación se ha realizado correctamente.kubectl get deploy contoso-website
El comando debe generar una tabla similar a la del ejemplo siguiente.
NAME READY UP-TO-DATE AVAILABLE AGE contoso-website 0/1 1 0 16s
Ejecute el comando
kubectl get pods
para comprobar si se está ejecutando el pod.kubectl get pods
El 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