将 C# 部署到 Kubernetes:基础实践指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

将 C# 部署到 Kubernetes:面向 .NET 开发者的实践指南

\n\n

现代 C# (.NET) 开发不仅要求编写高质量的代码,还需要掌握如何正确地将应用程序部署到生产环境。Kubernetes (K8s) 已成为容器编排的事实标准。在本文中,我们将逐步解析将 C# 应用程序部署到 Kubernetes 的完整流程——从容器化到 Ingress 配置。

\n\n

1. 准备 .NET 应用程序和 Docker 镜像

\n\n

在进入 Kubernetes 之前,您的 C# 应用程序必须先打包成 Docker 镜像。我们以一个简单的 ASP.NET Core Web API 为例。

\n\n

创建项目:

\n
dotnet new webapi -n MyK8sApp\ncd MyK8sApp
\n\n

添加一个简单的端点(Program.cs 文件):

\n
var builder = WebApplication.CreateBuilder(args);\nvar app = builder.Build();\n\napp.MapGet("/", () => "Hello from C# on Kubernetes!");\n\napp.Run();
\n\n

现在,在项目根目录下创建 Dockerfile:

\n
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 或本地仓库:

\n
docker build -t yourdockerhub/my-k8s-app:v1 .\ndocker push yourdockerhub/my-k8s-app:v1
\n\n

重要提示: 在 ASP.NET Core 8+ 中,应用程序默认监听 8080 端口,这非常适合 Kubernetes。

\n\n

2. Kubernetes 核心 YAML 清单

\n\n

Kubernetes 通过 YAML 文件管理资源。要运行 C# 应用程序,我们至少需要 Deployment 和 Service。

\n\n

2.1. Deployment (deployment.yaml)

\n

Deployment 负责维护所需数量的 Pod 副本。

\n
apiVersion: 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
\n\n

2.2. Service (service.yaml)

\n

Service 为 Pod 提供稳定的访问入口。

\n
apiVersion: 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\n

ClusterIP 是内部服务,仅在集群内可访问。如需外部访问,请使用 Ingress。

\n\n

3. 配置 Ingress 和 ConfigMap

\n\n

3.1. Ingress (ingress.yaml)

\n

Ingress 通过域名从外部开放服务访问。

\n
apiVersion: 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                

博客

书籍推荐