Implantação de C# no Kubernetes: guia prático para desenvolvedores .NET
\n\nO desenvolvimento moderno em C# (.NET) cada vez mais exige não apenas escrever código de qualidade, mas também saber como implantar corretamente a aplicação em ambiente de produção. O Kubernetes (K8s) tornou-se o padrão de facto para orquestração de contêineres. Neste artigo, vamos analisar o processo passo a passo de implantação de uma aplicação C# no Kubernetes — desde a conteinerização até a configuração do Ingress.
\n\n1. Preparação da aplicação .NET e imagem Docker
\n\nAntes de chegar ao Kubernetes, sua aplicação C# deve ser empacotada em uma imagem Docker. Vamos considerar uma Web API ASP.NET Core simples.
\n\nCrie o projeto:
\ndotnet new webapi -n MyK8sApp\ncd MyK8sApp\n\nAdicione um endpoint simples (arquivo Program.cs):
var builder = WebApplication.CreateBuilder(args);\nvar app = builder.Build();\n\napp.MapGet("/", () => "Olá do C# no Kubernetes!");\n\napp.Run();\n\nAgora vamos criar o Dockerfile na raiz do projeto:
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\nCompile e envie a imagem para o Docker Hub ou um registry local:
\ndocker build -t yourdockerhub/my-k8s-app:v1 .\ndocker push yourdockerhub/my-k8s-app:v1\n\nImportante: No ASP.NET Core 8+, por padrão, a aplicação escuta na porta 8080, o que é ideal para o Kubernetes.
\n\n2. Manifestos YAML principais para Kubernetes
\n\nO Kubernetes gerencia recursos por meio de arquivos YAML. Para executar uma aplicação C#, precisaremos pelo menos de um Deployment e um Service.
\n\n2.1. Deployment (deployment.yaml)
\nO Deployment é responsável por manter o número desejado de réplicas de Pods.
\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\nPontos-chave:
\n- \n
replicas: 3— 3 instâncias da aplicação \n livenessProbe— verificação de saúde (recomenda-se adicionar o endpoint/healthem C#) \n - Os recursos
requests/limitsajudam o escalonador do K8s \n
2.2. Service (service.yaml)
\nO Service fornece um ponto de entrada estável para os Pods.
\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 — serviço interno, acessível apenas dentro do cluster. Para acesso externo, usamos o Ingress.
3. Configuração do Ingress e ConfigMap
\n\n3.1. Ingress (ingress.yaml)
\nO Ingress permite o acesso externo ao serviço por meio de um nome de domínio.
\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