Bereitstellung von C# auf Kubernetes: Grundlagenleitfaden
Kubernetes (K8s) ist zum De-facto-Standard für die Orchestrierung von Containeranwendungen geworden. Wenn Sie in C# (.NET) entwickeln, stellt sich früher oder später die Frage: Wie verpacken Sie Ihre Anwendung und führen sie in der Cloud oder in Ihrem eigenen Cluster aus? In diesem Leitfaden gehen wir den gesamten Zyklus durch – von der Erstellung einer einfachen Web-API mit ASP.NET Core bis zur Bereitstellung in Kubernetes.
Der Artikel richtet sich an Entwickler, die bereits mit den Grundlagen von C# und Docker vertraut sind, aber gerade erst mit Kubernetes beginnen.
1. Vorbereitung der .NET-Anwendung und des Docker-Images
Bevor Sie die Anwendung in Kubernetes bereitstellen, muss sie in einen Container verpackt werden. Erstellen wir eine minimale Web-API in C#.
- Erstellen Sie ein neues Projekt:
dotnet new webapi -n MyK8sAppcd MyK8sApp - Stellen Sie sicher, dass die Anwendung Port 80 abhört. Geben Sie in der Datei
Program.cs(oderappsettings.json) an:builder.WebHost.UseUrls("http://0.0.0.0:80"); - Erstellen Sie eine Datei
Dockerfileim Stammverzeichnis des Projekts: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"] - Erstellen Sie das Image und senden Sie es an eine Registry (z. B. Docker Hub):
docker build -t yourdockerhub/my-k8s-app:v1 .docker push yourdockerhub/my-k8s-app:v1
Wichtig: Ersetzen Sie yourdockerhub durch den tatsächlichen Benutzernamen. Für lokale Tests können Sie minikube verwenden und das Image nicht veröffentlichen – es reicht, es lokal zu erstellen.
2. Erstellung von Kubernetes-Manifesten
Kubernetes verwendet deklarative YAML-Dateien, um den gewünschten Zustand des Clusters zu beschreiben. Wir benötigen zwei Hauptobjekte: Deployment (Pod-Verwaltung) und Service (Netzwerkzugriff).
2.1. Deployment (Bereitstellung)
Erstellen Sie die Datei 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: 5In diesem Manifest geben wir an:
- replicas: 2 — zwei Instanzen der Anwendung für Ausfallsicherheit.
- resources — CPU- und Speicherbeschränkungen (wichtig für den stabilen Betrieb des Clusters).
- livenessProbe und readinessProbe — Gesundheitschecks. Fügen Sie in Ihrem Controller die Endpunkte
/healthund/readyhinzu.
2.2. Service (Dienst)
Erstellen Sie die Datei service.yaml:
apiVersion: v1kind: Servicemetadata: name: my-k8s-app-servicespec: selecto