Introducción: ¿Por qué ejecutar C# en Kubernetes?
El desarrollo moderno en C# (.NET) requiere cada vez más una infraestructura escalable y tolerante a fallos. Kubernetes (K8s) se ha convertido en el estándar para la orquestación de contenedores, permitiendo automatizar el despliegue, escalado y gestión de aplicaciones. En esta guía, mostraremos cómo convertir tu aplicación C# en un contenedor y ejecutarla en un clúster de Kubernetes en la práctica.
Aprenderás cómo preparar una imagen Docker, escribir manifiestos para Kubernetes y realizar el despliegue usando kubectl. El artículo está dirigido a desarrolladores que ya conocen los fundamentos de C# y quieren dominar las prácticas modernas de DevOps.
1. Preparación de la aplicación C# para la contenerización
Antes de desplegar la aplicación en Kubernetes, es necesario empaquetarla en una imagen Docker. Como ejemplo, tomaremos una aplicación simple de ASP.NET Core Web API.
1.1. Creación del proyecto
Crea un nuevo proyecto usando .NET CLI:
dotnet new webapi -n MyK8sAppcd MyK8sAppAsegúrate de que la aplicación funcione localmente:
dotnet runPor defecto, la aplicación estará disponible en http://localhost:5000.
1.2. Adición del Dockerfile
En la raíz del proyecto, crea un archivo Dockerfile (sin extensión). Usa una compilación de múltiples etapas para optimizar el tamaño de la imagen:
# Etapa de compilaciónFROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /appCOPY *.csproj ./RUN dotnet restoreCOPY . ./RUN dotnet publish -c Release -o out
# Etapa de ejecuciónFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appCOPY --from=build /app/out ./ENV ASPNETCORE_URLS=http://+:80EXPOSE 80ENTRYPOINT ["dotnet", "MyK8sApp.dll"]1.3. Compilación y verificación de la imagen Docker
Compila la imagen y ejecútala localmente:
docker build -t myk8sapp:latest .docker run -d -p 8080:80 --name myapp myk8sapp:latestVerifica que la aplicación responda: curl http://localhost:8080/weatherforecast (o ábrelo en el navegador).
2. Escritura de manifiestos de Kubernetes
Para el despliegue en Kubernetes, se necesitan archivos YAML que describan el estado deseado de la aplicación. El conjunto mínimo incluye Deployment y Service.
2.1. Creación del Deployment
Archivo deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: myk8sapp-deployment labels: app: myk8sappspec: replicas: 2 selector: matchLabels: app: myk8sapp template: metadata: labels: app: myk8sapp spec: containers: - name: myk8sapp image: myk8sapp:latest ports: - containerPort: 80 env: - name: ASPNETCORE_ENVIRONMENT value: "Production" resources: requests: memory: "128Mi" cpu: "250m" limits: memory: "256Mi" cpu: "500m"Importante: Si usas un clúster local (por ejemplo, Minikube o Kind), la imagen debe estar disponible dentro del clúster. O especifica imagePullPolicy: Never para imágenes locales.
2.2. Creación del Service
Archivo service.yaml:
apiVersion: v1kind: Servicemetadata: name: myk8sapp-servicespec: selector: app: myk8sapp ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancerEl tipo LoadBalancer es adecuado para proveedores en la nube. Para clústeres locales, usa NodePort o ClusterIP con reenvío de puertos mediante kubectl port-forward.
3. Despliegue y verificación de la aplicación
Ahora que los manifiestos están listos, realiza el despliegue en el clúster de Kubernetes.