Despliegue de Swift en Kubernetes: guía básica práctica
Swift no es solo un lenguaje para aplicaciones móviles. Gracias a frameworks como Vapor y Kitura, Swift se utiliza activamente para crear soluciones de servidor. Sin embargo, para ejecutar dicha aplicación en producción, se necesita una orquestación confiable. Kubernetes (K8s) es la herramienta ideal para gestionar servicios contenerizados. En esta guía, analizaremos el ciclo completo de despliegue de una aplicación Swift en un clúster de Kubernetes: desde la contenerización hasta la creación de manifiestos funcionales.
1. Preparación de la aplicación Swift y contenerización
Antes de hablar de Kubernetes, debemos empaquetar su aplicación Swift en una imagen Docker. Consideremos un ejemplo basado en el framework Vapor (pero el enfoque es universal para cualquier servidor Swift).
Cree una aplicación Vapor mínima:
// Sources/App/routes.swiftimport Vapor
func routes(_ app: Application) throws { app.get { req async in "Hello, Kubernetes!" }}Ahora escribamos el Dockerfile. Importante: use la imagen oficial de Swift para la compilación y, para el contenedor final, una imagen ligera (por ejemplo, ubuntu:jammy). Esto reducirá el tamaño y mejorará la seguridad.
# ---- 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"]Construya la imagen y envíela a un registro (por ejemplo, Docker Hub):
docker build -t tudockerhub/swift-k8s-demo:latest .docker push tudockerhub/swift-k8s-demo:latest2. Fundamentos de Kubernetes: Pod y Deployment
Kubernetes gestiona los contenedores a través de objetos. El más simple es Pod, pero para producción es mejor usar Deployment, que proporciona replicación y actualizaciones.
Creemos el archivo 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: tudockerhub/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 el manifiesto:
kubectl apply -f deployment.yamlVerifique el estado:
kubectl get pods -l app=swift-demo3. Servicio (Service) para acceder a la aplicación
Los Pods son dinámicos (sus IP cambian al reiniciarse). Para que los clientes puedan acceder de manera estable a la aplicación, se necesita un Service. Creemos service.yaml:
apiVersion: v1kind: Servicemetadata: name: swift-servicespec: selector: app: swift-demo ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIPPara pruebas en un clúster local (por ejemplo, Minikube), se puede usar NodePort o redirección de puertos:
kubectl port-forward service/swift-service 8080:80Ahora la aplicación está disponible en http://localhost:8080.
4. Escalado y actualización (Rolling Update)
Una de las principales ventajas de Kubernetes es la fácil m