Kubernetes وتنسيق الحاويات
أحمال عمل وشبكات Kubernetes
4 دقيقة للقراءة
أتقن أحمال عمل K8s ومفاهيم الشبكات لمقابلات DevOps/SRE.
دورة حياة Pod
Pending → Running → Succeeded/Failed
↓
(CrashLoopBackOff)
مراحل Pod
| المرحلة | المعنى |
|---|---|
| Pending | ينتظر الجدولة أو سحب الصورة |
| Running | حاوية واحدة على الأقل تعمل |
| Succeeded | جميع الحاويات خرجت بنجاح (0) |
| Failed | حاوية واحدة على الأقل فشلت |
| Unknown | فُقد الاتصال بالعقدة |
الفحوصات
apiVersion: v1
kind: Pod
spec:
containers:
- name: app
image: myapp
# Liveness: إعادة التشغيل إذا فشل
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
failureThreshold: 3
# Readiness: إزالة من Service إذا فشل
readinessProbe:
httpGet:
path: /ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
# Startup: تأخير الفحوصات الأخرى أثناء البدء
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 30
periodSeconds: 10
| الفحص | الغرض | عند الفشل |
|---|---|---|
| Liveness | هل الحاوية حية؟ | إعادة تشغيل الحاوية |
| Readiness | هل يمكن خدمة الحركة؟ | إزالة من Service |
| Startup | هل لا يزال يبدأ؟ | تأخير الفحوصات الأخرى |
إدارة الموارد
resources:
requests: # ضمان الجدولة
memory: "256Mi"
cpu: "250m" # 0.25 نواة CPU
limits: # السقف الصارم
memory: "512Mi"
cpu: "500m"
فئات QoS
| الفئة | الشرط | الأولوية |
|---|---|---|
| Guaranteed | requests = limits لجميع الموارد | الأعلى (آخر من يُخلى) |
| Burstable | requests < limits | متوسطة |
| BestEffort | بدون requests أو limits | الأدنى (أول من يُخلى) |
شبكات Kubernetes
أنواع Service
# ClusterIP (افتراضي) - داخلي فقط
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
selector:
app: web
ports:
- port: 80
targetPort: 8080
| النوع | الوصول | حالة الاستخدام |
|---|---|---|
| ClusterIP | داخلي فقط | التواصل بين الخدمات |
| NodePort | <NodeIP>:<NodePort> |
التطوير، الوصول المباشر |
| LoadBalancer | LB خارجي | التعرض السحابي للإنتاج |
| ExternalName | DNS CNAME | تسمية الخدمات الخارجية |
Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
tls:
- hosts:
- app.example.com
secretName: app-tls-secret
Network Policies
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-network-policy
spec:
podSelector:
matchLabels:
app: api
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
app: web
ports:
- port: 8080
egress:
- to:
- podSelector:
matchLabels:
app: database
ports:
- port: 5432
الجدولة والتقارب
Node Affinity
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-type
operator: In
values:
- high-memory
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: zone
operator: In
values:
- us-east-1a
Pod Anti-Affinity
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: web
topologyKey: kubernetes.io/hostname
حالة الاستخدام: توزيع النسخ عبر العقد للتوفر العالي
Taints والتحملات
# Taint عقدة
kubectl taint nodes node1 dedicated=gpu:NoSchedule
# Pod يجب أن يتحمل ليُجدول
spec:
tolerations:
- key: "dedicated"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
| التأثير | السلوك |
|---|---|
| NoSchedule | لن يُجدول pods جديدة |
| PreferNoSchedule | حاول تجنب الجدولة |
| NoExecute | إخلاء pods الموجودة أيضاً |
أسئلة المقابلة
س: "Deployment لديه 3 نسخ لكن فقط 2 pods تعمل. كيف تستكشف الأخطاء؟"
# تحقق من حالة deployment
kubectl get deployment myapp
kubectl describe deployment myapp
# تحقق من replicaset
kubectl get rs -l app=myapp
kubectl describe rs <rs-name>
# تحقق من pods
kubectl get pods -l app=myapp
kubectl describe pod <pending-pod>
# تحقق من الأحداث
kubectl get events --sort-by='.lastTimestamp'
# المشاكل الشائعة:
# - موارد غير كافية (تحقق من سعة العقدة)
# - أخطاء سحب الصورة (تحقق من اسم الصورة/السجل)
# - node affinity لا يمكن إرضاؤه
# - PVC لا يمكن ربطه
س: "كيف تضمن توزيع pods بالتساوي عبر مناطق التوفر؟"
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: web
التالي، سنتقن استكشاف أخطاء Kubernetes—المهارة التي تُعرّف المهندسين الكبار. :::