Swift auf Kubernetes bereitstellen: Ein grundlegendes Tutorial für Anfänger
\n\nSwift wird stark mit der Entwicklung für iOS und macOS assoziiert, aber seine serverseitigen Fähigkeiten (dank Frameworks wie Vapor und Kitura) ermöglichen die Erstellung vollwertiger Backend-Lösungen. Wenn Sie bereits eine Serveranwendung in Swift geschrieben haben und deren Ausfallsicherheit, Skalierbarkeit und einfache Verwaltung sicherstellen möchten, ist Kubernetes (K8s) die ideale Wahl. In diesem Leitfaden gehen wir Schritt für Schritt den Prozess der Bereitstellung einer Swift-Anwendung auf Kubernetes durch, beginnend mit der Containerisierung bis hin zum Start im Cluster. Das Material richtet sich an Entwickler, die mit den Grundlagen von Swift vertraut sind, aber gerade erst mit der Container-Orchestrierung beginnen.
\n\nWarum Swift und Kubernetes ein großartiges Paar sind
\n\nKubernetes ist ein System zur Automatisierung der Bereitstellung, Skalierung und Verwaltung containerisierter Anwendungen. Swift wiederum wird in ein natives Binärprogramm kompiliert, was es zu einem idealen Kandidaten für den Betrieb in leichtgewichtigen Containern macht. Die Hauptvorteile dieser Kombination sind:
\n\n- \n
- Leistung: Swift-Anwendungen benötigen keine virtuelle Maschine (wie Java) oder einen Interpreter (wie Python), was den Ressourcenverbrauch senkt. \n
- Typsicherheit: Der Swift-Compiler verhindert viele Fehler bereits zur Build-Zeit, was für Produktionsumgebungen entscheidend ist. \n
- Ökosystem: Das Vapor-Framework bietet vorgefertigte Werkzeuge für die Arbeit mit HTTP, Datenbanken und WebSockets, was die Integration mit K8s vereinfacht. \n
- Skalierung: Kubernetes verwaltet automatisch die Replikate Ihres Swift-Servers und gewährleistet so eine hohe Verfügbarkeit. \n
Schritt 1: Vorbereiten der Swift-Anwendung für die Containerisierung
\n\nBevor Sie die Anwendung in Kubernetes bereitstellen, muss sie in ein Docker-Image verpackt werden. Betrachten wir ein Beispiel basierend auf dem Vapor-Framework. Angenommen, Sie haben eine einfache Anwendung MySwiftApp mit einem Endpunkt.
Projektstruktur:
\n\nMySwiftApp/\n├── Sources/\n│ └── App/\n│ └── main.swift\n├── Package.swift\n└── Dockerfile\n\n\n
Code von main.swift (einfacher HTTP-Server):
\nimport Vapor\n\nlet app = Application()\napp.get("hello") { req in\n return "Hello from Swift on Kubernetes!"\n}\ntry app.run()\n\n\nDatei Package.swift:
\n// swift-tools-version:5.8\nimport PackageDescription\n\nlet package = Package(\n name: "MySwiftApp",\n platforms: [.macOS(.v12)],\n dependencies: [\n .package(url: "https://github.com/vapor/vapor.git", from: "4.0.0")\n ],\n targets: [\n .executableTarget(\n name: "App",\n dependencies: ["Vapor"]\n )\n ]\n)\n\n\nJetzt erstellen wir ein Dockerfile zum Bauen und Ausführen der Anwendung. Wir verwenden einen mehrstufigen Build, um die Image-Größe zu minimieren:
\n\n# ---- Build Stage ----\nFROM swift:5.8 as builder\nWORKDIR /app\nCOPY Package.swift Package.resolved ./\nRUN swift package resolve\nCOPY . .\nRUN swift build -c release --static-swift-stdlib\n\n# ---- Run Stage ----\nFROM ubuntu:22.04\nWORKDIR /app\nCOPY --from=builder /app/.build/release/App .\nEXPOSE 8080\nCMD ["./App"]\n\n\nBauen Sie das Image:
\ndocker build -t my-swift-app:latest .\n\n\nSchritt 2: Veröffentlichen des Images in einer Container-Registry
\n\nFür die Arbeit mit Kubernetes muss das Image aus einer Registry verfügbar sein. Wir verwenden Docker Hub oder eine andere (GitHub Container Registry, GitLab, AWS ECR).
\n\ndocker tag my-swift-app:latest your-dockerhub-username/my-swift-app:latest\ndocker push your-dockerhub-username/my-swift-app:latest\n\n\nErsetzen Sie your-dockerhub-username durch Ihren Benutzernamen. Wenn Sie eine private Registry verwenden, vergessen Sie nicht, imagePullSecrets in den K-Manifesten zu konfigurieren.