مقدمة: لماذا Go و Kubernetes هما الثنائي المثالي
Go (Golang) و Kubernetes هما أداتان رئيسيتان في التطوير الحديث. Go، الذي تم إنشاؤه في Google، هي لغة مترجمة وذات كتابة ثابتة مثالية لبناء الخدمات المصغرة عالية الأداء. Kubernetes، بدوره، هو المعيار الفعلي لتنسيق الحاويات. اتحادهما يخلق نظامًا بيئيًا قويًا: تكتب كودًا خفيفًا وسريعًا بلغة Go، وتعبئته في Docker image، ويدير Kubernetes تشغيله وتوسيعه واستعادته.
في هذا الدليل، سنقوم خطوة بخطوة بنشر تطبيق Go بسيط على Kubernetes. ستتعلم كيفية كتابة Dockerfile، وإنشاء manifests لـ Deployment و Service، وتطبيقها في الكتلة. المقالة موجهة للمطورين الذين هم على دراية بأساسيات Go ولديهم فهم أساسي لـ Docker.
الخطوة 1: إنشاء وتعبئة تطبيق Go في حاوية
لنبدأ مع خادم HTTP بسيط بلغة Go. قم بإنشاء ملف main.go:
package main
import ( "fmt" "net/http" "os")
func main() { port := os.Getenv("PORT") if port == "" { port = "8080" } http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello from Go on Kubernetes!") }) http.ListenAndServe(":"+port, nil)}يستمع هذا الكود إلى المنفذ المحدد بواسطة متغير البيئة PORT (الافتراضي 8080)، ويعيد رسالة بسيطة.
بناء Docker image
الآن سنقوم بإنشاء Dockerfile للبناء متعدد المراحل - وهذا سيقلل حجم الصورة النهائية:
# مرحلة البناءFROM golang:1.21-alpine AS builderWORKDIR /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:v1 .docker push yourusername/go-k8s-app:v1الخطوة 2: Deployment manifest
يستخدم Kubernetes ملفات YAML manifests لوصف الحالة المرغوبة للكتلة. قم بإنشاء ملف deployment.yaml:
apiVersion: apps/v1kind: Deploymentmetadata: name: go-app-deployment labels: app: go-appspec: replicas: 3 selector: matchLabels: app: go-app template: metadata: labels: app: go-app spec: containers: - name: go-app image: yourusername/go-k8s-app:v1 ports: - containerPort: 8080 env: - name: PORT value: "8080" readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 5 periodSeconds: 10 livenessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 15 periodSeconds: 20شرح الحقول الرئيسية:
replicas: 3— سيحافظ Kubernetes على 3 نسخ عاملة (pods) من التطبيق.readinessProbe— تتحقق مما إذا كان الـ pod جاهزًا لاستقبال الحركة المرورية (طلبات إلى /).livenessProbe— تتحقق مما إذا كان الـ pod على قيد الحياة؛ إذا لم يكن كذلك، سيقوم Kubernetes بإعادة تشغيله.
الخطوة 3: Service manifest
لجعل التطبيق متاحًا داخل الكتلة أو من الخارج، نحتاج إلى Service. قم بإنشاء service.yaml:
apiVersion: v1kind: Servicemetadata: name: go-app-servicespec: selector: app: go-app ports: - protocol: TCP port: 80 targetPort: 8080 type: LoadBalancerselector— يربط الخدمة بـ pods التي تحتوي على الوسم