Preparación para la Certificación Microsoft AI-200
Implementar y exponer API de inferencia de IA en Azure Kubernetes Service
Crea manifiestos Deployment y Service de Kubernetes, conecta AKS con imágenes de contenedor, publica puntos de conexión estables, comprueba cargas con kubectl y diagnostica los errores más frecuentes.
Tiempo de estudio sugerido: 80 minutos • Nivel intermedio • Reescritura original completa con versión resumida de cada tema, evaluación comentada y laboratorio AKS guiado
Por João Ricardo Dutra••Contenido original completo
1. De una imagen de contenedor a un punto de conexión de IA de alta disponibilidad
opera un plano de control de Kubernetes administrado sobre . Tú aportas la capacidad del clúster y las definiciones de las cargas, mientras administra la infraestructura del plano de control. Es apropiado para de inferencia, búsqueda vectorial y otros componentes de IA que necesitan implementación repetible, resistencia, escalado y acceso de red.
Una FastAPI en contenedor solo se vuelve operable cuando Kubernetes sabe qué ejecutar, cuántas copias mantener, qué recursos y configuración necesita y cómo llegarán los clientes. Los manifiestos describen ese estado deseado y el clúster reconcilia continuamente la realidad con la declaración.
Pod es la unidad implementable más pequeña y normalmente contiene un contenedor de aplicación.
crea, sustituye y mantiene el número solicitado de Pods.
Service proporciona o estable y distribuye tráfico por etiquetas.
kubectl envía manifiestos, consulta estados, lee registros y muestra eventos de diagnóstico.
Resumen del tema
administra la orquestación; Pods ejecutan contenedores, Deployments mantienen réplicas, Services estabilizan el acceso y kubectl controla y diagnostica la carga.
2. Cómo colaboran Pods, Deployments, Services y etiquetas
Ejecutar un Pod directamente es posible, pero frágil. Un controla un ReplicaSet, este mantiene los Pods y reemplaza una instancia con error. Un Service no almacena direcciones efímeras: su selector encuentra Pods con etiquetas coincidentes y reenvía conexiones a esos puntos de conexión.
El contrato de etiquetas es crítico. Si la plantilla usa app: inference- y el Service selecciona otro valor, el Service existe sin . Los nombres de y Service no deben coincidir; el puerto 80 del Service puede reenviar correctamente al 8080 del contenedor.
controla el ciclo de vida; Service descubre etiquetas coincidentes y aporta conectividad estable.
Resumen del tema
controla el ciclo de los Pods y Service los descubre por etiquetas; son las etiquetas, no los nombres de objetos, las que conectan ambos recursos.
3. Anatomía de un manifiesto de Kubernetes
Un usa apiVersion apps/v1 y kind . identifica el objeto y puede indicar un . spec declara replicas, selector y la plantilla de Pod. La plantilla repite la etiqueta elegida y contiene los contenedores. El archivo declarativo se puede revisar, versionar y volver a aplicar.
La referencia de imagen sigue registro.azurecr.io/repositorio:etiqueta. Compila y envía la imagen antes de implementar, comprueba que el clúster pueda acceder, incluye código y dependencias y prefiere una etiqueta de versión inmutable a latest cuando necesites reproducibilidad.
Resumen del tema
El manifiesto reúne identidad, réplicas, etiquetas, plantilla de Pod, imagen, puertos, recursos y configuración en un documento versionable del estado deseado.
4. Réplicas, disponibilidad, solicitudes y límites de recursos
Dos réplicas ofrecen tolerancia básica al error de un Pod; tres son una base más sólida para producción; cuatro o más deben justificarse con tráfico y pruebas porque cada copia consume cómputo. Kubernetes reinicia Pods con error, pero varias réplicas permiten seguir atendiendo durante la recuperación.
Las solicitudes reservan recursos para la programación. Si ningún nodo dispone de la CPU o memoria solicitada, el Pod queda Pending. Los límites restringen el consumo: la CPU se ralentiza y superar memoria puede provocar OOMKilled y reinicio. Para un modelo pequeño, 2–4 GiB, cerca de 20 % de margen y uno o dos núcleos son solo un punto inicial.
Campos de recursos y efecto operativo.
Campo
Propósito
Señal de error
replicas
Copias simultáneas del Pod
Pocas copias reducen resistencia y rendimiento.
.cpu / memory
Garantía para el programador
Solicitudes grandes dejan Pods Pending.
limits.cpu
Máximo de CPU
La presión sostenida causa y latencia.
limits.memory
Máximo de memoria
El exceso puede terminar con OOMKilled.
Resumen del tema
Usa réplicas para resistencia y rendimiento medido; define solicitudes para programación y límites para contención y ajústalos al comportamiento real del modelo.
5. Variables de entorno, secretos y acceso al registro
Usa variables literales para valores no confidenciales, como nombre de modelo y . Para claves y credenciales, referencia un Secret mediante valueFrom y secretKeyRef. Créalo por separado con kubectl create secret generic -secrets --from-literal=-key=<valor>. Nunca confirmes el valor en el manifiesto o historial.
también debe autenticarse en . Para un registro normal, la integración concede AcrPull a la de kubelet. Un registro con requiere Registry Repository Reader. Un registro privado externo puede usar image pull Secret. Comprueba el modelo aplicable.
Resumen del tema
Mantén configuración ordinaria en variables, valores sensibles en Secrets referenciados y concede a kubelet el rol mínimo correcto para extraer imágenes.
6. Elegir el tipo correcto de Service de Kubernetes
Las de Pods son efímeras. Un Service crea un punto virtual persistente y sigue enviando a Pods coincidentes tras reemplazos. El tipo correcto depende de quién deba llamar la carga.
Tipos de Service en .
Tipo
Alcance
Uso habitual
Solo dentro del clúster; predeterminado
interna, base vectorial o comunicación entre servicios.
Puerto alto en cada de nodo
Acceso simple de desarrollo o integración con balanceador externo.
LoadBalancer
público o privado administrado por
de producción expuesta a Internet o de forma privada.
ExternalName
Alias a nombre externo; sin balanceo
Representar una dependencia externa como Service.
Para varias aplicaciones , terminación o reglas de host y ruta, Ingress puede ser más adecuado que un LoadBalancer público por Service. El módulo se concentra en los cuatro tipos anteriores.
Resumen del tema
Usa internamente, en escenarios directos limitados, LoadBalancer para exposición administrada y ExternalName como alias externo.
7. Manifiesto Service, selectores y asignación de puertos
El manifiesto usa apiVersion v1 y kind Service. type controla exposición, selector vincula etiquetas, port recibe clientes y targetPort reenvía a la aplicación. El puerto 80 puede dirigir a FastAPI en 8080; suele usar 443 cuando la terminación está configurada.
El tipo cambia la entrada; selector y targetPort mantienen el contrato final con los Pods.
Dentro del clúster, sigue nombreservice..svc..local. usa -nodo:, normalmente por encima de 30000. LoadBalancer usa la dirección externa que muestra kubectl svc.
Resumen del tema
El selector debe coincidir con las etiquetas; port recibe al cliente y targetPort reenvía al proceso de aplicación.
8. Aplicar manifiestos y comprender la reconciliación
kubectl apply lee y crea o actualiza objetos. Kubernetes descarga imágenes, programa Pods, inicia contenedores, crea el Service y aprovisiona la red. Es asíncrono: éxito significa que el estado deseado fue aceptado, no que Pods e pública estén listos.
Aplicar un directorio es cómodo, pero puede enviar no relacionado. Mantén los artefactos delimitados y revisa cambios. Volver a aplicar es idempotente en el modelo declarativo: el plano de control compara configuración y estado vivo.
Resumen del tema
Usa kubectl apply para declarar recursos y observa la reconciliación aparte, porque Pods, descarga de imágenes y terminan de forma asíncrona.
9. Comprobar Pods, , Service, registros y conectividad
Una implementación sana muestra READY esperado, Pods Running, AVAILABLE igual al objetivo y dirección de Service coherente. Pending puede ser transitorio; indica fallos repetidos. EXTERNAL- de LoadBalancer puede quedar pending durante el aprovisionamiento.
kubectl get pods
kubectl get deployment
kubectl get svc inference-api-service
kubectl logs -l app=inference-api
# Test an internal ClusterIP Service
kubectl run -it --rm debug --image=alpine:latest --restart=Never -- sh
wget http://inference-api-service:80
# Test a public LoadBalancer address
curl http://<EXTERNAL-IP>
curl http://<EXTERNAL-IP>/predict -X POST -d '{"input":"test"}'
Para acceso interno, inicia un Pod de depuración desechable y llama al Service. Para acceso externo, prueba la pública y una ruta real de inferencia. Estado, preparación e inferencia validan capas distintas: un proceso puede estar vivo sin tener el modelo listo.
La implementación termina después de validar imagen, estado de Kubernetes, red y comportamiento.
Resumen del tema
Revisa estado, registros y dirección del Service y prueba salud, preparación e inferencia real; aceptar el manifiesto no completa la implementación.
10. Diagnosticar y
significa que el nodo no pudo obtener la imagen. Revisa eventos, host, repositorio y etiqueta, confirma su existencia con az acr repository list o show-tags y valida el rol entre y el registro. docker pull manual separa una referencia inválida de un problema de permisos.
significa que el contenedor inicia y sale repetidamente. Lee registros actuales y --previous y describe el Pod. Causas comunes: variable ausente, Secret inaccesible, comando o puerto incorrecto, fallo al cargar el modelo o configuración no montada. Ejecuta la imagen localmente para aislar el origen.
# Image pull or scheduling events
kubectl describe pod <pod-name>
# Current and previous-container logs
kubectl logs <pod-name>
kubectl logs <pod-name> --since=10m
kubectl logs <pod-name> --previous
# Capacity and Service selectors
kubectl get nodes
kubectl top nodes
kubectl get pods --show-labels
kubectl get pods -L app
kubectl describe svc inference-api-service
Resumen del tema
Usa eventos para imagen y programación, registros actuales y anteriores para errores de aplicación y compara permisos, manifiesto y ejecución local.
11. Diagnosticar Pods Pending y Services sin
Un Pod persistentemente Pending no puede programarse por falta de CPU o memoria solicitada, restricción o problema de nodo. Describe Pod y nodos, consulta kubectl top nodes si Metrics Server está disponible, reduce solicitudes irreales o aumenta capacidad con az aks scale después de validar coste y cuota.
Un Service con : <none> no reenvía tráfico. Compara kubectl pods --show-labels o -L app con kubectl describe svc. Corrige la etiqueta o selector y verifica que los Pods estén Ready.
Resumen del tema
Pending es principalmente una investigación de capacidad y programación; sin es una investigación de etiquetas, preparación y selectores.
12. Ejercicio guiado: implementar una de inferencia de IA
El laboratorio dura unos 30–40 minutos. Implementa un modelo de , y un clúster ; completa . y service. con contenedor, sondeos, límites y balanceo; y usa un cliente Python para probar salud, preparación e inferencia.
Descarga el proyecto inicial y revisa la aplicación y los marcadores de manifiestos.
Implementa recursos de con una identidad autorizada.
Completa imagen, sondeos, solicitudes, límites, etiquetas, selectores y puertos.
Aplica manifiestos, espera Pods y dirección del LoadBalancer y diagnostica fallos.
Ejecuta pruebas de salud, preparación e inferencia y elimina recursos desechables.
Requisitos: suscripción de ,, Python 3.12 o posterior, la CLI de más reciente y kubectl. Las tareas de pueden no estar cubiertas por créditos gratuitos y exigir pago por uso u otro plan de pago.
Resumen del tema
El laboratorio une ,,,, sondeos, recursos, balanceo y pruebas Python en un flujo completo.
13. Revisión de la evaluación y decisiones de examen
Justificación de las respuestas.
Pregunta
Respuesta correcta
Motivo
Internet con balanceo administrado por
LoadBalancer
Aprovisiona y dirección externa.
Solicitudes superan todos los nodos
El Pod permanece Pending
El programador no encuentra capacidad.
Contrato entre y Service
Etiquetas de plantilla coinciden con selector
Los selectores descubren por etiqueta.
Registros de contenedor reiniciado
kubectl <pod-name> --previous
Lee la instancia terminada anterior.
Campo replicas
Número de copias simultáneas de Pod
El controlador mantiene ese estado.
Resumen del tema
LoadBalancer expone, afecta la programación, etiquetas conectan Service y Pods, --previous recupera el fallo anterior y replicas controla copias.
14. Lista de producción y referencias oficiales
Usa etiquetas de imagen inmutables y valida autenticación -registro.
Mantén secretos fuera de Git y referencia Secrets o una solución externa.
Define solicitudes, límites, réplicas y sondeos a partir de pruebas.
Haz coincidir etiquetas y selectores y valida port con targetPort.
Observa Pods, disponibilidad, , eventos, registros, salud, preparación e inferencia.
Prefiere exposición privada, , Ingress, directivas de red y privilegio mínimo cuando proceda.
La preparación de producción combina imágenes repetibles, acceso mínimo, recursos y sondeos demostrados, red estable y observabilidad por capas respaldada por documentación actual.