Ejercicio: configuración de Azure Policy para Kubernetes en un clúster de AKS
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
Inicie sesión en Azure Cloud Shell con la cuenta de Azure. Seleccione la versión Bash de Cloud Shell.
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.
Ejecute el comando
az provider register
para registrar el proveedor Azure Kubernetes Service:az provider register --namespace Microsoft.ContainerService
Ejecute el comando
az provider register
para registrar el proveedor Azure Policy:az provider register --namespace Microsoft.PolicyInsights
Ejecute el comando
az feature register
para habilitar la instalación del complemento:az feature register --namespace Microsoft.ContainerService --name AKS-AzurePolicyAutoApprove
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.
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
Ejecute el comando
az aks enable-addons
para habilitar el complemento deazure-policy
para el clúster:az aks enable-addons \ --addons azure-policy \ --name $AKS_CLUSTER_NAME \ --resource-group $RESOURCE_GROUP
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 nombresgatekeeper-system
. Para ello, ejecute los siguientes comandoskubectl 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 ...
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.
Inicie sesión en Azure Portal.
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.
Seleccione el servicio Directiva en la lista de servicios, como se muestra aquí:
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.
En el panel de menús de la izquierda, en Creación, seleccione Asignaciones:
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:
Aparece el panel Asignar directiva.
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:
Seleccione la pestaña Parámetros para especificar los parámetros de la directiva.
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:
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:
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”.
Abra Azure Cloud Shell y asegúrese de seleccionar la versión Bash de Cloud Shell.
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, ejecutecode test-policy.yaml
. Este comando abre el editor sin el explorador de archivos.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
Presione Ctrl+S para guardar el archivo y, después, Ctr+Q para cerrar el editor.
Ejecute el comando
kubectl apply
para aplicar la configuración e implementarla en el espacio de nombrescostsavings
: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.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
Presione Ctrl+S para guardar el archivo y, después, Ctr+Q para cerrar el editor.
Ejecute el comando
kubectl apply
para aplicar la configuración e implementarla en el espacio de nombrescostsavings
:kubectl apply \ --namespace costsavings \ -f test-policy.yaml
Obtendrá la siguiente salida:
pod/nginx created
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
Presione Ctrl+C para dejar de ver una vez que vea los pods en ejecución.