نشر Swift على Kubernetes: دليل أساسي عملي

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

نشر Swift على Kubernetes: من البناء المحلي إلى كتلة الإنتاج

\n

Swift ليست مجرد لغة لتطبيقات iOS وmacOS. بفضل أطر العمل مثل Vapor وKitura، يتم استخدام Swift بشكل متزايد لكتابة تطبيقات الخادم. ولكن كيف يمكن توصيل هذا التطبيق للمستخدمين؟ الإجابة هي Kubernetes. في هذا الدليل، سنشرح كيفية تعبئة تطبيق Swift في Docker، وإعداد CI/CD، ونشره في كتلة K8s. ستتعرف على الفروق الدقيقة في بناء Swift تحت Linux، وكيفية تحسين الصورة، وكيفية كتابة ملفات البيان الصحيحة لـ Kubernetes.

\n\n

1. تحضير تطبيق Swift للحاويات

\n

أول ما يواجهه المطور هو Swift على Linux. إذا كنت تكتب على macOS، فستحتاج إلى تجميع التطبيق عبر الأنظمة لـ Linux (amd64/arm64). لنلق نظرة على مثال باستخدام Vapor 4.

\n

لننشئ تطبيق HTTP بسيط:

\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

للبناء تحت Linux، نستخدم صورة Swift الرسمية. لننشئ Dockerfile ببناء من مرحلتين:

\n
# المرحلة الأولى: البناء\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# المرحلة الثانية: صورة مصغرة\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

النقطة الأساسية هي العلامة --static-swift-stdlib. فهي تقوم بتضمين المكتبة القياسية لـ Swift بشكل ثابت، مما يقلل حجم الصورة ويبسط النشر. بدونها، قد يصل حجم الصورة إلى 1+ جيجابايت.

\n\n

2. بناء الصورة ورفعها إلى السجل

\n

نبني الصورة ونرفعها إلى Docker Hub (أو أي سجل آخر):

\n
# البناء\ndocker build -t myrepo/swift-k8s-demo:1.0.0 .\n\n# الاختبار محلياً\ndocker run -p 8080:8080 myrepo/swift-k8s-demo:1.0.0\ncurl http://localhost:8080\n# الرد: Hello from Swift on Kubernetes!\n\n# الرفع إلى السجل\ndocker push myrepo/swift-k8s-demo:1.0.0\n
\n

تحسين الحجم: الصورة المبنية على ubuntu:22.04 تزن حوالي 150 ميجابايت. إذا استخدمت alpine، يمكن تقليلها إلى 50 ميجابايت، لكن ستحتاج إلى حل مشكلة glibc (Swift يتطلبها). يُوصى باستخدام صور Ubuntu أو Debian الرسمية.

\n\n

3. ملفات بيان Kubernetes لتطبيق Swift

\n

الآن سننشر تطبيقنا في الكتلة. لننشئ Deployment و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

لاحظ probes (الفحوصات).

المدونات

توصيات الكتب