مقال مرتبط · هذا الدليل جزء من سلسلة 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. هذا النمط يتفادى انقطاعات الخدمة المتربّطة بسوء تقدير للتبعيات.