Déploiement C# sur Kubernetes : guide pratique pour les développeurs .NET
\n\nLe développement moderne en C# (.NET) nécessite de plus en plus non seulement d'écrire du code de qualité, mais aussi de savoir déployer correctement l'application en environnement de production. Kubernetes (K8s) est devenu le standard de facto pour l'orchestration de conteneurs. Dans cet article, nous allons détailler le processus étape par étape de déploiement d'une application C# sur Kubernetes — de la conteneurisation à la configuration d'Ingress.
\n\n1. Préparation de l'application .NET et de l'image Docker
\n\nAvant d'arriver sur Kubernetes, votre application C# doit être empaquetée dans une image Docker. Prenons l'exemple d'une simple API Web ASP.NET Core.
\n\nCréez le projet :
\ndotnet new webapi -n MyK8sApp\ncd MyK8sApp\n\nAjoutez un endpoint simple (fichier Program.cs) :
var builder = WebApplication.CreateBuilder(args);\nvar app = builder.Build();\n\napp.MapGet("/", () => "Hello from C# on Kubernetes!");\n\napp.Run();\n\nCréons maintenant un Dockerfile à la racine du projet :
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base\nWORKDIR /app\nEXPOSE 8080\n\nFROM mcr.microsoft.com/dotnet/sdk:8.0 AS build\nWORKDIR /src\nCOPY ["MyK8sApp.csproj", "."]\nRUN dotnet restore\nCOPY . .\nRUN dotnet publish -c Release -o /app/publish\n\nFROM base AS final\nWORKDIR /app\nCOPY --from=build /app/publish .\nENTRYPOINT ["dotnet", "MyK8sApp.dll"]\n\nConstruisez et poussez l'image vers Docker Hub ou un registre local :
\ndocker build -t yourdockerhub/my-k8s-app:v1 .\ndocker push yourdockerhub/my-k8s-app:v1\n\nImportant : Dans ASP.NET Core 8+, par défaut, l'application écoute sur le port 8080, ce qui est idéal pour Kubernetes.
\n\n2. Manifestes YAML principaux pour Kubernetes
\n\nKubernetes gère les ressources via des fichiers YAML. Pour exécuter une application C#, nous aurons besoin au minimum d'un Deployment et d'un Service.
\n\n2.1. Deployment (deployment.yaml)
\nLe Deployment est responsable du maintien du nombre souhaité de réplicas de Pods.
\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: my-k8s-app-deployment\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: my-k8s-app\n template:\n metadata:\n labels:\n app: my-k8s-app\n spec:\n containers:\n - name: my-k8s-app\n image: yourdockerhub/my-k8s-app:v1\n ports:\n - containerPort: 8080\n resources:\n requests:\n memory: "64Mi"\n cpu: "250m"\n limits:\n memory: "128Mi"\n cpu: "500m"\n livenessProbe:\n httpGet:\n path: /health\n port: 8080\n initialDelaySeconds: 5\n periodSeconds: 10\n\nPoints clés :
\n- \n
replicas: 3— 3 instances de l'application \n livenessProbe— vérification de l'état de santé (il est recommandé d'ajouter un endpoint/healthen C#) \n - Les ressources
requests/limitsaident le planificateur K8s \n
2.2. Service (service.yaml)
\nLe Service fournit un point d'entrée stable vers les Pods.
\napiVersion: v1\nkind: Service\nmetadata:\n name: my-k8s-app-service\nspec:\n selector:\n app: my-k8s-app\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8080\n type: ClusterIP\n\nClusterIP — service interne, accessible uniquement à l'intérieur du cluster. Pour un accès externe, nous utilisons Ingress.
3. Configuration d'Ingress et ConfigMap
\n\n3.1. Ingress (ingress.yaml)
\nIngress permet d'accéder au service depuis l'extérieur via un nom de domaine.
\napiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: my-k8s-app-ingress\n annotations:\n nginx.ingress.kubernetes.io/rewrite-target: /\nspec:\n rules:\n - host: myapp.example.com\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n ser