Ejercicio: Asignación de una directiva a un clúster de Azure Kubernetes Services

Completado

Ya está listo para configurar directivas e iniciativas de Azure para el clúster de Azure Kubernetes Service (AKS).

En esta unidad, se implementa un pod no conforme y se aplica una directiva de Azure que exige el uso exclusivo de registros de confianza. Después, se implementa otro pod no conforme para ver el efecto de la directiva. Aprenda los pasos para solucionar el problema y ver por qué no se crean pods. También se implementa la iniciativa Estándares restringidos de seguridad de pods de clúster de Kubernetes para cargas de trabajo basadas en Linux.

Nota:

Este ejercicio es opcional. Si le interesa completar este ejercicio, deberá crear una suscripción de Azure antes de empezar. Si no tiene una cuenta de Azure o no quiere crear una en este momento, puede leer las instrucciones para comprender la información que se está presentando.

Implementación de un pod no conforme en el clúster

Para empezar, se implementa una imagen directamente desde Docker Hub en el clúster. El primer paso es iniciar sesión en el clúster.

  1. En Cloud Shell, inicie sesión en el clúster de AKS.

    az aks get-credentials -n videogamecluster -g videogamerg 
    
  2. Ejecute el código siguiente para crear un pod simple-nginx desde Docker Hub.

     cat <<EOF | kubectl apply -f -
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: simple-nginx
       labels:
         app: nginx
     spec:
       selector:
         matchLabels:
           app: nginx
       template:
         metadata:
           labels:
             app: nginx
         spec:
           containers:
           - name: simple-nginx
             image: docker.io/library/nginx:stable
             resources:
               requests:
                 cpu: 100m
                 memory: 100Mi
               limits:
                 cpu: 120m
                 memory: 120Mi
             ports:
             - containerPort: 80
    EOF
    
  3. Ejecute el código siguiente a fin de implementar el servicio para exponer la implementación.

    cat <<EOF | kubectl create -f -
     apiVersion: v1
     kind: Service
     metadata:
       name: simple-nginx
       labels:
         app: nginx
     spec:
       type: LoadBalancer
       ports:
       - port: 80
       selector:
         app: nginx
    EOF
    
  4. Enumere todos los servicios implementados.

    kubectl get services
    
  5. Copie la dirección IP externa del servicio simple-nginx y péguela en el explorador para ver si el servicio se ejecuta según lo previsto.

    Si la dirección IP externa aparece como <pending>, vuelva a ejecutar el comando. Se tarda tiempo en asignar una dirección IP pública para la carga de trabajo.

    Captura de pantalla en la que se muestra nginx en ejecución, que ha procedido de Docker Hub.

Aplicación de Azure Policy al clúster de AKS

Ha implementado correctamente la carga de trabajo en un clúster que no tiene ninguna aplicación de directivas. Ahora, puede agregar una directiva al clúster y ver cómo le afecta.

Asignación de una directiva

Quiere asegurarse de que en el clúster solo se permiten imágenes de determinados registros. Debe crear una nueva definición de directiva y, a continuación, asignarla a un ámbito. En este caso, el ámbito es nuestro grupo de recursos videogamerg. Las directivas se pueden crear y asignar a través de Azure Portal, Azure PowerShell o la CLI de Azure. En este ejercicio se le guía por la creación de una directiva en el portal.

Siga estos pasos para buscar las directivas integradas para administrar el clúster mediante Azure Portal. En este caso, aplica la directiva "solo imágenes permitidas".

  1. Vaya a la página Directiva en Azure Portal.

  2. En el panel izquierdo de la página de Azure Policy, seleccione Definitions (Definiciones).

  3. En el cuadro de lista desplegable Categoría, use Seleccionar todo para borrar el filtro y seleccione Kubernetes.

    Captura de pantalla en la que se muestra Kubernetes seleccionado para la categoría.

  4. Seleccione la definición de directiva Los contenedores del clúster de Kubernetes solo deben usar imágenes permitidas.

  5. Seleccione el botón Asignar.

  6. Establezca el Ámbito en el grupo de recursos del clúster de Kubernetes que ha creado, que en este caso es el grupo de recursos videogamerg.

    Captura de pantalla en la que se muestra la vista de asignación de directivas.

  7. Escriba lo siguiente en el campo Expresión regular de imagen de contenedor permitida y seleccione el botón Revisar y crear.

.+\.azurecr\.io/.+$
  1. Seleccione el botón Crear.

Ahora que se ha habilitado la nueva directiva, puede seleccionar Asignaciones para ver la directiva asignada y seleccionar la asignación de directiva que ha creado.

Captura de pantalla en la que se muestra la directiva asignada.

La asignación de directiva debe tener un aspecto parecido al de la imagen siguiente. De manera predeterminada, el efecto se establece en denegar. Esto significa que solo las imágenes hospedadas en Azure Container Registry se pueden implementar en el clúster.

