0%
أساسيات Kubernetes: دليل شامل لتنسيق حاوياتك

أساسيات Kubernetes: دليل شامل لتنسيق حاوياتك

اكتشف كيف تُحدث Kubernetes ثورة في نشر التطبيقات المعبأة في حاويات وإدارتها. دليل عملي مع أمثلة واقعية.

I

InSkillCoach

· دقيقة

أساسيات Kubernetes: دليل شامل لتنسيق حاوياتك

أصبحت Kubernetes (K8s) المنصة المعيارية لتنسيق الحاويات (Orchestration) على نطاق واسع. يعرض لك هذا الدليل المفاهيم الأساسية في Kubernetes وكيفية استخدامها بفعالية لإدارة تطبيقاتك المعبأة في حاويات.

ما هي Kubernetes؟

Kubernetes منصة مفتوحة المصدر أنشأتها Google لأتمتة نشر التطبيقات المعبأة في حاويات وتغيير حجمها وإدارتها. وهي توفر إطارًا لتشغيل الأنظمة الموزعة بشكل مرن وقادر على التعافي.

لماذا Kubernetes؟

  • النشر الآلي: نشر وتحديثات دون توقف عن الخدمة
  • الإصلاح الذاتي: إعادة تشغيل الحاويات المعطلة تلقائيًا
  • التوسع الأفقي: ضبط السعة تلقائيًا بحسب الحمل
  • موازنة الحمل: توزيع حركة المرور بين النسخ
  • تنسيق التخزين: إدارة التخزين الدائم
  • إدارة الإعدادات: فصل الشيفرة عن الإعدادات
  • دعم السحابات المتعددة: تعمل على جميع مزودي الخدمات السحابية الرئيسيين

معمارية Kubernetes

تتكون معمارية Kubernetes من عدة مكونات أساسية:

مستوى التحكم (Control Plane)

  • API Server: نقطة الدخول لجميع أوامر REST
  • etcd: قاعدة بيانات من نوع مفتاح-قيمة لتخزين حالة العنقود
  • Scheduler: يسند الـ pods إلى العُقد
  • Controller Manager: يحافظ على الحالة المطلوبة للعنقود
  • Cloud Controller Manager: واجهة التعامل مع واجهات برمجة التطبيقات (APIs) الخاصة بمزودي الخدمات السحابية

العُقد (Nodes)

  • Kubelet: وكيل يعمل على كل عقدة ويتأكد من أن الحاويات تعمل
  • Kube-proxy: يحافظ على قواعد الشبكة على العُقد
  • Container Runtime: البرنامج المسؤول عن تشغيل الحاويات (Docker وcontainerd وغيرهما)

تثبيت Kubernetes

Minikube (للتطوير المحلي)

# Installation sur Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# Démarrer un cluster Kubernetes local
minikube start

# Vérifier l'état
minikube status

kubeadm (لعناقيد الإنتاج)

# Installation des prérequis
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

# Ajouter la clé GPG et le dépôt Kubernetes
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# Installer kubeadm, kubelet et kubectl
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

# Initialiser le cluster (sur le nœud maître)
sudo kubeadm init --pod-network-cidr=192.168.0.0/16

# Configurer kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubectl (أداة سطر الأوامر)

# Installation sur Linux
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# Vérifier l'installation
kubectl version --client

المفاهيم الأساسية في Kubernetes

Pods

الـ pod هو الوحدة الأساسية في Kubernetes، ويمثل حاوية واحدة أو أكثر تتشارك التخزين والشبكة.

# pod.yaml - Exemple de pod simple
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.19
    ports:
    - containerPort: 80
# Créer un pod
kubectl apply -f pod.yaml

# Lister les pods
kubectl get pods

# Décrire un pod
kubectl describe pod nginx-pod

# Supprimer un pod
kubectl delete pod nginx-pod

Deployments

تتيح الـ deployments إدارة دورة حياة الـ pods والـ ReplicaSets، مما يسهّل التحديثات وعمليات التراجع (rollbacks).

# deployment.yaml - Exemple de déploiement
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.19
        ports:
        - containerPort: 80
# Créer un déploiement
kubectl apply -f deployment.yaml

# Lister les déploiements
kubectl get deployments

# Mettre à jour l'image d'un déploiement
kubectl set image deployment/nginx-deployment nginx=nginx:1.20

# Effectuer un rollback
kubectl rollout undo deployment/nginx-deployment

Services

تتيح الـ services إتاحة التطبيقات العاملة على مجموعة من الـ pods.

# service.yaml - Exemple de service
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP  # Autres types: NodePort, LoadBalancer, ExternalName
# Créer un service
kubectl apply -f service.yaml

# Lister les services
kubectl get services

# Décrire un service
kubectl describe service nginx-service

Namespaces

توفر الـ namespaces آلية لعزل مجموعات الموارد داخل العنقود.

# namespace.yaml - Exemple de namespace
apiVersion: v1
kind: Namespace
metadata:
  name: development
# Créer un namespace
kubectl apply -f namespace.yaml

# Lister les namespaces
kubectl get namespaces

# Créer une ressource dans un namespace spécifique
kubectl apply -f pod.yaml -n development

ConfigMaps وSecrets

تتيح فصل الإعدادات عن الحاويات.

# configmap.yaml - Exemple de ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  database.host: "db.example.com"
  database.port: "5432"
# secret.yaml - Exemple de Secret
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  # Les valeurs doivent être encodées en base64
  database.password: cGFzc3dvcmQxMjM=  # "password123" encodé en base64
