Implantação de Swift no Kubernetes: guia básico na prática
Swift não é apenas uma linguagem para aplicações móveis. Graças a frameworks como Vapor e Kitura, o Swift é ativamente usado para criar soluções de servidor. No entanto, para executar tal aplicação em produção, é necessária uma orquestração confiável. O Kubernetes (K8s) é a ferramenta ideal para gerenciar serviços containerizados. Neste guia, abordaremos o ciclo completo de implantação de uma aplicação Swift em um cluster Kubernetes: desde a containerização até a criação de manifestos funcionais.
1. Preparação da aplicação Swift e containerização
Antes de falar sobre Kubernetes, é necessário empacotar sua aplicação Swift em uma imagem Docker. Vamos considerar um exemplo baseado no framework Vapor (mas a abordagem é universal para qualquer servidor Swift).
Crie uma aplicação Vapor mínima:
// Sources/App/routes.swiftimport Vapor
func routes(_ app: Application) throws { app.get { req async in "Hello, Kubernetes!" }}Agora vamos escrever o Dockerfile. Importante: use a imagem oficial do Swift para a compilação e, para o contêiner final, uma imagem leve (por exemplo, ubuntu:jammy). Isso reduzirá o tamanho e aumentará a segurança.
# ---- Build Stage ----FROM swift:5.9-jammy AS build
WORKDIR /appCOPY Package.swift Package.resolved ./COPY Sources ./SourcesRUN swift build -c release --static-swift-stdlib
# ---- Run Stage ----FROM ubuntu:jammy
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*WORKDIR /appCOPY --from=build /app/.build/release/Run .
EXPOSE 8080CMD ["./Run"]Construa a imagem e envie para um registro (por exemplo, Docker Hub):
docker build -t yourdockerhub/swift-k8s-demo:latest .docker push yourdockerhub/swift-k8s-demo:latest2. Fundamentos do Kubernetes: Pod e Deployment
O Kubernetes gerencia contêineres por meio de objetos. O mais simples é o Pod, mas para produção é melhor usar um Deployment, que garante replicação e atualizações.
Crie o arquivo deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: swift-demo labels: app: swift-demospec: replicas: 2 selector: matchLabels: app: swift-demo template: metadata: labels: app: swift-demo spec: containers: - name: swift-app image: yourdockerhub/swift-k8s-demo:latest ports: - containerPort: 8080 resources: requests: memory: "128Mi" cpu: "250m" limits: memory: "256Mi" cpu: "500m" livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 5 periodSeconds: 10Aplique o manifesto:
kubectl apply -f deployment.yamlVerifique o status:
kubectl get pods -l app=swift-demo3. Serviço (Service) para acesso à aplicação
Os Pods são dinâmicos (seus IPs mudam ao reiniciar). Para que os clientes possam acessar a aplicação de forma estável, é necessário um Service. Crie o service.yaml:
apiVersion: v1kind: Servicemetadata: name: swift-servicespec: selector: app: swift-demo ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIPPara testar em um cluster local (por exemplo, Minikube), você pode usar NodePort ou encaminhamento de porta:
kubectl port-forward service/swift-service 8080:80Agora a aplicação está acessível em http://localhost:8080.
4. Escalonamento e atualização (Rolling Update)
Uma das principais vantagens do Kubernetes é a fácil m