Captura de pantalla en la que se muestran los detalles de la asignación de la directiva.

Asignación de una iniciativa de directiva

Ahora que se ha asignado correctamente la directiva, debe asignar una iniciativa antes de probar las directivas. Una iniciativa de Azure Policy es una colección de definiciones de Azure Policy, o reglas, agrupadas para satisfacer un objetivo o propósito concreto. Las iniciativas de Azure simplifican la administración de las directivas al agrupar conjuntos de directivas, de manera lógica, en un único elemento.

Las iniciativas se pueden asignar de la misma manera que las directivas. Siga estos pasos para asignar la iniciativa "Estándares restringidos de seguridad de pods de clúster de Kubernetes para cargas de trabajo basadas en Linux".

  1. Vuelva a la página Directiva en Azure Portal.
  2. En el panel izquierdo de la página de Azure Policy, seleccione Definitions (Definiciones).
  3. En el cuadro de lista desplegable Categoría, use Seleccionar todo para borrar el filtro y seleccione Kubernetes.
  4. Seleccione la definición de iniciativa Estándares restringidos de seguridad de pods de clúster de Kubernetes para cargas de trabajo basadas en Linux. Tómese un tiempo para revisar las distintas directivas que forman parte de la iniciativa.
  5. Seleccione el botón Asignar de la esquina superior izquierda de la pantalla.
  6. Establezca el ámbito en el grupo de recursos del clúster de Kubernetes que ha creado, que en este caso es videogamerg. Rellene el resto del formulario como ha hecho en el paso anterior y seleccione Revisar y crear.
  7. Seleccione el botón Crear.

Aquí puede encontrar la asignación de directiva de nuevo si hace clic en Directiva y selecciona Asignaciones. Al hacer clic en la asignación de directiva que ha creado, se muestra que, en este caso, el efecto se ha establecido en Auditar.

Prueba de Azure Policy

Ahora que la directiva de restricción se ha asignado al clúster, puede ejecutar una prueba para ver si la directiva funciona. Para demostrarlo, vamos a crear una implementación y a ver si funciona. Para empezar, creará un archivo de manifiesto de Kubernetes y lo implementará.

Importante

Tenga en cuenta que las asignaciones de directiva pueden tardar hasta 30 minutos en aplicarse. Debido a este retraso, es posible que en los pasos siguientes la validación de la directiva se realice correctamente y que no se produzca un error en la implementación. Si esto ocurre, permita más tiempo y vuelva a intentar llevar a cabo la implementación.

Puede comprobar si la asignación de directiva está en vigor mediante la ejecución del comando siguiente.

kubectl get ConstraintTemplates

Verá un resultado similar a la salida siguiente. Si k8sazurecontainerallowedimages aparece en la lista, sabrá que la directiva está en vigor.

k8sazureallowedcapabilities              40m
k8sazureallowedseccomp                   20m
k8sazureallowedusersgroups               40m
k8sazureblockautomounttoken              40m
k8sazureblockdefault                     40m
k8sazureblockhostnamespace               40m
k8sazurecontainerallowedimages           40m
k8sazurecontainerallowedports            40m
k8sazurecontainerlimits                  40m
k8sazurecontainernoprivilege             40m
k8sazurecontainernoprivilegeescalation   40m
k8sazuredefenderblockvulnerableimages    40m
k8sazuredisallowedcapabilities           40m
k8sazureenforceapparmor                  40m
k8sazurehostfilesystem                   40m
k8sazurehostnetworkingports              40m
k8sazureingresshttpsonly                 40m
k8sazurereadonlyrootfilesystem           40m
k8sazureserviceallowedports              40m
k8sazurevolumetypes                      20m
  1. Cree otra implementación y servicio de nginx mediante el código siguiente.

    cat <<EOF | kubectl create -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: second-simple-nginx
      labels:
        app: second-nginx
    spec:
      selector:
        matchLabels:
          app: second-nginx
      template:
        metadata:
          labels:
            app: second-nginx
        spec:
          containers:
          - name: second-simple-nginx
            image: docker.io/library/nginx:stable
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
              limits:
                cpu: 120m
                memory: 120Mi
            ports:
            - containerPort: 80
    EOF
    
  2. Creación del servicio

    cat <<EOF | kubectl create -f -
     apiVersion: v1
     kind: Service
     metadata:
       name: second-simple-nginx
       labels:
         app: second-nginx
     spec:
       type: LoadBalancer
       ports:
       - port: 80
       selector:
         app: second-nginx
    EOF
    
  3. Ahora podemos comprobar si el pod se ha creado.

    kubectl get pods
    

