Tutorial 2-4: Implementación de la carga de trabajo de Azure Kubernetes Service (AKS) en Azure Enclave

Este tutorial le guía a través de la implementación de un clúster de Azure Kubernetes Service (AKS) privado en Azure Enclave. Cree un clúster de AKS totalmente privado con cifrado administrado por el cliente, integración de red y patrones de acceso seguro.

En este tutorial aprenderá a:

  • Habilitación de las características de Azure necesarias para AKS privado
  • Validación de los recursos necesarios para AKS
  • Implementación de un clúster de AKS privado
  • Configuración del cifrado de claves administradas por el cliente
  • Creación de puntos de conexión de la comunidad para la conectividad de AKS
  • Asociar varios grupos de recursos a una carga de trabajo de AKS
  • Acceso al clúster de AKS y validación

Prerequisites

Importante

Este tutorial se alinea con el comportamiento de la plantilla de clúster de AKS privado y requiere los recursos creados por la implementación de enclave de AVE AKS en el tutorial 2-2.

Antes de empezar

Comprender AKS en Azure Enclave

AKS en Azure Enclave proporciona:

  • Clúster totalmente privado: solo se puede acceder al servidor de API a través del punto de conexión privado.
  • Aislamiento de red: todo el tráfico permanece dentro de los límites del enclave
  • Cifrado administrado por el cliente: tanto el plano de control como el plano de datos cifrados con CMK
  • Límites de carga de trabajo seguros: recursos de Kubernetes contenidos en las directivas de seguridad del enclave

Convenciones de nomenclatura de recursos

En este tutorial se usan nombres de ejemplo. Use la convención de nomenclatura de su organización:

  • Enclave: aks-enclave
  • Carga de trabajo: aks-workload
  • Grupos de recursos: rg-aks-cluster
  • Clúster de AKS: aks-prod-01

Habilitación de las características de Azure necesarias

AKS en Azure Enclave requiere que se habiliten características de Azure específicas en la suscripción.

Habilitación de la característica EncryptionAtHost

Esta característica habilita el cifrado en el nivel de host de máquina virtual para los nodos de AKS.

# Register the feature
az feature register --namespace Microsoft.Compute --name EncryptionAtHost

# Check registration status (may take 10-15 minutes)
az feature show --namespace Microsoft.Compute --name EncryptionAtHost

# Once registered, refresh the provider
az provider register --namespace Microsoft.Compute

Habilitación de la integración de red virtual de API Server (versión preliminar)

Esta característica permite que el servidor de API de AKS se integre directamente en la red virtual.

# Register the feature
az feature register --namespace Microsoft.ContainerService --name EnableAPIServerVnetIntegrationPreview

# Check registration status
az feature show --namespace Microsoft.ContainerService --name EnableAPIServerVnetIntegrationPreview

# Once registered, refresh the provider
az provider register --namespace Microsoft.ContainerService

Importante

Espere a que ambas características se muestren "state": "Registered" antes de continuar. El registro suele tardar entre 10 y 15 minutos.

Preparación de la clave SSH (opcional)

Note

La autenticación de clave SSH para el acceso al nodo de AKS está en desuso. Este paso es necesario actualmente, pero será opcional en futuras versiones de plantilla. Si no necesita acceso directo al nodo, puede omitir esta sección cuando se actualice la plantilla.

Generar par de claves SSH

# Create .ssh directory if it doesn't exist
$sshDir = "$env:USERPROFILE\.ssh"
if (-not (Test-Path $sshDir)) {
    New-Item -ItemType Directory -Path $sshDir
}

# Generate SSH key pair
ssh-keygen -t rsa -b 4096 -f "$sshDir\aks-nodes" -N '""'

# Display the public key
Get-Content "$sshDir\aks-nodes.pub"

Almacenamiento de la clave SSH en Key Vault

# Read the SSH public key
$sshPublicKey = Get-Content "$env:USERPROFILE\.ssh\aks-nodes.pub" -Raw

