Ejercicio: implementación de una aplicación en un clúster de Azure Kubernetes Service

Completado

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.

  1. Inicie sesión en Azure Cloud Shell.

  2. En Cloud Shell, cree un archivo de manifiesto para la implementación de Kubernetes denominado deployment.yaml mediante el editor integrado.

    touch deployment.yaml
    
  3. Abra el editor integrado en Cloud Shell escribiendo code ..

  4. 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 y kind 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 use kubectl.

    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.

  5. 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 clave labels se agrega para permitir que las implementaciones busquen y agrupen los pods.

  6. 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 elementos image, 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.

  7. 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.

  8. El último paso consiste en definir los puertos que este contenedor expone externamente a través de la clave ports. La clave ports 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.

  9. 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 clave matchLabels 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.

  10. Guarde el archivo de manifiesto y cierre el editor.

Aplicación del manifiesto

  1. 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
    
  2. 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
    
  3. 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