En la salida siguiente, aunque aparece que se ha creado la implementación, el pod no se ha creado. La directiva que ha creado ha bloqueado la implementación. Sin embargo, el pod que se ha creado antes de asignar la directiva no se ha detenido. La directiva tampoco ha impedido que se creara el servicio. Si intenta abrir EXTERNAL-IP en un explorador, no recibe ninguna respuesta, lo que muestra además que la implementación no se ha realizado correctamente.

NAME                            READY   STATUS    RESTARTS   AGE
simple-nginx-66d884c498-msbpc   1/1     Running   0          63m

Diagnóstico de por qué no se ha implementado el pod

En la sección anterior, hemos observado que el segundo pod no se ha implementado. En esta sección, usamos la línea de comandos para diagnosticar el motivo.

  1. En primer lugar, vamos a describir la implementación. Vemos que ReplicaSet se ha creado, pero las réplicas no.

    kubectl get replicasets
    

    Debe obtener una salida similar al siguiente ejemplo:

    NAME                             DESIRED   CURRENT   READY   AGE
    second-simple-nginx-64969b4566   1         0         0       8m45s
    simple-nginx-66d884c498          1         1         1       72m
    
  2. A continuación, se describe el objeto ReplicaSet con errores. Copie el nombre del objeto ReplicaSet que empieza porsecond-simple-nginx, actualice el comando siguiente con ese valor y ejecute el comando.

    kubectl describe replicaset <ReplicaSet name>
    
  3. En la salida del comando se muestra que se ha producido un error en las réplicas debido a la directiva.

    Warning  FailedCreate  3m9s (x18 over 14m)  replicaset-controller  Error creating: admission webhook "validation.gatekeeper.sh" denied the request: [azurepolicy-container-allowed-images-bcfbd5e1e78f7c8b4104] Container image docker.io/library/nginx:stable for container second-simple-nginx has not been allowed.
    

Elimine la implementación a fin de prepararse para el paso siguiente.

kubectl delete deployment second-simple-nginx

Nueva implementación de los pods mediante una imagen de Azure Container Registry

Ahora sabe que la directiva impide que se creen las imágenes de Docker Hub en el clúster en función de la directiva. Vamos a intentar volver a implementar la misma carga de trabajo mediante una imagen de Azure Container Registry (ACR). En esta sección, se crea una instancia de Azure Container Registry. Después, copie la imagen nginx de Docker Hub en el nuevo registro e intente volver a implementar el pod desde el registro de contenedor. Se usa la CLI de Azure para crear el registro de contenedor.

  1. Vuelva a Cloud Shell en Azure Portal y escriba los comandos siguientes para crear un registro de contenedor.

    ACR_NAME=videogameacr$RANDOM
    az acr create --name $ACR_NAME \
                  --resource-group videogamerg \
                  --sku Premium
    
  2. Importe la imagen desde Docker Hub al nuevo registro de contenedor.

    az acr import --name $ACR_NAME --source docker.io/library/nginx:stable --image nginx:v1
    
  3. Compruebe que la imagen se ha importado. Debería ver nginx en la lista de resultados.

    az acr repository list --name $ACR_NAME
    
  4. Vincule su clúster de AKS con el registro de contenedor que ha creado.

    az aks update -n videogamecluster -g videogamerg --attach-acr $ACR_NAME
    
  5. Cree la implementación ahora con el registro de contenedor recién creado mediante la ejecución del comando siguiente.

     cat <<EOF | kubectl apply -f -
     apiVersion: apps/v1
     kind: Deployment
     metadata:
       name: second-simple-nginx
       labels:
         app: second-nginx
     spec:
       selector:
         matchLabels:
           app: second-nginx
       template:
         metadata:
           labels:
             app: second-nginx
         spec:
           containers:
           - name: second-simple-nginx
             image: ${ACR_NAME}.azurecr.io/nginx:v1
             resources:
               requests:
                 cpu: 100m
                 memory: 100Mi
               limits:
                 cpu: 120m
                 memory: 120Mi
             ports:
             - containerPort: 80
    EOF
    
  6. Obtenga el valor EXTERNAL-IP para que pueda probar si el servicio se ejecuta en el clúster.

    kubectl get pods
    kubectl get services
    

    Captura de pantalla en la que se muestran los pods que se han implementado esta vez.

    Copie la dirección IP externa y péguela en el explorador. Verá que la página se carga ahora.

    Captura de pantalla en la que se muestra que el pod se ha implementado correctamente en el explorador web.

Uso de directivas para aplicar estándares

En esta unidad, ha visto cómo puede usar directivas para asegurarse de que el clúster solo permita la implementación de imágenes desde Azure Container Registry. También ha visto cómo agregar una de las iniciativas integradas que pueden ayudar a controlar fácilmente el clúster y a hacerlo más seguro. Sin embargo, ha visto que el pod que se implementó antes de asignar la directiva sigue en ejecución. En la siguiente unidad, se ve cómo comprobar el cumplimiento de los pods que se ejecutan en el clúster.