Déploiement C# sur Kubernetes : guide de base
Kubernetes (K8s) est devenu le standard de facto pour l'orchestration d'applications conteneurisées. Si vous développez en C# (.NET), tôt ou tard se posera la question : comment empaqueter votre application et l'exécuter dans le cloud ou sur votre propre cluster. Dans ce guide, nous allons parcourir le cycle complet — de la création d'une simple API web ASP.NET Core à son déploiement dans Kubernetes.
Cet article s'adresse aux développeurs qui connaissent déjà les bases de C# et Docker, mais qui commencent tout juste à travailler avec Kubernetes.
1. Préparation de l'application .NET et de l'image Docker
Avant de déployer une application dans Kubernetes, il faut l'empaqueter dans un conteneur. Créons une API web minimale en C#.
- Créez un nouveau projet :
dotnet new webapi -n MyK8sAppcd MyK8sApp - Assurez-vous que l'application écoute sur le port 80. Dans le fichier
Program.cs(ouappsettings.json), indiquez :builder.WebHost.UseUrls("http://0.0.0.0:80"); - Créez un fichier
Dockerfileà la racine du projet :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"] - Construisez l'image et envoyez-la dans un registre (par exemple, Docker Hub) :
docker build -t yourdockerhub/my-k8s-app:v1 .docker push yourdockerhub/my-k8s-app:v1
Important : Remplacez yourdockerhub par le nom d'utilisateur réel. Pour les tests locaux, vous pouvez utiliser minikube et ne pas publier l'image — il suffit de la construire localement.
2. Création des manifestes Kubernetes
Kubernetes utilise des fichiers YAML déclaratifs pour décrire l'état souhaité du cluster. Nous aurons besoin de deux objets principaux : Deployment (gestion du pod) et Service (accès réseau).
2.1. Deployment (déploiement)
Créez le fichier 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: yourdockerhub/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: 5Dans ce manifeste, nous spécifions :
- replicas: 2 — deux instances de l'application pour la tolérance aux pannes.
- resources — limites de CPU et de mémoire (important pour le fonctionnement stable du cluster).
- livenessProbe et readinessProbe — vérifications de santé. Ajoutez les endpoints
/healthet/readyà votre contrôleur.
2.2. Service (service)
Créez le fichier service.yaml :
apiVersion: v1kind: Servicemetadata: name: my-k8s-app-servicespec: selecto