Ejercicio: configuración de Azure Policy para Kubernetes en un clúster de AKS

Completado

Azure Policy para Kubernetes ayuda a las organizaciones a cumplir con la gobernanza y los requisitos legales, implementar los procedimientos recomendados y establecer las convenciones de la organización para los entornos en la nube.

Los equipos de desarrollo de la empresa están adoptando Azure Kubernetes Service (AKS) como plataforma de desarrollo. Se da cuenta de que la mejor manera de administrar los costos es mediante la aplicación de reglas de negocio que definan los límites de recursos de carga de trabajo. Quiere asegurarse de que los desarrolladores solo pueden implementar cargas de trabajo dentro de determinados límites de asignación de memoria y CPU. El sistema debe evitar las cargas de trabajo que superen esos límites.

En este ejercicio, habilitará Azure Policy para AKS en el clúster y agregará la directiva Los límites de recursos de memoria y CPU de los contenedores de clúster de Kubernetes no deberían superar los límites especificados. Por último, probará que la directiva deniegue la programación de las cargas de trabajo que superen los parámetros de recursos de la directiva.

Habilitación de los proveedores de recursos ContainerService y PolicyInsights

  1. Inicie sesión en Azure Cloud Shell con la cuenta de Azure. Seleccione la versión Bash de Cloud Shell.

  2. Azure Policy para AKS requiere que la versión del clúster sea 1.14 o posterior. Ejecute el siguiente script para validar la versión del clúster de AKS:

    az aks list
    

    Asegúrese de que la versión del clúster comunicada sea 1.14 o posterior.

  3. Ejecute el comando az provider register para registrar el proveedor Azure Kubernetes Service:

    az provider register --namespace Microsoft.ContainerService
    
  4. Ejecute el comando az provider register para registrar el proveedor Azure Policy:

    az provider register --namespace Microsoft.PolicyInsights
    
  5. Ejecute el comando az feature register para habilitar la instalación del complemento:

    az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
    
  6. Para comprobar que el registro se haya realizado correctamente, consulte la tabla de lista de características. Use el comando az feature list para ejecutar la consulta. El registro de la característica puede tardar varios minutos en completarse, por lo que debe comprobar el resultado periódicamente.

    az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/AKS-AzurePolicyAutoApprove')].   {Name:name,State:properties.state}"
    

    Si se agota el tiempo de espera de la sesión de Cloud Shell, puede realizar un seguimiento del proceso de registro a través de la página de incorporación de la versión preliminar en Azure Portal.

  7. Ejecute el comando az provider register para propagar la actualización cuando haya confirmado que el comando de consulta de la lista de características muestra "Registrado":

    az provider register -n Microsoft.ContainerService
    

Habilitación de Azure Policy en el clúster

  1. Ejecute el comando az aks enable-addons para habilitar el complemento de azure-policy para el clúster:

    az aks enable-addons \
        --addons azure-policy \
        --name $AKS_CLUSTER_NAME \
        --resource-group $RESOURCE_GROUP
    
  2. Compruebe que el pod de Azure Policy está instalado en el espacio de nombres kube-system y que el pod de Gatekeeper está instalado en el espacio de nombres gatekeeper-system. Para ello, ejecute los siguientes comandos kubectl get pods:

    kubectl get pods -n kube-system
    

    La salida debe tener una apariencia similar a la siguiente:

    NAME                                    READY   STATUS    RESTARTS   AGE
    azure-policy-78c8d74cd4-7fqn2           1/1     Running   0          12m
    azure-policy-webhook-545c898766-gsjrc   1/1     Running   0          12m
    ...
    
    kubectl get pods -n gatekeeper-system
    

    La salida debe tener una apariencia similar a la siguiente:

    NAME                                            READY   STATUS    RESTARTS   AGE
    gatekeeper-controller-manager-d5cd87796-5tmhq   1/1     Running   0          15m
    ...
    
  3. Para comprobar que el complemento más reciente está instalado, ejecute el comando az aks show. Este comando recupera la información de configuración del clúster.

    az aks show \
     --resource-group $RESOURCE_GROUP\
     --name $AKS_CLUSTER_NAME \
     -o table --query "addonProfiles.azurepolicy"
    

    La salida debe tener una apariencia similar a la siguiente:

    {
        "config": null,
        "enabled": true,
        "identity": null
    }
    

    Ahora ya está listo para cambiar a Azure Portal y configurar la directiva Asegurarse de que los límites de los recursos de memoria y CPU del contenedor no superan los límites especificados en el clúster de Kubernetes.

Asignación de una definición de directiva integrada

