将 C# 部署到 Kubernetes:面向 .NET 开发者的实践指南
\n\n现代 C# (.NET) 开发不仅要求编写高质量的代码,还需要掌握如何正确地将应用程序部署到生产环境。Kubernetes (K8s) 已成为容器编排的事实标准。在本文中,我们将逐步解析将 C# 应用程序部署到 Kubernetes 的完整流程——从容器化到 Ingress 配置。
\n\n1. 准备 .NET 应用程序和 Docker 镜像
\n\n在进入 Kubernetes 之前,您的 C# 应用程序必须先打包成 Docker 镜像。我们以一个简单的 ASP.NET Core Web API 为例。
\n\n创建项目:
\ndotnet new webapi -n MyK8sApp\ncd MyK8sApp\n\n添加一个简单的端点(Program.cs 文件):
var builder = WebApplication.CreateBuilder(args);\nvar app = builder.Build();\n\napp.MapGet("/", () => "Hello from C# on Kubernetes!");\n\napp.Run();\n\n现在,在项目根目录下创建 Dockerfile:
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\n构建镜像并推送到 Docker Hub 或本地仓库:
\ndocker build -t yourdockerhub/my-k8s-app:v1 .\ndocker push yourdockerhub/my-k8s-app:v1\n\n重要提示: 在 ASP.NET Core 8+ 中,应用程序默认监听 8080 端口,这非常适合 Kubernetes。
\n\n2. Kubernetes 核心 YAML 清单
\n\nKubernetes 通过 YAML 文件管理资源。要运行 C# 应用程序,我们至少需要 Deployment 和 Service。
\n\n2.1. Deployment (deployment.yaml)
\nDeployment 负责维护所需数量的 Pod 副本。
\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\n关键点:
\n- \n
replicas: 3— 3 个应用程序实例 \n livenessProbe— 健康检查(建议在 C# 中添加/health端点) \n requests/limits资源限制有助于 K8s 调度器 \n
2.2. Service (service.yaml)
\nService 为 Pod 提供稳定的访问入口。
\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 是内部服务,仅在集群内可访问。如需外部访问,请使用 Ingress。
3. 配置 Ingress 和 ConfigMap
\n\n3.1. Ingress (ingress.yaml)
\nIngress 通过域名从外部开放服务访问。
\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