تطوير الويب

نشر Cilium CNI مع eBPF على Kubernetes خطوة بخطوة

1 min de lecture

مقال مرتبط · هذا الدليل جزء من سلسلة Kubernetes منزلي على Proxmox VE. الدليل السابق: kubeadm مقابل k3s. الدليل التالي: Rook-Ceph storage.

بعد bootstrap لـ Kubernetes، تبقى العقد في حالة NotReady ما دام CNI غير مثبَّت. الـ CNI (Container Network Interface) هو الطبقة التي تُعطي IP لكلّ pod، توجّه الحزم بين العقد، تُطبّق سياسات الشبكة، وتُغذّي مراقبة الترافيك. Cilium هو اليوم الـ CNI الأكثر نضوجًا من بين الذين يستعملون eBPF، تقنية في نواة Linux تُتيح تشغيل برامج آمنة مباشرة في datapath النواة. الإصدار المستقرّ 1.19.3 الصادر في ربيع 2026 يُضيف دعم Cilium Network Policies متعدّد العنقود ويُحسِّن أداء Bandwidth Manager. يُثبّت هذا الدليل Cilium 1.19، يُفعِّل Hubble للمراقبة، ويُرسي أولى سياسات الشبكة.

الخطوة 1 — تثبيت CLI cilium وتحضير العنقود

الـ CLI cilium أداة الإدارة الرسمية: تُثبّت chart Helm، تُدير مكوّنات Hubble، وتُوفّر أوامر تشخيص مثل cilium connectivity test. نُنزِّلها من إصدارات GitHub الرسمية.

# تثبيت cilium-cli على محطّة العمل
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
curl -L --fail --remote-name-all \
  https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-amd64.tar.gz
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
rm cilium-linux-amd64.tar.gz
cilium version --client

خرج cilium version --client يجب عرض إصدار متوافق مع Cilium 1.19. الـ CLI بعدها مستقلّ عن العنقود؛ يتكيّف مع kubeconfig النشط.

الخطوة 2 — تحضير Talos لـ Cilium بوضع kube-proxy replacement

Cilium يستطيع استبدال kube-proxy كلّيًّا، ممّا يُلغي iptables لصالح eBPF أصلي. هذا الوضع الموصى به. على Talos، يُعلَن التغيير على مستوى machineconfig، لأنّ Talos يُوفّر kube-proxy افتراضيًّا.

# تعطيل kube-proxy على مستوى Talos
cat > patch-no-kube-proxy.yaml <

إعادة التشغيل المتتابعة تُبقي quorum etcd. في النهاية، kubectl get pods -n kube-system لا يجب أن يُدرج pod kube-proxy. تبقى العقد NotReady حتى يأخذ Cilium الراية.

الخطوة 3 — تثبيت Cilium 1.19 عبر Helm

helm repo add cilium https://helm.cilium.io/
helm repo update

# تثبيت Cilium 1.19 مع eBPF kube-proxy replacement
helm install cilium cilium/cilium --version 1.19.3 \
  --namespace kube-system \
  --set kubeProxyReplacement=true \
  --set k8sServiceHost=192.168.1.60 \
  --set k8sServicePort=6443 \
  --set hubble.enabled=true \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true \
  --set ipam.mode=kubernetes \
  --set bpf.masquerade=true

Helm ينشر DaemonSet cilium-agent على كلّ عقدة، المُشَغِّل cilium-operator، Hubble Relay وHubble UI. احسب 3 إلى 5 دقائق قبل أن تمرّ كلّ الـ pods إلى Running. الخطوة المفتاح هي تهيئة eBPF في نواة كلّ عقدة، يمكن مراقبتها بـ kubectl logs -n kube-system -l k8s-app=cilium -f.

الخطوة 4 — التحقّق من توصيل العنقود

cilium status --wait
# يجب عرض Cilium: OK، Operator: OK، Hubble Relay: OK، ClusterMesh: disabled

cilium connectivity test
# يُشغّل نحو 90 اختبارًا في 3 إلى 5 دقائق
# النتيجة المنتظرة: 90 tests passed

إن مرّت كلّ الاختبارات، شبكة العنقود سليمة. تبدّل العقد إلى Ready، يخرج CoreDNS من Pending، وأيّ حِمل يُنشَر من الآن سيكون توصيله الشبكي مضمونًا. إن فشل اختبار، الخرج يُبيّن أيّ مسار يُسبّب مشكلة.

الخطوة 5 — تفعيل Hubble UI لمراقبة الترافيك

Hubble هو مكوّن مراقبة Cilium. يلتقط تدفّقات L3/L4/L7 مباشرة في eBPF (بلا كلفة على الـ pods) ويكشفها عبر واجهة ويب وCLI.

cilium hubble port-forward &
# Hubble Relay يصير متاحًا على localhost:4245

cilium hubble ui --port-forward 12000
# يفتح http://localhost:12000 في المتصفّح

الواجهة تعرض رسمًا حيًّا للاتصالات بين الـ pods والـ namespaces. النقر على سهم يُظهر التدفّقات الأخيرة مع verbose method، رمز HTTP، وزمن الاستجابة.

