将 C# 应用部署到 Kubernetes:基础指南
Kubernetes (K8s) 已成为容器化应用编排的事实标准。如果您使用 C# (.NET) 进行开发,迟早会面临一个问题:如何打包您的应用并在云上或您自己的集群中运行它。在本指南中,我们将介绍完整的流程——从创建一个基于 ASP.NET Core 的简单 Web API,到将其部署到 Kubernetes。
本文面向已经熟悉 C# 和 Docker 基础知识,但刚开始使用 Kubernetes 的开发人员。
1. 准备 .NET 应用和 Docker 镜像
在将应用部署到 Kubernetes 之前,需要先将其打包到容器中。让我们创建一个最小的 C# Web API。
- 创建一个新项目:
dotnet new webapi -n MyK8sAppcd MyK8sApp - 确保应用监听 80 端口。在
Program.cs(或appsettings.json)文件中指定:builder.WebHost.UseUrls("http://0.0.0.0:80"); - 在项目根目录创建
Dockerfile文件: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"] - 构建镜像并将其推送到仓库(例如 Docker Hub):
docker build -t yourdockerhub/my-k8s-app:v1 .docker push yourdockerhub/my-k8s-app:v1
重要提示: 将 yourdockerhub 替换为实际的用户名。对于本地测试,可以使用 minikube 并且无需发布镜像——在本地构建即可。
2. 创建 Kubernetes 清单文件
Kubernetes 使用声明式的 YAML 文件来描述集群的期望状态。我们需要两个主要对象:Deployment(Pod 管理)和 Service(网络访问)。
2.1. Deployment(部署)
创建 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: 5在此清单中,我们指定了:
- replicas: 2 — 两个应用实例以实现容错。
- resources — CPU 和内存限制(对于集群稳定运行很重要)。
- livenessProbe 和 readinessProbe — 健康检查。请在您的控制器中添加
/health和/ready端点。
2.2. Service(服务)
创建 service.yaml 文件:
apiVersion: v1kind: Servicemetadata: name: my-k8s-app-servicespec: selecto