Para configurar la nueva directiva de Azure, use el servicio Directiva de Azure Portal.

  1. Inicie sesión en Azure Portal.

  2. Busque el servicio Directiva en Azure Portal. Para ello, en la barra de búsqueda de la parte superior del portal, busque y seleccione Directiva.

  3. Seleccione el servicio Directiva en la lista de servicios, como se muestra aquí:

    Screenshot of the general Azure portal search box with a result that shows the Azure Policy service.

    El panel Directiva se abre y muestra todas las directivas asignadas, el estado de los recursos y el modo en que las directivas les afectan. Si no se ha asignado ninguna directiva, el panel estará vacío.

  4. En el panel de menús de la izquierda, en Creación, seleccione Asignaciones:

    Screenshot of the Policy service navigation panel that shows the location of the Assignments option.

  5. Recuerde de la descripción anterior que tiene dos opciones para crear una asignación de directiva: puede asignar una iniciativa o una directiva. En la barra de menús superior, seleccione Asignar directiva:

    Screenshot that shows the new policy assignment option.

    Aparece el panel Asignar directiva.

  6. En la pestaña Aspectos básicos, escriba los siguientes valores para cada opción para crear su directiva.

    Setting Valor
    Ámbito
    Ámbito Seleccione el botón Puntos suspensivos. Aparece el panel Ámbito. En Suscripción, seleccione la suscripción que contiene el grupo de recursos. En Grupo de recursos, seleccione rg-akscostsaving y, a continuación, seleccione el botón Seleccionar.
    Exclusiones Dejar en blanco.
    Conceptos básicos
    Definición de directiva Seleccione el botón Puntos suspensivos. Aparece el panel Definiciones disponibles. Escriba CPU en el cuadro de búsqueda para filtrar la selección. En la pestaña Definiciones de directivas, seleccione Los límites de los recursos de memoria y CPU de los contenedores de clúster de Kubernetes no deberían superar los límites especificados y, a continuación, seleccione Añadir.
    Nombre de asignación Aceptar el valor predeterminado.
    Descripción Dejar en blanco.
    Cumplimiento de directivas Asegúrese de que esta opción esté establecida en Habilitado.
    Asignada por Aceptar el valor predeterminado.

    Este es un ejemplo de la pestaña Aspectos básicos completada:

    Screenshot that shows the information captured in the Basics tab.

  7. Seleccione la pestaña Parámetros para especificar los parámetros de la directiva.

  8. Establezca los siguientes valores para cada una de las opciones de parámetro:

    Setting Valor
    Máximo de unidades de CPU permitidas Establezca el valor en 200m. La directiva coteja este valor con el valor de la solicitud de recursos de carga de trabajo y con el valor del límite de carga de trabajo especificados en el archivo de manifiesto de la carga de trabajo.
    Máximo de bytes de memoria permitidos Establezca el valor en 256Mi. La directiva coteja este valor con el valor de la solicitud de recursos de carga de trabajo y con el valor del límite de carga de trabajo especificados en el archivo de manifiesto de la carga de trabajo.

    Este es un ejemplo de la pestaña Parámetros completada:

    Screenshot that shows the information captured in the Parameters tab.

  9. Seleccione la pestaña Corrección. En esta pestaña, seleccionará cómo afecta la nueva directiva a los recursos que ya existan. De manera predeterminada, la nueva directiva solo comprueba los recursos creados recientemente. Mantenga la configuración predeterminada estándar.

    Este es un ejemplo de la pestaña Corrección completada:

    Screenshot that shows the information captured in the Remediation tab.

  10. Seleccione la pestaña Revisar y crear. Revise los valores que haya elegido y seleccione Crear.

Importante

Si usa un clúster de AKS existente, la asignación de directiva podría tardar unos 15 minutos en aplicarse.

Prueba de solicitudes de recursos

El paso final es probar la nueva directiva. Implemente la carga de trabajo de prueba con solicitudes de recursos y límites que infrinjan la nueva directiva. Si todo funciona adecuadamente, el servidor devolverá un error indicando “Denegado por la directiva”.

  1. Abra Azure Cloud Shell y asegúrese de seleccionar la versión Bash de Cloud Shell.

  2. Cree un archivo de manifiesto para la implementación de Kubernetes mediante el editor integrado. Ponga el nombre test-policy.yaml al archivo:

    code test-policy.yaml
    

    Sugerencia

    En Cloud Shell se incluye un editor de archivos integrado. El editor de Cloud Shell admite características como el resaltado de lenguaje, la paleta de comandos y un explorador de archivos. Para la creación y edición sencillas de archivos, inicie el editor mediante la ejecución de code . en el terminal de Cloud Shell. Esta acción abre el editor con el directorio de trabajo activo establecido en el terminal. Para abrir el archivo de manifiesto directamente para una edición rápida, ejecute code test-policy.yaml. Este comando abre el editor sin el explorador de archivos.

  3. Pegue el texto siguiente en el archivo:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 500m
            memory: 256Mi
          limits:
            cpu: 1000m
            memory: 500Mi
    
  4. Presione Ctrl+S para guardar el archivo y, después, Ctr+Q para cerrar el editor.

  5. Ejecute el comando kubectl apply para aplicar la configuración e implementarla en el espacio de nombres costsavings:

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    La salida debería ser similar a lo siguiente:

    Error from server (
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>)
     : error when creating "test-deploy.yml"
     : admission webhook "validation.gatekeeper.sh" denied the request: 
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> memory limit <500Mi> is higher than the maximum allowed of <256Mi>
    [denied by azurepolicy-container-limits-52f2942767eda208f8ac3980dc04b548c4a18a2d1f7b0fd2cd1a7c9e50a92674] container <nginx> cpu limit <1> is higher than the maximum allowed of <200m>
    

    Observe cómo el webhook de admisión, validation.gatekeeper.sh, ha denegado la solicitud de programar el pod.

  6. Abra el archivo de manifiesto y corrija la solicitud de recursos:

    code test-policy.yaml
    

    Reemplace el texto por el siguiente:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        resources:
          requests:
            cpu: 200m
            memory: 256Mi
          limits:
            cpu: 200m
            memory: 256Mi
    
  7. Presione Ctrl+S para guardar el archivo y, después, Ctr+Q para cerrar el editor.

  8. Ejecute el comando kubectl apply para aplicar la configuración e implementarla en el espacio de nombres costsavings:

    kubectl apply \
    --namespace costsavings \
    -f test-policy.yaml
    

    Obtendrá la siguiente salida:

    pod/nginx created
    
  9. Obtenga los pods de los pods recién creados en el espacio de nombres costsavings.

    kubectl get pods --namespace costsavings
    

    En unos segundos, los pods pasan al estado Running.

    NAME    READY   STATUS    RESTARTS   AGE
    nginx   1/1     Running   0          50s
    
  10. Presione Ctrl+C para dejar de ver una vez que vea los pods en ejecución.