# Store in Key Vault as a secret
az keyvault secret set `
    --vault-name "kv-ave-shared-<uniqueid>" `
    --name "aks-ssh-public-key" `
    --value $sshPublicKey

Implementación de un clúster de AKS privado

Ahora implemente el clúster de AKS con cifrado y supervisión completos.

Uso de una plantilla de catálogo de servicios

  1. En la carga de trabajo de AKS, seleccione + Agregar un servicio Azure.
  2. Busque y seleccione Clúster de AKS privado.
  3. Configurar la implementación:

Pestaña Aspectos básicos

  • Nombre del clúster de AKS: aks-prod-01
  • Versión de Kubernetes: seleccione la versión estable más reciente (por ejemplo, 1.32)

Monitorización

  • Nombre del área de trabajo de Log Analytics: Seleccione el destino de registro de su enclave o comunidad.

Encryption

  • Nombre del conjunto de cifrado de disco: escriba el nombre que usó en el Tutorial 2-2.
  • Nombre de la clave de cifrado: escriba el nombre de la clave del almacén de claves.
  • Key Vault: seleccione el almacén de claves que tenga ese nombre de clave.

Acceso

  • Nombre de identidad de AKS: escriba el nombre que usó en el Tutorial 2-2.
  • Nombre del grupo de recursos de identidad de AKS: actualice el nombre del grupo de recursos para que coincida con la ubicación de la identidad.

Networking

  • Nombre de subred de AKS: escriba el nombre de la subred de AKS.
  • Nombre de subred del grupo de agentes: escriba el nombre de la subred del grupo de agentes.
  • CIDR para el tráfico de servicio: 172.16.0.0/16
  • Dirección IP del servicio DNS de Kubernetes: 172.16.0.10

Configuración de subred:

  • Subred del nodo: Seleccione aksSubnet de su enclave
  • Subred del servidor de API: Selecciona agentSubnet de tu enclave
  • Subred de extremo privado: Seleccione AzureVirtualEnclaveSubnet de su enclave

Grupo de nodos

Seleccione Next para omitir esta pestaña en este tutorial.

Etiquetas

  • Entorno: Production
  • Carga de trabajo: AKS
  • Gestionado por: Azure Enclave
  1. Seleccione Revisar + crear.
  2. Revise cuidadosamente todas las configuraciones.
  3. Selecciona Crear.

Note

El clúster de AKS crea automáticamente un grupo de recursos administrado.

Creación de puntos de conexión de la comunidad para la conectividad de AKS

AKS requiere conectividad saliente a varios servicios de Azure. Crea puntos de conexión de comunidad para estos requisitos.

Note

Si has creado puntos de conexión de comunidad de AKS en el Tutorial 2-1, comprueba que incluyan todos los FQDN necesarios.

Configuración del punto de conexión de la comunidad

  1. Ve a tu comunidad (por ejemplo, cmt-fabrikam).

  2. Seleccione Puntos de conexión comunitarios>+ Crear o edite uno existentece-aks-services.

  3. Asegúrese de que existen estas reglas:

    Regla 1: Microsoft Container Registry

    • Nombre: mcr
    • Destino: mcr.microsoft.com,*.data.mcr.microsoft.com
    • Protocolo: HTTPS
    • Puerto: 443

    Regla 2: Administración de AKS

    • Nombre: aks-management
    • Destino: *.hcp.<region>.azmk8s.io,<region>.dp.kubernetesconfiguration.azure.com
    • Protocolo: HTTPS
    • Puerto: 443

    Regla 3: administración de Azure

    • Nombre: azure-management
    • Destino: management.azure.com,login.microsoftonline.com
    • Protocolo: HTTPS
    • Puerto: 443

    Regla 4: Repositorio de paquetes

    • Nombre: packages
    • Destino: packages.microsoft.com,acs-mirror.azureedge.net,azure.archive.ubuntu.com
    • Protocolo: HTTPS
    • Puerto: 443

    Regla 5: Azure Monitor (si está habilitada)

    • Nombre: monitoring
    • Destino: *.ods.opinsights.azure.com,*.oms.opinsights.azure.com,dc.services.visualstudio.com
    • Protocolo: HTTPS
    • Puerto: 443
  4. Seleccione Revisar y crear y, a continuación, Crear o Guardar.

Configuración de reglas de salida de NSG

Agregue reglas de seguridad de salida a su NSG para permitir el tráfico de AKS.

  1. Vaya a Grupos de seguridad de red>nsg-aks-nodes.
  2. Seleccione Reglas de seguridad> de salida+ Agregar.
  3. Agregue una regla para la salida HTTPS:
    • Fuente: VirtualNetwork
    • Destino: Internet
    • Puerto de destino: 443
    • Protocolo: TCP
    • Acción: Allow
    • Prioridad: 1000
    • Nombre: Allow_HTTPS_Outbound

Asociar grupos de recursos de AKS a la carga de trabajo

AKS crea un grupo de recursos administrado (MRG) para la infraestructura del clúster. Asocia tanto el grupo de recursos de usuario como el MRG a tu carga de trabajo.

Uso del portal de Azure

  1. Vaya al servicio Azure Enclave en el portal de Azure.
  2. Seleccione la comunidad (por ejemplo, cmt-fabrikam).
  3. Seleccione Enclaves y abra el enclave de AKS (por ejemplo, ve-aks).
  4. Seleccione Cargas de trabajo y abra la carga de trabajo de AKS (por ejemplo, wl-aks).
  5. En la información general de la carga de trabajo, seleccione Propiedades o Grupos de recursos vinculados.
  6. Seleccione + Agregar grupo de recursos.
  7. Agregue el grupo de recursos de usuario:
    • Seleccione Suscripción: Su suscripción.
    • Seleccione Grupo de recursos: rg-aks-cluster
    • Seleccione Agregar.
  8. Vuelva a seleccionar + Agregar grupo de recursos de nuevo.
  9. Agregue el grupo de recursos administrados de AKS:
    • El nombre del RG administrado sigue el siguiente patrón: MC_rg-aks-cluster_aks-prod-01_<region>
    • Seleccione Suscripción: Su suscripción.
    • Seleccionar grupo de recursos: el grupo de recursos administrado de AKS
    • Seleccione Agregar.
  10. Compruebe que ambos grupos de recursos aparecen en la lista de grupos de recursos vinculados de la carga de trabajo.

Sugerencia

Para buscar el nombre del grupo de recursos administrados de AKS, vaya al clúster de AKS en el portal y compruebe la propiedad Grupo de recursos node en la página Información general.

Acceso al clúster de AKS

Acceda al clúster de AKS privado a través de una máquina virtual de administración o Azure Bastion dentro del enclave.

Conexión a la máquina virtual de administración

  1. Conéctese a la máquina virtual de administrador a través de Azure Bastion o RDP.
  2. Asegúrese de que la máquina virtual de administración tiene CLI de Azure instalado.
  3. Inicie sesión en Azure:
az login

Obtención de credenciales de AKS

# Get cluster credentials
az aks get-credentials `
    --resource-group rg-aks-cluster `
    --name aks-prod-01 `
    --admin

