مقدمة: لماذا Go و Kubernetes زوج مثالي
\n\nتم تصميم Go (Golang) و Kubernetes (K8s) ليكمل كل منهما الآخر. Kubernetes نفسه مكتوب بلغة Go، لذا فإن الأدوات الأصلية والأداء وسهولة النشر تجعل هذا المزيج معيارًا للخدمات المصغرة الحديثة. إذا كنت قد بدأت للتو رحلتك في DevOps أو ترغب في أتمتة نشر تطبيق Go الخاص بك، سيساعدك هذا الدليل في اجتياز جميع المراحل: من كتابة خادم HTTP بسيط بلغة Go إلى تشغيله في مجموعة Kubernetes.
\n\nفي هذه المقالة، سنشرح:
\n- \n
- بناء تطبيق Go في صورة Docker \n
- إنشاء ملفات بيان Kubernetes الأساسية (Deployment، Service، Ingress) \n
- النشر والتحقق من قابلية التشغيل \n
من المفترض أن يكون لديك بالفعل docker و kubectl و minikube مثبتة (أو الوصول إلى أي مجموعة K8s).
الخطوة 1: كتابة تطبيق Go بسيط
\n\nلنقم بإنشاء خادم HTTP أساسي يستجيب للطلبات. أنشئ ملفًا باسم main.go:
package main\n\nimport (\n "fmt"\n "net/http"\n "os"\n)\n\nfunc main() {\n http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {\n fmt.Fprintf(w, "مرحبًا من Go! الإصدار: %s", os.Getenv("APP_VERSION"))\n })\n\n port := os.Getenv("PORT")\n if port == "" {\n port = "8080"\n }\n\n fmt.Printf("الخادم قيد التشغيل على المنفذ %s\\n", port)\n http.ListenAndServe(":"+port, nil)\n}\n\n\nيقرأ هذا التطبيق متغير البيئة APP_VERSION (يمكن تعيينه أثناء النشر) ويستمع إلى المنفذ المحدد في PORT. الآن دعنا نختبره محليًا:
go run main.go\n# افتح المتصفح على http://localhost:8080\n\n\nإنشاء وحدة Go
\nقم بتهيئة الوحدة لسهولة البناء:
\ngo mod init my-go-app\n\n\nالخطوة 2: الحاويات باستخدام Docker
\n\nلنشر التطبيق على Kubernetes، يجب حزمه في صورة Docker. سنستخدم البناء متعدد المراحل (multi-stage build) لجعل الصورة صغيرة الحجم قدر الإمكان.
\n\nأنشئ ملفًا باسم Dockerfile:
# مرحلة البناء\nFROM golang:1.22-alpine AS builder\nWORKDIR /app\nCOPY go.mod ./\nCOPY main.go ./\nRUN go build -o my-app .\n\n# الصورة النهائية\nFROM alpine:3.19\nWORKDIR /app\nCOPY --from=builder /app/my-app .\nEXPOSE 8080\nCMD ["./my-app"]\n\n\nقم ببناء الصورة وتحقق منها:
\ndocker build -t my-go-app:v1 .\ndocker run -p 8080:8080 my-go-app:v1\n# http://localhost:8080\n\n\nالخطوة 3: ملفات بيان Kubernetes
\n\nالآن سنقوم بإعداد ملفات YAML للنشر في المجموعة. سننشئ ثلاثة موارد: Deployment (إدارة البودات)، Service (الوصول الشبكي)، و Ingress (الوصول الخارجي).
\n\n3.1. Deployment
\nأنشئ ملفًا باسم deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: go-app-deployment\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: my-go-app:v1\n ports:\n - containerPort: 8080\n env:\n - name: APP_VERSION\n value: "1.0.0"\n - name: PORT\n value: "8080"\n livenessProbe:\n httpGet:\n path: /\n port: 8080\n initialDelaySeconds: 5\n periodSeconds: 10\n\n\nهنا قمنا بتعيين نسختين مكررتين، واختبار الجاهزية (liveness probe)، ومتغيرات البيئة.
\n\n3.2. Service
\nأنشئ ملفًا باسم service.yaml للوصول الداخلي:
apiVersion: v1\nkind: Service\nmetadata:\n name: go-app-service\nspec:\n selector:\n app: go-app\n ports:\n - protocol: TCP\n port: 80\n targetPort: 8080\n\n\n3.3. Ingress
\nأنشئ ملفًا باسم ingress.yaml للوصول الخارجي:
apiVersion: networking.k8s.io/v1\nkind: Ingress\nmetadata:\n name: go-app-ingress\nspec:\n rules:\n - host: go-app.local\n http:\n paths:\n - path: /\n pathType: Prefix\n backend:\n service:\n name: go-app-service\n port:\n number: 80\n\n\nالخطوة 4: النشر والتحقق
\n\nالآن قم بتطبيق جميع ملفات البيان على مجموعة Kubernetes:
\n\nkubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\nkubectl apply -f ingress.yaml\n\n\nتحقق من حالة البودات:
\nkubectl get pods\n\n\nيجب أن ترى بودين في حالة التشغيل. تحقق من الخدمة:
\nkubectl get svc\n\n\nللوصول إلى التطبيق عبر Ingress، أضف السطر التالي إلى ملف /etc/hosts (على نظام Linux/Mac):
127.0.0.1 go-app.local\n\n\nثم افتح المتصفح على http://go-app.local. يجب أن ترى رسالة "مرحبًا من Go! الإصدار: 1.0.0".
الخلاصة
\n\nلقد قمنا بنشر تطبيق Go بنجاح على Kubernetes باستخدام Docker وملفات البيان الأساسية. هذه هي الخطوات الأولى نحو فهم أعمق لـ Kubernetes و Go. جرب تغيير عدد النسخ المكررة أو إضافة متغيرات بيئة جديدة لتعزيز معرفتك.
\n\nفي المقالات القادمة، سنغطي مواضيع أكثر تقدمًا مثل ConfigMaps و Secrets و Helm charts. ابقَ متابعًا!