נציין: כשאנחנו לוקחים על עצמנו הגדרת Kubernetes עבור backend למובייל, הבעיה הראשונה היא קפיצות עומס חדות. לדוגמה, אפליקציה עם 50,000 משתמשים פעילים חווה תנודות תעבורה של פי 10–15: שיא בבוקר, בצהריים, בערב. על שרת יחיד, זה אומר או הקצאת משאבים יתרה בלילה או ירידה בביצועים בשיא. פעם פנה אלינו לקוח עם 100,000 משתמשים יומיים (DAU): ה-Node.js API שלהם קרס בשיא של 10k RPS, ו-ECS לא הצליח להתמודד עם auto-scaling. Kubernetes פותר את זה דרך auto-scaling אופקי, עדכונים מתגלגלים (rolling updates) ללא downtime, ובידוד שירותים. יש לנו 5 שנות ניסיון DevOps לפרויקטים ניידים, מעל 20 השקות מוצלחות, ומהנדסים מוסמכים (CKA, CKAD). אנחנו מבטיחים SLA של 99.9% ותמיכה לאחר ההשקה. בזכות orchestration, החיסכון במשאבי ענן יכול להגיע ל-$500–2k בחודש. בקשו ייעוץ — נתאים את התצורה האופטימלית.
איך נראית ארכיטקטורת orchestration בסיסית של Kubernetes עבור backend למובייל?
מערך רכיבים טיפוסי:
| רכיב | תיאור | מיקום |
|---|---|---|
| API Deployment | שירות ללא מצב (stateless), קנה מידה אופקי | Deployment נפרד עם HPA |
| שירות WebSocket | חיבורים עם מצב (stateful) או דרך Redis Pub/Sub | Deployment נפרד + Redis |
| Worker Deployment | משימות רקע (resize, push) | Deployment נפרד |
| PostgreSQL | מסד נתונים | StatefulSet או שירות מנוהל (RDS, Cloud SQL) |
| Redis | מטמון ו-Pub/Sub | StatefulSet או מנוהל (ElastiCache, Memorystore) |
| Ingress | סיום TLS, איזון עומסים | nginx-ingress או Traefik |
Deployment ו-HPA — הגדרת orchestration של Kubernetes
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mobile-api
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: mobile-api
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0 # Zero-downtime
template:
metadata:
labels:
app: mobile-api
spec:
containers:
- name: api
image: ghcr.io/myorg/mobile-api:1.2.3
ports:
- containerPort: 3000
env:
- name: DATABASE_URL
valueFrom:
secretKeyRef:
name: db-credentials
key: url
- name: REDIS_URL
valueFrom:
secretKeyRef:
name: redis-credentials
key: url
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health/live
port: 3000
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe:
httpGet:
path: /health/ready
port: 3000
initialDelaySeconds: 5
periodSeconds: 5
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 5"]
---
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: mobile-api-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: mobile-api
minReplicas: 2
maxReplicas: 20
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
ה-preStop sleep של 5 שניות נחוץ כדי שה-Ingress יוכל להסיר את ה-Pod מהרוטציה לפני שהוא מתחיל לנתק חיבורים. כפי שמומלץ ב-preStop hook, שלב זה מבטיח zero-downtime במהלך עדכונים מתגלגלים.
מה לעשות אם HPA לא מבצע קנה מידה?
בעיה נפוצה היא שמדדים לא מגיעים ל-HPA. בדקו אם metrics-server פועל ואם ה-target averageUtilization נכון. עבור מדדים מותאמים אישית (למשל, מבוססי RPS), השתמשו ב-Prometheus Adapter עם תצורה לאיסוף מדדים מכל pod. אנחנו מקצים יומיים לניפוי באגים ב-HPA במהלך ההשקה הראשונה.
| אסטרטגיית עדכון | פשטות | Zero-downtime | מורכבות תצורה |
|---|---|---|---|
| RollingUpdate | גבוהה | כן (עם probes) | נמוכה |
| BlueGreen | בינונית | כן | בינונית |
סודות (Secrets) ונתונים חסויים
מפתחות APNs .p8, מפתח שרת FCM, סודות JWT — ב-Kubernetes Secrets:
kubectl create secret generic apns-credentials \
--from-file=AuthKey_XXXXXX.p8 \
--from-literal=key_id=XXXXXXXXXX \
--from-literal=team_id=YYYYYYYYYYלסביבת production, השתמשו ב-External Secrets Operator עם AWS Secrets Manager או HashiCorp Vault — זה מאפשר סיבוב סודות (rotating) ללא יצירה ידנית מחדש של Kubernetes Secrets.
WebSocket ו-sticky sessions
WebSocket הוא חיבור עם מצב. במהלך עדכון מתגלגל, ה-Pod הישן חייב לחכות שכל החיבורים הפעילים יסתיימו. תצורת nginx-ingress:
---
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"
עדיף להפוך את שירות ה-WebSocket לחסר מצב דרך Redis Pub/Sub: הלקוח מתחבר לכל pod, והודעות מנותבות דרך ערוץ Redis. אז עדכונים מתגלגלים הם שקופים.
ניטור ו-observability
Prometheus + Grafana הוא הסטנדרט עבור Kubernetes. עבור backend למובייל, מדדים מרכזיים:
-
apiVersion: apps/v1 kind: Deployment metadata: name: mobile-api namespace: production spec: replicas: 3 selector: matchLabels: app: mobile-api strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 # Zero-downtime template: metadata: labels: app: mobile-api spec: containers: - name: api image: ghcr.io/myorg/mobile-api:1.2.3 ports: - containerPort: 3000 env: - name: DATABASE_URL valueFrom: secretKeyRef: name: db-credentials key: url - name: REDIS_URL valueFrom: secretKeyRef: name: redis-credentials key: url resources: requests: memory: "256Mi" cpu: "100m" limits: memory: "512Mi" cpu: "500m" livenessProbe: httpGet: path: /health/live port: 3000 initialDelaySeconds: 10 periodSeconds: 10 readinessProbe: httpGet: path: /health/ready port: 3000 initialDelaySeconds: 5 periodSeconds: 5 lifecycle: preStop: exec: command: ["/bin/sh", "-c", "sleep 5"]עם אחוזונים p50/p95/p99 -
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: mobile-api-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: mobile-api minReplicas: 2 maxReplicas: 20 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80(רגיל: עד 10,000 לכל pod) -
kubectl create secret generic apns-credentials \ --from-file=AuthKey_XXXXXX.p8 \ --from-literal=key_id=XXXXXXXXXX \ --from-literal=team_id=YYYYYYYYYY(יעד: 99.9%) -
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600" nginx.ingress.kubernetes.io/proxy-send-timeout: "3600" nginx.ingress.kubernetes.io/upstream-hash-by: "$remote_addr"ו-http_request_duration_seconds
התראות על p99 latency > 500ms, שיעור שגיאות > 0.5%, מספר הפעלות מחדש של pod > 3 תוך 5 דקות. הגדרת התראות כלולה בעלות — צרו קשר לפרטים.
למה GitOps הוא הסטנדרט לניהול תשתית?
ArgoCD או Flux עוקבים אחר שינויים במאגר Git עם manifests ומיישמים אותם על ה-cluster. CI רק בונה את התמונה ומעדכן את ה-tag ב-manifest דרך websocket_connections_active או ערכי Helm:
---
# .github/workflows/deploy.yml
- name: Update image tag
run: |
cd k8s/overlays/production
kustomize edit set image ghcr.io/myorg/mobile-api=ghcr.io/myorg/mobile-api:${{ github.sha }}
git commit -am "deploy: ${{ github.sha }}"
git push
ArgoCD רואה את ה-commit ומסנכרן את ה-cluster. GitOps מבטיח שה-cluster תמיד תואם למצב במאגר. זה מגביר שקיפות, מפשט ביקורת, ומפחית את הסיכון לטעויות אנוש במהלך deployment. המהנדסים שלנו מחזיקים בהסמכות CKA ו-CKAD, כך שיישום GitOps מתנהל בצורה חלקה.
תהליך העבודה ומה כלול
שלבים:
- ביקורת על התשתית הקיימת
- עיצוב מבנה namespace/RBAC
- כתיבת manifests (Deployment, Service, Ingress, HPA)
- הגדרת ניהול סודות
- הגדרת ניטור (Prometheus, Grafana, התראות)
- אינטגרציית CI/CD (GitOps, ArgoCD/Flux)
- בדיקת עומסים של auto-scaling עם עומס שיא של 200%
- תיעוד והדרכת צוות (2 מפגשים)
- תמיכה לאחר ההשקה (חודש)
שימו לב: מה כלול בתוצאה:
- Helm charts או Kustomize overlays לכל הרכיבים
- תיעוד ארכיטקטורה ו-runbook
- גישה לניטור והתראות
- גישה למאגר Git עם היסטוריה
- הדרכת צוות (2 מפגשים של שעתיים)
- אחריות לפעולה תקינה של HPA ועדכונים מתגלגלים
לוח זמנים: 5 ימים עבור backend טיפוסי על GKE/EKS/AKS. העלות מחושבת באופן אישי לאחר ניתוח הארכיטקטורה ודרישות SLA. מידע נוסף על עלות ולוח זמנים
אנחנו מעריכים כל פרויקט בנפרד. תוכלו לקבל הערכה ראשונית תוך שעה. הזמינו ביקורת על התשתית הנוכחית שלכם — צרו קשר.
בקשו ייעוץ, ונכין תוכנית מותאמת אישית.







