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

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

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

ابدأ الدورة

مقدمة: لماذا 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
\n\n

من المفترض أن يكون لديك بالفعل docker و kubectl و minikube مثبتة (أو الوصول إلى أي مجموعة K8s).

\n\n

الخطوة 1: كتابة تطبيق Go بسيط

\n\n

لنقم بإنشاء خادم HTTP أساسي يستجيب للطلبات. أنشئ ملفًا باسم main.go:

\n\n
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. الآن دعنا نختبره محليًا:

\n\n
go run main.go\n# افتح المتصفح على http://localhost:8080\n
\n\n

إنشاء وحدة Go

\n

قم بتهيئة الوحدة لسهولة البناء:

\n
go mod init my-go-app\n
\n\n

الخطوة 2: الحاويات باستخدام Docker

\n\n

لنشر التطبيق على Kubernetes، يجب حزمه في صورة Docker. سنستخدم البناء متعدد المراحل (multi-stage build) لجعل الصورة صغيرة الحجم قدر الإمكان.

\n\n

أنشئ ملفًا باسم Dockerfile:

\n\n
# مرحلة البناء\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

قم ببناء الصورة وتحقق منها:

\n
docker 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\n

3.1. Deployment

\n

أنشئ ملفًا باسم deployment.yaml:

\n\n
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\n

3.2. Service

\n

أنشئ ملفًا باسم service.yaml للوصول الداخلي:

\n\n
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\n

3.3. Ingress

\n

أنشئ ملفًا باسم ingress.yaml للوصول الخارجي:

\n\n
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\n
kubectl apply -f deployment.yaml\nkubectl apply -f service.yaml\nkubectl apply -f ingress.yaml\n
\n\n

تحقق من حالة البودات:

\n
kubectl get pods\n
\n\n

يجب أن ترى بودين في حالة التشغيل. تحقق من الخدمة:

\n
kubectl get svc\n
\n\n

للوصول إلى التطبيق عبر Ingress، أضف السطر التالي إلى ملف /etc/hosts (على نظام Linux/Mac):

\n
127.0.0.1 go-app.local\n
\n\n

ثم افتح المتصفح على http://go-app.local. يجب أن ترى رسالة "مرحبًا من Go! الإصدار: 1.0.0".

\n\n

الخلاصة

\n\n

لقد قمنا بنشر تطبيق Go بنجاح على Kubernetes باستخدام Docker وملفات البيان الأساسية. هذه هي الخطوات الأولى نحو فهم أعمق لـ Kubernetes و Go. جرب تغيير عدد النسخ المكررة أو إضافة متغيرات بيئة جديدة لتعزيز معرفتك.

\n\n

في المقالات القادمة، سنغطي مواضيع أكثر تقدمًا مثل ConfigMaps و Secrets و Helm charts. ابقَ متابعًا!

المدونات

توصيات الكتب