Implantação de C# no Kubernetes: guia básico
Kubernetes (K8s) tornou-se o padrão de facto para orquestração de aplicações em contêineres. Se você desenvolve em C# (.NET), mais cedo ou mais tarde surgirá a questão: como empacotar sua aplicação e executá-la na nuvem ou em seu próprio cluster. Neste guia, abordaremos o ciclo completo — desde a criação de uma Web API simples em ASP.NET Core até sua implantação no Kubernetes.
O artigo é voltado para desenvolvedores que já conhecem os fundamentos de C# e Docker, mas estão começando a trabalhar com Kubernetes.
1. Preparação da aplicação .NET e da imagem Docker
Antes de implantar a aplicação no Kubernetes, é necessário empacotá-la em um contêiner. Vamos criar uma Web API mínima em C#.
- Crie um novo projeto:
dotnet new webapi -n MyK8sAppcd MyK8sApp - Certifique-se de que a aplicação escuta na porta 80. No arquivo
Program.cs(ouappsettings.json), especifique:builder.WebHost.UseUrls("http://0.0.0.0:80"); - Crie um arquivo
Dockerfilena raiz do projeto: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"] - Construa a imagem e envie-a para um registro (por exemplo, Docker Hub):
docker build -t yourdockerhub/my-k8s-app:v1 .docker push yourdockerhub/my-k8s-app:v1
Importante: Substitua yourdockerhub pelo nome de usuário real. Para testes locais, você pode usar minikube e não publicar a imagem — basta construí-la localmente.
2. Criação de manifestos Kubernetes
O Kubernetes usa arquivos YAML declarativos para descrever o estado desejado do cluster. Precisaremos de dois objetos principais: Deployment (gerenciamento de pods) e Service (acesso de rede).
2.1. Deployment
Crie o arquivo 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: 5Neste manifesto, especificamos:
- replicas: 2 — duas instâncias da aplicação para tolerância a falhas.
- resources — limites de CPU e memória (importante para a operação estável do cluster).
- livenessProbe e readinessProbe — verificações de saúde. Adicione os endpoints
/healthe/readyao seu controller.
2.2. Service
Crie o arquivo service.yaml:
apiVersion: v1kind: Servicemetadata: name: my-k8s-app-servicespec: selecto