Déploiement de Swift sur Kubernetes : de la construction locale au cluster de production
\nSwift n'est pas seulement un langage pour iOS et macOS. Grâce à des frameworks comme Vapor et Kitura, Swift est de plus en plus utilisé pour écrire des applications serveur. Mais comment livrer une telle application aux utilisateurs ? La réponse est Kubernetes. Dans ce guide, nous allons voir comment empaqueter une application Swift dans Docker, configurer une CI/CD et la déployer dans un cluster K8s. Vous découvrirez les particularités de la compilation de Swift sous Linux, comment optimiser l'image et comment rédiger les bons manifestes pour Kubernetes.
\n\n1. Préparation de l'application Swift pour la conteneurisation
\nLa première chose à laquelle un développeur est confronté est Swift sur Linux. Si vous développez sur macOS, vous devez compiler votre application de manière croisée pour Linux (amd64/arm64). Prenons l'exemple de Vapor 4.
\nCréons une application HTTP simple :
\n// Sources/App/routes.swift\nimport Vapor\n\nfunc routes(_ app: Application) throws {\n app.get { req async in\n "Hello from Swift on Kubernetes!"\n }\n app.get("health") { req async in\n "OK"\n }\n}\n\nPour la compilation sous Linux, utilisons l'image officielle Swift. Créons un Dockerfile avec une construction en deux étapes :
# Première étape : construction\nFROM swift:5.9-focal as builder\nWORKDIR /app\nCOPY Package.swift Package.resolved ./\nRUN swift package resolve\nCOPY . .\nRUN swift build -c release --static-swift-stdlib\n\n# Deuxième étape : image minimale\nFROM ubuntu:22.04\nRUN apt-get update && apt-get install -y ca-certificates libsqlite3-0 && rm -rf /var/lib/apt/lists/*\nWORKDIR /app\nCOPY --from=builder /app/.build/release/Run .\nEXPOSE 8080\nCMD ["./Run"]\n\nLe point clé est le flag --static-swift-stdlib. Il active la liaison statique de la bibliothèque standard Swift, ce qui réduit la taille de l'image et simplifie le déploiement. Sans lui, l'image peut peser 1 Go ou plus.
2. Construction de l'image et téléchargement dans le registre
\nConstruisons l'image et poussons-la vers Docker Hub (ou tout autre registre) :
\n# Construction\ndocker build -t myrepo/swift-k8s-demo:1.0.0 .\n\n# Vérification locale\ndocker run -p 8080:8080 myrepo/swift-k8s-demo:1.0.0\ncurl http://localhost:8080\n# Réponse : Hello from Swift on Kubernetes!\n\n# Push vers le registre\ndocker push myrepo/swift-k8s-demo:1.0.0\n\nOptimisation de la taille : l'image basée sur ubuntu:22.04 pèse environ 150 Mo. Si vous utilisez alpine, vous pouvez la réduire à 50 Mo, mais vous devrez résoudre le problème avec glibc (Swift en a besoin). Il est recommandé d'utiliser les images officielles Ubuntu ou Debian.
3. Manifestes Kubernetes pour l'application Swift
\nDéployons maintenant notre application dans le cluster. Créons un Deployment et un Service.
\ndeployment.yaml :
\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: swift-app\n labels:\n app: swift-app\nspec:\n replicas: 3\n selector:\n matchLabels:\n app: swift-app\n template:\n metadata:\n labels:\n app: swift-app\n spec:\n containers:\n - name: swift-app\n image: myrepo/swift-k8s-demo:1.0.0\n ports:\n - containerPort: 8080\n livenessProbe:\n httpGet:\n path: /health\n port: 8080\n initialDelaySeconds: 5\n periodSeconds: 10\n readinessProbe:\n httpGet:\n path: /health\n port: 8080\n initialDelaySeconds: 3\n periodSeconds: 5\n resources:\n requests:\n memory: "64Mi"\n cpu: "100m"\n limits:\n memory: "128Mi"\n cpu: "250m"\n\nservice.yaml :
\napiVersion: v1\nkind: Service\nmetadata:\n name: swift-app-service\nspec:\n selector:\n app: swift-app\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8080\n type: ClusterIP\n\nFaites attention aux probes (sondes).