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

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

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

ابدأ الدورة

مقدمة: لماذا Go و Kubernetes زوج مثالي

\n\n

يعتمد التطوير الحديث بشكل متزايد على بنية الخدمات المصغرة والحاويات. أصبحت لغة Go (Golang) بفضل أدائها العالي وبساطتها ودعمها الأصلي للتوازي واحدة من الرواد في كتابة خدمات الخلفية. في الوقت نفسه، Kubernetes (K8s) هو المعيار الفعلي لتنسيق الحاويات.

\n\n

نشر تطبيق Go على Kubernetes هو عملية قد تبدو معقدة للمبتدئين. ومع ذلك، باتباع الدليل خطوة بخطوة، يمكنك إعداد خط أنابيب CI/CD وتشغيل خدمتك في دقائق. في هذه المقالة، سنشرح إنشاء صورة Docker، وكتابة مانيفستات Kubernetes، وإعداد الخدمات و Ingress، بالإضافة إلى تقديم نصائح عملية للتحسين.

\n\n

1. تحضير تطبيق Go و Dockerfile

\n\n

قبل نشر التطبيق في الكتلة، يجب حزمه في حاوية. في Go، هذا سهل بشكل خاص بفضل التجميع الثابت.

\n\n

1.1. مثال على خادم HTTP بسيط بلغة Go

\n\n

لننشئ خادمًا أدنى يستجيب للطلبات. هذا نموذج لخدمة مصغرة للعرض التوضيحي.

\n\n
// main.go\npackage main\n\nimport (\n    "fmt"\n    "net/http"\n    "os"\n)\n\nfunc main() {\n    port := os.Getenv("PORT")\n    if port == "" {\n        port = "8080"\n    }\n\n    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n        fmt.Fprintf(w, "Hello from Go on Kubernetes!")\n    })\n\n    http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) {\n        w.WriteHeader(http.StatusOK)\n        w.Write([]byte("OK"))\n    })\n\n    fmt.Printf("Server is running on port %s\\n", port)\n    http.ListenAndServe(":"+port, nil)\n}\n
\n\n

1.2. بناء Dockerfile متعدد المراحل

\n\n

نستخدم البناء متعدد المراحل (multi-stage build) لتقليل حجم الصورة النهائية. هذا أمر بالغ الأهمية للتحميل السريع في الكتلة.

\n\n
# ---- المرحلة الأولى: بناء الملف الثنائي ----\nFROM golang:1.21-alpine AS builder\n\nWORKDIR /app\nCOPY go.mod go.sum ./\nRUN go mod download\n\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -o /app/server .\n\n# ---- المرحلة الثانية: صورة دنيا ----\nFROM alpine:latest\n\nRUN apk --no-cache add ca-certificates\n\nWORKDIR /root/\nCOPY --from=builder /app/server .\n\nEXPOSE 8080\n\nCMD ["./server"]\n
\n\n

هام: العلم CGO_ENABLED=0 يعطل CGO، مما يسمح ببناء ملف ثنائي ثابت بالكامل لا يتطلب مكتبات خارجية.

\n\n

2. إنشاء مانيفستات Kubernetes

\n\n

الآن بعد أن أصبح لدينا صورة، نحتاج إلى وصف كيفية إدارة Kubernetes لتطبيقنا. الكائنات الرئيسية: Deployment (لإدارة النسخ المتماثلة) و Service (للوصول الشبكي).

\n\n

2.1. Deployment

\n\n

يضمن Deployment أن العدد المطلوب من البودات (Pod) مع تطبيقنا يعمل دائمًا. من المهم تكوين liveness و readiness probes للاسترداد التلقائي.

\n\n
// deployment.yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: go-app\n  labels:\n    app: go-app\nspec:\n  replicas: 2\n  selector:\n    matchLabels:\n      app: go-app\n  template:\n    metadata:\n      labels:\n        app: go-app\n    spec:\n      containers:\n      - name: go-app\n        image: your-dockerhub-username/go-app:latest\n        ports:\n        - containerPort: 8080\n        env:\n        - name: PORT\n          value: "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                

المدونات

توصيات الكتب