Swift auf Kubernetes bereitstellen: Ein praktischer Grundlagenleitfaden
Swift ist nicht nur eine Sprache für mobile Anwendungen. Dank Frameworks wie Vapor und Kitura wird Swift aktiv für die Entwicklung von Serverlösungen eingesetzt. Um eine solche Anwendung jedoch in der Produktion auszuführen, ist eine zuverlässige Orchestrierung erforderlich. Kubernetes (K8s) ist das ideale Werkzeug zur Verwaltung containerisierter Dienste. In diesem Leitfaden gehen wir den gesamten Bereitstellungszyklus einer Swift-Anwendung in einem Kubernetes-Cluster durch: von der Containerisierung bis zur Erstellung funktionsfähiger Manifeste.
1. Vorbereitung der Swift-Anwendung und Containerisierung
Bevor wir über Kubernetes sprechen, müssen wir Ihre Swift-Anwendung in ein Docker-Image verpacken. Betrachten wir ein Beispiel basierend auf dem Vapor-Framework (der Ansatz ist jedoch für jeden Swift-Server universell).
Erstellen Sie eine minimale Vapor-Anwendung:
// Sources/App/routes.swiftimport Vapor
func routes(_ app: Application) throws { app.get { req async in "Hello, Kubernetes!" }}Jetzt schreiben wir ein Dockerfile. Wichtig: Verwenden Sie das offizielle Swift-Image für den Build und für den finalen Container ein leichtes Image (z. B. ubuntu:jammy). Dies reduziert die Größe und erhöht die Sicherheit.
# ---- 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"]Erstellen Sie das Image und senden Sie es an eine Registry (z. B. Docker Hub):
docker build -t yourdockerhub/swift-k8s-demo:latest .docker push yourdockerhub/swift-k8s-demo:latest2. Grundlagen von Kubernetes: Pod und Deployment
Kubernetes verwaltet Container über Objekte. Das einfachste ist ein Pod, aber für die Produktion ist es besser, ein Deployment zu verwenden, das Replikation und Updates gewährleistet.
Erstellen wir eine Datei 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: 10Wenden Sie das Manifest an:
kubectl apply -f deployment.yamlÜberprüfen Sie den Status:
kubectl get pods -l app=swift-demo3. Service für den Zugriff auf die Anwendung
Pods sind dynamisch (ihre IPs ändern sich bei Neustarts). Damit Clients stabil auf die Anwendung zugreifen können, wird ein Service benötigt. Erstellen wir service.yaml:
apiVersion: v1kind: Servicemetadata: name: swift-servicespec: selector: app: swift-demo ports: - protocol: TCP port: 80 targetPort: 8080 type: ClusterIPFür Tests in einem lokalen Cluster (z. B. Minikube) können Sie NodePort oder Portweiterleitung verwenden:
kubectl port-forward service/swift-service 8080:80Die Anwendung ist nun unter http://localhost:8080 erreichbar.
4. Skalierung und Aktualisierung (Rolling Update)
Einer der Hauptvorteile von Kubernetes ist die einfache S