Kubernetes पर Swift डिप्लॉयमेंट: लोकल बिल्ड से प्रोडक्शन क्लस्टर तक
\nSwift सिर्फ iOS और macOS के लिए ही नहीं है। Vapor और Kitura जैसे फ्रेमवर्क की बदौलत, Swift का उपयोग सर्वर-साइड एप्लीकेशन लिखने के लिए भी तेजी से बढ़ रहा है। लेकिन ऐसे एप्लीकेशन को यूजर्स तक कैसे पहुंचाएं? इसका जवाब है Kubernetes। इस गाइड में, हम सीखेंगे कि Swift एप्लीकेशन को Docker में कैसे पैकेज करें, CI/CD सेटअप करें और इसे K8s क्लस्टर में डिप्लॉय करें। आप जानेंगे कि Linux पर Swift बिल्ड करते समय क्या खास बातें ध्यान रखनी चाहिए, इमेज को कैसे ऑप्टिमाइज़ करें और Kubernetes के लिए सही मैनिफेस्ट कैसे लिखें।
\n\n1. कंटेनरीकरण के लिए Swift एप्लीकेशन तैयार करना
\nसबसे पहली चुनौती जो डेवलपर को मिलती है वह है Linux पर Swift। अगर आप 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\nLinux के लिए बिल्ड करने के लिए आधिकारिक Swift इमेज का उपयोग करें। दो-चरणीय बिल्ड के साथ Dockerfile बनाएं:
# पहला चरण: बिल्ड\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+ GB की हो सकती है।
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 MB होता है। अगर alpine का उपयोग करें तो इसे 50 MB तक कम किया जा सकता है, लेकिन glibc की समस्या को हल करना होगा (Swift को इसकी आवश्यकता है)। आधिकारिक Ubuntu या Debian इमेज का उपयोग करने की सिफारिश की जाती है।
3. Swift एप्लीकेशन के लिए Kubernetes मैनिफेस्ट
\nअब हम अपने एप्लीकेशन को क्लस्टर में डिप्लॉय करेंगे। Deployment और 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\nProbes (प्रोब) पर ध्यान दें।