Introdução: Por que executar C# no Kubernetes?
O desenvolvimento moderno em C# (.NET) exige cada vez mais uma infraestrutura escalável e tolerante a falhas. O Kubernetes (K8s) tornou-se o padrão para orquestração de contêineres, permitindo automatizar a implantação, o escalonamento e o gerenciamento de aplicações. Neste guia, mostraremos como transformar sua aplicação C# em um contêiner e executá-la em um cluster Kubernetes na prática.
Você aprenderá como preparar uma imagem Docker, escrever manifestos para Kubernetes e realizar a implantação usando kubectl. O artigo é voltado para desenvolvedores que já conhecem os fundamentos do C# e desejam dominar as práticas modernas de DevOps.
1. Preparando a aplicação C# para conteinerização
Antes de implantar a aplicação no Kubernetes, é necessário empacotá-la em uma imagem Docker. Como exemplo, usaremos uma aplicação simples ASP.NET Core Web API.
1.1. Criando o projeto
Crie um novo projeto usando o .NET CLI:
dotnet new webapi -n MyK8sAppcd MyK8sAppCertifique-se de que a aplicação funciona localmente:
dotnet runPor padrão, a aplicação estará disponível em http://localhost:5000.
1.2. Adicionando o Dockerfile
Na raiz do projeto, crie um arquivo Dockerfile (sem extensão). Use a compilação em vários estágios para otimizar o tamanho da imagem:
# Estágio de compilaçãoFROM mcr.microsoft.com/dotnet/sdk:8.0 AS buildWORKDIR /appCOPY *.csproj ./RUN dotnet restoreCOPY . ./RUN dotnet publish -c Release -o out
# Estágio de execuçãoFROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtimeWORKDIR /appCOPY --from=build /app/out ./ENV ASPNETCORE_URLS=http://+:80EXPOSE 80ENTRYPOINT ["dotnet", "MyK8sApp.dll"]1.3. Compilando e verificando a imagem Docker
Compile a imagem e execute localmente:
docker build -t myk8sapp:latest .docker run -d -p 8080:80 --name myapp myk8sapp:latestVerifique se a aplicação responde: curl http://localhost:8080/weatherforecast (ou abra no navegador).
2. Escrevendo manifestos Kubernetes
Para implantar no Kubernetes, são necessários arquivos YAML que descrevam o estado desejado da aplicação. O conjunto mínimo inclui Deployment e Service.
2.1. Criando o Deployment
Arquivo deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: myk8sapp-deployment labels: app: myk8sappspec: replicas: 2 selector: matchLabels: app: myk8sapp template: metadata: labels: app: myk8sapp spec: containers: - name: myk8sapp image: myk8sapp:latest ports: - containerPort: 80 env: - name: ASPNETCORE_ENVIRONMENT value: "Production" resources: requests: memory: "128Mi" cpu: "250m" limits: memory: "256Mi" cpu: "500m"Importante: Se você estiver usando um cluster local (por exemplo, Minikube ou Kind), a imagem deve estar disponível dentro do cluster. Ou defina imagePullPolicy: Never para imagens locais.
2.2. Criando o Service
Arquivo service.yaml:
apiVersion: v1kind: Servicemetadata: name: myk8sapp-servicespec: selector: app: myk8sapp ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancerO tipo LoadBalancer é adequado para provedores de nuvem. Para clusters locais, use NodePort ou ClusterIP com encaminhamento de porta via kubectl port-forward.
3. Implantação e verificação da aplicação
Agora que os manifestos estão prontos, realize a implantação no cluster Kubernetes.