# Verify connection
kubectl get nodes

La salida esperada muestra los nodos con estado Ready:

NAME                                STATUS   ROLES   AGE   VERSION
aks-systempool-12345678-vmss000000  Ready    agent   5m    v1.29.5
aks-systempool-12345678-vmss000001  Ready    agent   5m    v1.29.5
aks-systempool-12345678-vmss000002  Ready    agent   5m    v1.29.5

Desplegar carga de trabajo de prueba

Implemente una aplicación de ejemplo para validar el clúster.

Creación de un espacio de nombres

kubectl create namespace test-app

Implementación de una aplicación de ejemplo

# Save as test-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: test-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: mcr.microsoft.com/oss/nginx/nginx:1.25.3
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: test-app
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
# Apply the deployment
kubectl apply -f test-deployment.yaml

# Check deployment status
kubectl get deployments -n test-app
kubectl get pods -n test-app
kubectl get services -n test-app

Validación de la implementación

Realice una validación completa del clúster de AKS.

Comprobación del estado del clúster

# Check node status
kubectl get nodes -o wide

# Check system pods
kubectl get pods -n kube-system

# Check node conditions
kubectl describe nodes | grep -A 5 Conditions

Comprobación del cifrado

# Check if encryption at host is enabled
az aks show --resource-group rg-aks-cluster --name aks-prod-01 --query "securityProfile.enableEncryptionAtHost"

# Check disk encryption set
az aks show --resource-group rg-aks-cluster --name aks-prod-01 --query "diskEncryptionSetId"

Valide la conectividad de red.

# Test DNS resolution
kubectl run -it --rm debug --image=mcr.microsoft.com/dotnet/runtime-deps:6.0 --restart=Never -- nslookup kubernetes.default

# Test internet connectivity through community endpoints
kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- curl -I https://mcr.microsoft.com

# Check service connectivity
kubectl get services -A

Comprobación de la supervisión y los registros

# Check if Container Insights is enabled
az aks show --resource-group rg-aks-cluster --name aks-prod-01 --query "addonProfiles.omsagent.enabled"

# Query logs in Log Analytics
az monitor log-analytics query `
    --workspace <workspace-id> `
    --analytics-query "ContainerLog | where TimeGenerated > ago(1h) | limit 10"