الخطوة 6 — نشر حِمل اختبار ومراقبته

kubectl create namespace demo
kubectl run web --image=nginx --port=80 --namespace demo
kubectl expose pod web --port=80 --namespace demo

kubectl run client --image=curlimages/curl --namespace demo \
  --rm -it --restart=Never -- \
  sh -c "for i in 1 2 3 4 5; do curl -s -o /dev/null -w '%{http_code}\n' http://web; done"

الأكواد الخمسة 200 تُؤكِّد أنّ pod client يستطيع الوصول إلى خدمة web عبر ClusterIP. في Hubble UI، تظهر هذه الطلبات مباشرة على رسم namespace demo، مع طريقة HTTP وكود الاستجابة.

الخطوة 7 — كتابة أوّل Cilium Network Policy

دون سياسة، كلّ الـ pods تتواصل بحرّية. لتطبيق مبدأ الامتياز الأدنى، نبدأ بـ default-deny على مستوى namespace، ثم نسمح صراحة بالتدفّق الشرعي.

# default-deny.yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: default-deny
  namespace: demo
spec:
  endpointSelector: {}
  ingress:
  - {}
  egress:
  - {}
---
# allow-client-to-web.yaml
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: allow-client-to-web
  namespace: demo
spec:
  endpointSelector:
    matchLabels:
      run: web
  ingress:
  - fromEndpoints:
    - matchLabels:
        run: client
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP
kubectl apply -f default-deny.yaml
kubectl apply -f allow-client-to-web.yaml

# اختبر: العميل المُصرَّح به وحده يصل إلى web
kubectl run intruder --image=curlimages/curl --namespace demo \
  --rm -it --restart=Never -- \
  curl -s -o /dev/null -w '%{http_code}\n' --max-time 3 http://web
# يجب إظهار 000 (timeout) لأنّ السياسة تحظر

kubectl run client --image=curlimages/curl --namespace demo \
  --rm -it --restart=Never -- \
  curl -s -o /dev/null -w '%{http_code}\n' http://web
# يجب إظهار 200 لأنّ client مُصرَّح به

الكود الأوّل 000 يُؤكِّد أنّ السياسة تحظر الترافيك غير المُصرَّح، الكود الثاني 200 يُؤكِّد أنّها تسمح للشرعي. نمط default-deny ثم allowlist هو قاعدة أمن الشبكة في Kubernetes.

الخطوة 8 — تفعيل L7 visibility وسياسات HTTP

Cilium لا يقتصر على L4. مع eBPF يستطيع فحص ترويسات HTTP وتطبيق قواعد على مستوى الطريقة والمسار. مفيد لكشف خدمة في وضع للقراءة فقط دون إعادة كتابة التطبيق.

apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
  name: l7-readonly
  namespace: demo
spec:
  endpointSelector:
    matchLabels:
      run: web
  ingress:
  - fromEndpoints:
    - matchLabels:
        run: client
    toPorts:
    - ports:
      - port: "80"
        protocol: TCP
      rules:
        http:
        - method: "GET"
          path: "/"

بهذه السياسة، POST أو DELETE من pod client سيستلم 403 Forbidden مولَّد من Cilium، دون أن يبلغ nginx حتى. هذه القدرة L7 تُميِّز Cilium عن CNIs المعتمدة على iptables مثل Calico القياسي.

الخطوة 9 — نسخ تكوين Cilium احتياطيًّا

helm get values cilium -n kube-system > cilium-values.yaml
git add cilium-values.yaml
# نسِّقه في مستودع Git الذي يستعمله Argo CD (الدليل التالي)

رؤية ملفّ cilium-values.yaml يظهر بالخيارات الدقيقة المستعملة يُتيح لأيّ مُشَغِّل آخر إعادة بناء Cilium مطابق بأمر helm upgrade --install --values cilium-values.yaml.

أخطاء شائعة وحلولها

العَرَض السبب الحلّ
كلّ الـ cilium-agent في CrashLoopBackOff kube-proxy غير مُعَطَّل على العقد تحقّق من machineconfig Talos ثم أعد تشغيل كلّ عقدة
cilium connectivity test يفشل على pod-to-pod inter-node MTU سيّء الضبط (مثلًا نفق VXLAN على رابط 1500) أضف --set tunnelProtocol=geneve --set MTU=1450 إلى helm install
Hubble UI يعرض رسمًا فارغًا Hubble Relay غير قابل للوصول من port-forward تحقّق من kubectl logs -n kube-system -l k8s-app=hubble-relay
CiliumNetworkPolicy لا يبدو مطبَّقًا خلط بين NetworkPolicy وCiliumNetworkPolicy تحقّق من apiVersion: cilium.io/v2 ووجود الـ CRD
أداء شبكي مُتَدَنٍّ بعد التثبيت Bandwidth Manager غير مُفَعَّل فعِّل --set bandwidthManager.enabled=true وأعد تشغيل الـ agents

لاستكمال المسار

