Despliegue de C# en Kubernetes: guía básica
Kubernetes (K8s) se ha convertido en el estándar de facto para la orquestación de aplicaciones en contenedores. Si desarrollas en C# (.NET), tarde o temprano surgirá la pregunta: ¿cómo empaquetar tu aplicación y ejecutarla en la nube o en tu propio clúster? En esta guía, analizaremos el ciclo completo, desde la creación de una API web simple en ASP.NET Core hasta su despliegue en Kubernetes.
El artículo está dirigido a desarrolladores que ya están familiarizados con los conceptos básicos de C# y Docker, pero que recién comienzan a trabajar con Kubernetes.
1. Preparación de la aplicación .NET y la imagen Docker
Antes de desplegar la aplicación en Kubernetes, es necesario empaquetarla en un contenedor. Crearemos una API web mínima en C#.
- Cree un nuevo proyecto:
dotnet new webapi -n MyK8sAppcd MyK8sApp - Asegúrese de que la aplicación escuche en el puerto 80. En el archivo
Program.cs(oappsettings.json), especifique:builder.WebHost.UseUrls("http://0.0.0.0:80"); - Cree un archivo
Dockerfileen la raíz del proyecto:FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS baseWORKDIR /appEXPOSE 80
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /srcCOPY ["MyK8sApp.csproj", "."]RUN dotnet restore "./MyK8sApp.csproj"COPY . .RUN dotnet build "MyK8sApp.csproj" -c Release -o /app/build
FROM build AS publishRUN dotnet publish "MyK8sApp.csproj" -c Release -o /app/publish
FROM base AS finalWORKDIR /appCOPY --from=publish /app/publish .ENTRYPOINT ["dotnet", "MyK8sApp.dll"] - Construya la imagen y envíela a un registro (por ejemplo, Docker Hub):
docker build -t tudockerhub/my-k8s-app:v1 .docker push tudockerhub/my-k8s-app:v1
Importante: Reemplace tudockerhub por el nombre de usuario real. Para pruebas locales, puede usar minikube y no publicar la imagen; basta con construirla localmente.
2. Creación de manifiestos de Kubernetes
Kubernetes utiliza archivos YAML declarativos para describir el estado deseado del clúster. Necesitaremos dos objetos principales: Deployment (gestión de pods) y Service (acceso de red).
2.1. Deployment
Cree un archivo deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: my-k8s-app-deployment labels: app: my-k8s-appspec: replicas: 2 selector: matchLabels: app: my-k8s-app template: metadata: labels: app: my-k8s-app spec: containers: - name: my-k8s-app image: tudockerhub/my-k8s-app:v1 ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" livenessProbe: httpGet: path: /health port: 80 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /ready port: 80 initialDelaySeconds: 3 periodSeconds: 5En este manifiesto especificamos:
- replicas: 2 — dos instancias de la aplicación para tolerancia a fallos.
- resources — límites de CPU y memoria (importante para la estabilidad del clúster).
- livenessProbe y readinessProbe — verificaciones de estado. Agregue los endpoints
/healthy/readya su controlador.
2.2. Service
Cree un archivo service.yaml:
apiVersion: v1kind: Servicemetadata: name: my-k8s-app-servicespec: selecto