Comprobación del cumplimiento de Azure Policy

# Check Azure Policy add-on status
kubectl get pods -n kube-system | grep azure-policy

# View policy violations (if any)
kubectl get constrainttemplates
kubectl get constraints

Configuración del acceso kubectl para otros usuarios

Conceda a otros usuarios acceso al clúster de AKS.

Uso de Azure RBAC

# Assign Azure Kubernetes Service Cluster User Role
az role assignment create `
    --assignee user@contoso.com `
    --role "Azure Kubernetes Service Cluster User Role" `
    --scope "/subscriptions/<subscription-id>/resourceGroups/rg-aks-cluster/providers/Microsoft.ContainerService/managedClusters/aks-prod-01"

# For admin access
az role assignment create `
    --assignee user@contoso.com `
    --role "Azure Kubernetes Service Cluster Admin Role" `
    --scope "/subscriptions/<subscription-id>/resourceGroups/rg-aks-cluster/providers/Microsoft.ContainerService/managedClusters/aks-prod-01"

Uso del RBAC de Kubernetes

# Create role binding for namespace access
kubectl create rolebinding user-viewer `
    --clusterrole=view `
    --user=user@contoso.com `
    --namespace=test-app

Solucionar los problemas comunes

Se produce un error en la creación del clúster

Síntoma: falla el despliegue del clúster de AKS

Soluciones:

  • Compruebe que las marcas de características están registradas: EncryptionAtHost, EnableAPIServerVnetIntegrationPreview
  • Compruebe que los tamaños de subred son adecuados para el número de nodos y la densidad de pods.
  • Comprobación de que el conjunto de cifrado de disco y la identidad administrada tienen los permisos adecuados
  • Revisión del registro de actividad para ver mensajes de error específicos

Nodos no listos

Síntoma: los nodos muestran NotReady el estado

Soluciones:

  • Comprobación de que la subred del nodo tiene conectividad saliente a los puntos de conexión necesarios
  • Verificar que los puntos de conexión comunitarios incluyen todos los FQDN de AKS necesarios
  • Compruebe que las reglas de NSG permiten el tráfico saliente en el puerto 443
  • Revise los registros de nodo: kubectl describe node <node-name>

Los pods no pueden descargar imágenes

Síntoma: Pods atascados en ImagePullBackOff

Soluciones:

  • Verificar que el punto de conexión de la comunidad incluya mcr.microsoft.com y *.data.mcr.microsoft.com
  • Comprobar que el NSG permite HTTPS saliente (puerto 443)
  • Asegúrate de que la resolución de DNS funciona: nslookup mcr.microsoft.com desde el pod
  • Revise los secretos para extraer imágenes si utiliza registros privados

No se puede conectar al servidor de API

Síntoma: kubectl se produce un error en los comandos con el tiempo de espera de conexión

Soluciones:

  • Compruebe que está en una máquina virtual o recurso de administración con conectividad de enclave
  • Comprobación de que la zona DNS privada está vinculada a la red virtual
  • Comprobación de la configuración de subred del servidor de API
  • Pruebe la resolución DNS: nslookup <cluster-fqdn>

La supervisión no funciona

Síntoma: no hay registros ni métricas en Azure Monitor

Soluciones:

  • Comprobación de que el complemento de Container Insights está habilitado
  • Comprueba que los puntos de conexión de la comunidad incluyan los FQDN de supervisión
  • Comprobación de que el área de trabajo de Log Analytics sea accesible desde el clúster
  • Comprueba que los omsagent pods se estén ejecutando: kubectl get pods -n kube-system | grep omsagent

Limpieza de recursos

Para evitar cargos continuos, elimine los recursos cuando ya no sea necesario.

Eliminación del clúster de AKS

# Delete AKS cluster (also deletes managed resource group)
az aks delete --resource-group rg-aks-cluster --name aks-prod-01 --yes --no-wait

# Delete user resource group
az group delete --name rg-aks-cluster --yes --no-wait

# Delete infrastructure resource group
az group delete --name rg-aks-infrastructure --yes --no-wait

Advertencia

Al eliminar el clúster de AKS, se quitan permanentemente todas las cargas de trabajo y los datos. Asegúrese de que tiene copias de seguridad si es necesario.

Pasos siguientes

Ha completado la serie de tutoriales para implementar cargas de trabajo de AKS y Azure Virtual Desktop en Azure Enclave.