شبكة Kubernetes تعمل وقابلة للمراقبة. الطبقة التالية المفقودة هي التخزين المستمرّ: دون CSI، لا يمكن تشغيل سوى أحمال عابرة. دليل تخزين مستمرّ مع Rook-Ceph يُفَصِّل تركيب Ceph موزَّع على workers عبر مُشَغِّل Rook. للنظرة العامّة، عُد إلى الدليل الرئيسي.

مصادر وتوثيق رسمي

  • توثيق Cilium 1.19: docs.cilium.io/v1.19
  • Cilium kube-proxy replacement: docs.cilium.io/kubeproxy-free
  • توثيق Hubble: docs.cilium.io/observability/hubble
  • تكامل CNI Talos: talos.dev/deploying-cilium
  • مواصفات Cilium Network Policy: docs.cilium.io/security/policy
  • مؤسّسة eBPF: ebpf.io

الخطوة 10 — فهم ما يُغيّره eBPF فعلًا

قوة Cilium الرئيسية مقارنة بـ CNIs المعتمدة على iptables هي الأداء والمراقبة، والاثنان ينبثقان من الخيار التقني نفسه: تنفيذ كود التوجيه والتصفية مباشرة في نواة Linux عبر eBPF، دون عبور stack iptables. على عنقود بألف خدمة وعشرة آلاف endpoint، يجب على iptables تقييم سلاسله خطّيًّا لكلّ حزمة — يصير زمن الاستجابة قابلًا للقياس. مع eBPF، يُجمِّع Cilium جدول hash يحلّ كلّ تدفّق في O(1).

الأثر العملي في homelab يبقى متواضعًا على أحمال خفيفة. لكن على عنقود مع Rook-Ceph يدفع عشرات الآلاف من الحزم بالثانية بين OSDs، يجلب إلغاء iptables ربحًا صافيًا في زمن الاستجابة وCPU المستهلَك في datapath. عاقبة ثانية هي القابلية للبرمجة: Cilium يستطيع تحميل برامج eBPF مستخدمة (عبر Tetragon) ترصد استدعاءات النظام في النواة، وهذا ما يُتيح لأدوات مثل Falco كشف سلوكيات شاذّة دون patch للنواة.

الخطوة 11 — تفعيل BGP لكشف الخدمات

Cilium 1.19 يحوي مُشَغِّل BGP يستطيع الإعلان عن LoadBalancer IPs لموجّه الشبكة المحلّية. بديل لـ MetalLB لمن يملكون موجّهًا متوافقًا مع BGP (OPNsense، MikroTik، OpenWrt مع FRR).

apiVersion: cilium.io/v2
kind: CiliumBGPClusterConfig
metadata:
  name: cilium-bgp
spec:
  nodeSelector:
    matchLabels:
      bgp: enabled
  bgpInstances:
  - name: instance-65000
    localASN: 65000
    peers:
    - name: home-router
      peerASN: 65001
      peerAddress: 192.168.1.1
      peerConfigRef:
        name: peer-config-default

بمجرّد إنشاء BGP adjacency (قابلة للتحقّق بـ cilium bgp peers)، كلّ خدمة LoadBalancer تُنشئ مسار /32 معلَنًا للموجّه. للمستخدمين بلا موجّه BGP، MetalLB يبقى البديل الأبسط.

الخطوة 12 — مراقبة استهلاك مكوّنات Cilium

القيم النمطية في homelab بست عقد، حِمل خفيف: cilium-agent يستهلك 80 إلى 150 ميغا RSS لكلّ عقدة، cilium-operator نحو 60 ميغا، hubble-relay نحو 40 ميغا، hubble-ui نحو 30 ميغا. إن تجاوز الـ agent 500 ميغا على عقدة، فعلى الأرجح يوجد تسرّب أو سياسة سيّئة الكتابة تُفجِّر جدول الحالات.

kubectl top pods -n kube-system -l k8s-app=cilium
kubectl top pods -n kube-system -l k8s-app=hubble-relay
cilium status --verbose | grep -A 5 "Memory"

الخطوة 13 — تحضير الانتقال إلى سياسات الأعمال

في إنتاج homelab، الممارسة الجارية تطبيق default-deny على مستوى namespace فور إنشائه، ثم تنسيق سياسات السماح مع manifest التطبيق. Argo CD، الذي يُنشَر في الدليل التالي، سيُزامن المجموع. الانضباط المُربح كتابة السياسة في نفس وقت النشر، لا بعده.

ممارسة جيّدة مكمِّلة هي تفعيل وضع audit قبل وضع enforce على السياسات الحسّاسة. Cilium يُتيح وَسم سياسة بـ policy.cilium.io/audit-mode: "true"، فيُسجِّل الحجبات في Hubble دون حظر الترافيك. نُلاحظ لـ 24 أو 48 ساعة، نُعدِّل، ثم نمرّ إلى enforce. هذا النمط يتفادى انقطاعات الخدمة المتربّطة بسوء تقدير للتبعيات.

مقالات ذات صلة

Sponsoriser ce contenu

Cet emplacement est à vous

Position premium en fin d'article — c'est l'instant où les lecteurs sont le plus engagés. Réservez cet espace pour votre marque, votre formation ou votre offre.

Recevoir nos tarifs
Publicité