Ejercicio: Asignación de una directiva a un clúster de Azure Kubernetes Services
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.
En Cloud Shell, inicie sesión en el clúster de AKS.
az aks get-credentials -n videogamecluster -g videogamerg
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
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
Enumere todos los servicios implementados.
kubectl get services
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.
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".
Vaya a la página Directiva en Azure Portal.
En el panel izquierdo de la página de Azure Policy, seleccione Definitions (Definiciones).
En el cuadro de lista desplegable Categoría, use Seleccionar todo para borrar el filtro y seleccione Kubernetes.
Seleccione la definición de directiva Los contenedores del clúster de Kubernetes solo deben usar imágenes permitidas.
Seleccione el botón Asignar.
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.
Escriba lo siguiente en el campo Expresión regular de imagen de contenedor permitida y seleccione el botón Revisar y crear.
.+\.azurecr\.io/.+$
- 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.
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.
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".
- Vuelva a la página Directiva en Azure Portal.
- En el panel izquierdo de la página de Azure Policy, seleccione Definitions (Definiciones).
- En el cuadro de lista desplegable Categoría, use Seleccionar todo para borrar el filtro y seleccione Kubernetes.
- 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.
- Seleccione el botón Asignar de la esquina superior izquierda de la pantalla.
- 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.
- 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
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
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
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.
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
A continuación, se describe el objeto ReplicaSet con errores. Copie el nombre del objeto ReplicaSet que empieza por
second-simple-nginx
, actualice el comando siguiente con ese valor y ejecute el comando.kubectl describe replicaset <ReplicaSet name>
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.
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
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
Compruebe que la imagen se ha importado. Debería ver nginx en la lista de resultados.
az acr repository list --name $ACR_NAME
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
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
Obtenga el valor EXTERNAL-IP para que pueda probar si el servicio se ejecuta en el clúster.
kubectl get pods kubectl get services
Copie la dirección IP externa y péguela en el explorador. Verá que la página se carga ahora.
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.