مقدمة: لماذا Go و Kubernetes هما الثنائي المثالي
Go (Golang) و Kubernetes هما المعيار الحديث لبناء ونشر بنية الميكروسيرفيسات. يتم تجميع Go إلى ملف ثنائي ثابت، ولا يتطلب تبعيات على الجهاز الهدف، ويبدأ التشغيل بسرعة ويستخدم الذاكرة بكفاءة. من ناحية أخرى، يوفر Kubernetes أتمتة نشر الحاويات وتوسيع نطاقها وإدارتها.
في هذا الدليل، سنشرح عمليًا دورة النشر الكاملة لتطبيق Go بسيط على Kubernetes. ستتعلم كيفية كتابة Dockerfile، وإنشاء مانيفستات Kubernetes (Deployment، Service، ConfigMap) وتشغيل التطبيق في الكتلة. يمكن استخدام جميع أمثلة الكود فورًا في مشاريعك الخاصة.
1. تحضير تطبيق Go للحاويات
لنبدأ بإنشاء خادم HTTP بسيط بلغة Go يستجيب للطلبات ويعرض ترحيبًا. من المهم أن يستمع التطبيق إلى المنفذ الذي سنحدده من خلال متغير بيئة. هذه ممارسة قياسية لـ Kubernetes.
أنشئ ملف main.go:
package main
import ( "fmt" "log" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" }
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { name := os.Getenv("APP_NAME") if name == "" { name = "Go App" } fmt.Fprintf(w, "مرحبًا من %s! نعمل على المنفذ %s", name, port) })
log.Printf("الخادم يعمل على المنفذ %s", port) log.Fatal(http.ListenAndServe(":"+port, nil))}يقرأ هذا الكود متغيرات البيئة PORT و APP_NAME، مما يسمح لنا بتكوين التطبيق بمرونة من خلال ConfigMap في Kubernetes.
2. إنشاء Dockerfile لتطبيق Go
للنشر على Kubernetes، نحتاج إلى صورة Docker. سنستخدم البناء متعدد المراحل (multi-stage build) - مما يقلل حجم الصورة ويعزز الأمان.
أنشئ ملف Dockerfile:
# مرحلة البناءFROM golang:1.22-alpine AS builder
WORKDIR /appCOPY go.mod go.sum ./RUN go mod downloadCOPY . .RUN CGO_ENABLED=0 GOOS=linux go build -o /app/server .
# الصورة النهائيةFROM alpine:latestRUN apk --no-cache add ca-certificatesWORKDIR /root/COPY --from=builder /app/server .EXPOSE 8080CMD ["./server"]قم ببناء الصورة وإرسالها إلى السجل (مثل Docker Hub):
docker build -t yourusername/go-k8s-app:latest .docker push yourusername/go-k8s-app:latest3. مانيفستات Kubernetes: Deployment، Service، ConfigMap
الآن سننشئ المانيفستات لنشر التطبيق في الكتلة. يُوصى بتخزينها في مجلد k8s/.
3.1. ConfigMap للتكوين
سنستخرج إعدادات التطبيق إلى ConfigMap - مما يسمح بتغييرها دون إعادة بناء الصورة.
ملف k8s/configmap.yaml:
apiVersion: v1kind: ConfigMapmetadata: name: go-app-configdata: APP_NAME: "تطبيق Go الخاص بي" PORT: "8080"3.2. Deployment - وصف البود
يدير Deployment نسخ البود ويضمن التحديثات دون توقف.
ملف k8s/deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: go-app-deployment labels: app: go-appspec: replicas: 2 selector: matchLabels: app: go-app template: metadata: labels: app: go-app spec: containers: - name: go-app image: yourusername/go-k8s-app:latest ports: - containerPort: 8080 envFrom: - configMapRef: name: go-app-config livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 5 periodSeconds: 10\