Déploiement de Swift sur Kubernetes : guide pratique de base

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Déploiement de Swift sur Kubernetes : de la construction locale au cluster de production

\n

Swift 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\n

1. Préparation de l'application Swift pour la conteneurisation

\n

La 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.

\n

Cré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
\n

Pour la compilation sous Linux, utilisons l'image officielle Swift. Créons un Dockerfile avec une construction en deux étapes :

\n
# 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
\n

Le 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.

\n\n

2. Construction de l'image et téléchargement dans le registre

\n

Construisons 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
\n

Optimisation 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.

\n\n

3. Manifestes Kubernetes pour l'application Swift

\n

Déployons maintenant notre application dans le cluster. Créons un Deployment et un Service.

\n

deployment.yaml :

\n
apiVersion: 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
\n

service.yaml :

\n
apiVersion: 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
\n

Faites attention aux probes (sondes).

Blogs

Book Recommendations