# Créer un ConfigMap
kubectl apply -f configmap.yaml

# Créer un Secret
kubectl apply -f secret.yaml

# Utiliser un ConfigMap dans un pod
spec:
  containers:
  - name: app
    image: app:1.0
    envFrom:
    - configMapRef:
        name: app-config

استخدام الـ Volumes

تتيح الـ volumes تخزين البيانات بما يتجاوز عمر الـ pod.

# pvc.yaml - Exemple de PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
# pod-with-volume.yaml - Pod utilisant un volume
apiVersion: v1
kind: Pod
metadata:
  name: data-pod
spec:
  containers:
  - name: data-container
    image: nginx
    volumeMounts:
    - mountPath: "/data"
      name: data-volume
  volumes:
  - name: data-volume
    persistentVolumeClaim:
      claimName: data-pvc

إدارة الـ Ingress

يتيح الـ Ingress الوصول إلى خدمات HTTP وHTTPS من خارج العنقود.

# ingress.yaml - Exemple d'Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /app
        pathType: Prefix
        backend:
          service:
            name: app-service
            port:
              number: 80
# Installer un contrôleur Ingress (exemple avec NGINX)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/cloud/deploy.yaml

# Créer un Ingress
kubectl apply -f ingress.yaml

تصحيح أخطاء التطبيقات

السجلات والصدفة التفاعلية

# Afficher les logs d'un pod
kubectl logs nginx-pod

# Exécuter une commande dans un pod
kubectl exec -it nginx-pod -- /bin/bash

# Suivre les logs en temps réel
kubectl logs -f nginx-pod

تشخيص المشكلات

# Vérifier l'état d'un pod
kubectl get pod nginx-pod -o wide

# Décrire un pod pour voir les événements
kubectl describe pod nginx-pod

# Vérifier les nœuds
kubectl get nodes
kubectl describe node <node-name>

إدارة الموارد

حدود الموارد

# resource-limits.yaml - Exemple de limites de ressources
apiVersion: v1
kind: Pod
metadata:
  name: resource-pod
spec:
  containers:
  - name: app
    image: app:1.0
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

Horizontal Pod Autoscaler (HPA)

# hpa.yaml - Exemple d'autoscaling
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: app-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
# Créer un HPA
kubectl apply -f hpa.yaml

# Lister les HPAs
kubectl get hpa

الأمان في Kubernetes

RBAC (التحكم في الوصول القائم على الأدوار)

# role.yaml - Exemple de rôle
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
# rolebinding.yaml - Exemple de liaison de rôle
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: User
  name: jane
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

Network Policies

# network-policy.yaml - Exemple de politique réseau
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-network-policy
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: app
    ports:
    - protocol: TCP
      port: 5432

أفضل الممارسات في Kubernetes

  1. استخدم الـ deployments بدلًا من الـ pods المنفردة
  2. حدّد حدود الموارد لجميع الحاويات
  3. اضبط فحوص الجاهزية (liveness وreadiness probes)
  4. طبّق التوسع الأفقي للأحمال المتغيرة
  5. افصل البيئات باستخدام الـ namespaces
  6. استخدم الـ labels والـ annotations لتنظيم الموارد
  7. طبّق سياسات الشبكة لتأمين الاتصالات
  8. اضبط RBAC للحد من الوصول
  9. استخدم الـ Secrets للبيانات الحساسة
  10. ضع استراتيجية نسخ احتياطي لـ etcd

أدوات مكملة لـ Kubernetes

Helm (مدير الحزم)

# Installation de Helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

# Ajouter un dépôt
helm repo add bitnami https://charts.bitnami.com/bitnami

# Installer une application
helm install my-release bitnami/wordpress

Kustomize (إدارة الإعدادات)

# kustomization.yaml - Exemple de configuration Kustomize
resources:
- deployment.yaml
- service.yaml

namespace: my-namespace

commonLabels:
  app: my-app
  environment: production
# Appliquer une configuration Kustomize
kubectl apply -k ./

Prometheus وGrafana (المراقبة)

# Installation via Helm
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack

الخاتمة

أصبحت Kubernetes الأداة المعيارية لتنسيق الحاويات بفضل مرونتها ومتانتها ونظامها البيئي الغني. ويُعد فهم مفاهيمها الأساسية أمرًا ضروريًا لإدارة التطبيقات الحديثة على نطاق واسع بكفاءة.

عند إتقانك Kubernetes ستتمكن من:

  • نشر التطبيقات على نطاق واسع
  • ضمان توافر عالٍ
  • تحسين استخدام الموارد
  • تبسيط العمليات
  • توفير نموذج تصريحي لإدارة البنية التحتية

قد يكون منحنى التعلم في Kubernetes حادًا، لكن الاستثمار فيه يستحق العناء لأي فريق يعمل مع معماريات قائمة على الحاويات.

InSkillCoach

نبذة عن InSkillCoach

خبير في التدريب والتقنيات

مدرّب متخصص في التقنيات المتقدمة والذكاء الاصطناعي، تدعمه شركة GNeurone Inc.

الشهادات:

  • AWS Certified Solutions Architect – Professional
  • شهادات Google Cloud
  • Microsoft Certified: DevOps Engineer Expert
  • Certified Kubernetes Administrator (CKA)
  • CompTIA Security+
1.4k
254

التعليقات

التعليقات مدعومة عبر GitHub Discussions

سجّل الدخول باستخدام GitHub للمشاركة في النقاش

تم نسخ الرابط!