Kubernetes CNI با Cilium - پروژه عملی

نصب و پیکربندی Cilium به‌عنوان CNI در Kubernetes، Networking Policy و Hubble Observability

هدف پروژه

در این لابراتوار یک Kubernetes Cluster ساخته می‌شود و Cilium به‌عنوان CNI روی آن قرار می‌گیرد.

در پایان باید بتوانیم:

  • Kubernetes را با kubeadm bootstrap کنیم.
  • containerd را به‌عنوان CRI آماده کنیم.
  • Cilium را به‌عنوان CNI نصب کنیم.
  • Pod-to-Pod و Pod-to-Service را تست کنیم.
  • DNS و Service Discovery را بررسی کنیم.
  • NetworkPolicy بسازیم.
  • Hubble را برای مشاهده Flowها فعال کنیم.
  • Cilium را Troubleshoot کنیم.
  • تفاوت kube-proxy و Cilium kube-proxy replacement را بفهمیم.
  • یک سناریوی production-like را پیاده‌سازی و Failure Test کنیم.

CNI در Kubernetes مسئول پیاده‌سازی Pod Network Model است و Kubernetes توصیه می‌کند Pod CIDR با شبکه‌های Host overlap نداشته باشد و در هر Cluster فقط یک Pod Network نصب شود. citeturn0search3turn0search7


1. معماری پروژه

برای Lab:

 1                    Kubernetes API
 2                    192.168.10.10:6443
 3                           │
 4              ┌────────────┼────────────┐
 5              │            │            │
 6              ▼            ▼            ▼
 7          control-01   control-02   control-03
 8          192.168.10.11  .12          .13
 9              │            │            │
10              └────────────┼────────────┘
11                           │
12              ┌────────────┼────────────┐
13              ▼            ▼            ▼
14          worker-01    worker-02    worker-03
15          192.168.10.21 .22         .23
16              │            │            │
17           Cilium        Cilium      Cilium
18              │            │            │
19            Pods         Pods        Pods

Network Plan:

1Node Network:     192.168.10.0/24
2Pod Network:      10.244.0.0/16
3Service Network:  10.96.0.0/12
4API Endpoint:     192.168.10.10:6443

این CIDRها نمونه‌اند. اگر با LAN، VPN، Storage Network یا شبکه‌های دیتاسنتر overlap دارند، حتماً تغییرشان دهید.


2. CNI دقیقاً چه کاری انجام می‌دهد؟

Kubernetes به‌تنهایی Pod Networking را کامل پیاده نمی‌کند.

CNI باید کاری کند که این مسیرها برقرار باشند:

1Pod A ─────► Pod B
2
3Pod ───────► Service
4
5Pod ───────► CoreDNS
6
7Pod ───────► External Network

در معماری ما:

 1Kubernetes
 2     │
 3     ▼
 4   Cilium
 5     │
 6     ▼
 7    eBPF
 8     │
 9     ▼
10Linux Kernel
11     │
12     ▼
13Network

Cilium علاوه بر CNI، قابلیت‌هایی مثل NetworkPolicy، Load Balancing، Hubble و kube-proxy replacement را نیز ارائه می‌کند.


3. چرا Cilium؟

Cilium datapath خود را با تکیه بر eBPF در Linux Kernel پیاده‌سازی می‌کند.

مدل سنتی را به‌صورت ساده می‌توان این‌طور دید:

1Packet
2  ↓
3Linux Networking
4  ↓
5iptables / routing
6  ↓
7Destination

در Cilium:

1Packet
2  ↓
3Linux Kernel
4  ↓
5eBPF
6  ↓
7Routing / Policy / LB
8  ↓
9Destination

مزیت مهم فقط performance نیست؛ قابلیت مشاهده‌ی datapath و اعمال policy در سطح identity نیز بسیار مهم است.


4. دو سناریوی نصب

در این آموزش ابتدا حالت پایدار و ساده‌تر را اجرا می‌کنیم:

1Cilium CNI
2+
3kube-proxy

بعد از اینکه Cluster سالم شد، حالت پیشرفته را بررسی می‌کنیم:

1Cilium CNI
2+
3eBPF kube-proxy replacement

این ترتیب برای Lab و Production منطقی‌تر است؛ ابتدا networking پایه را validate می‌کنیم و سپس datapath را پیچیده‌تر می‌کنیم.


5. پیش‌نیازهای Node

روی تمام Nodeها:

1uname -r
2containerd --version
3kubeadm version
4kubelet --version

Cilium در مستندات stable فعلی خود برای نصب عمومی Linux kernel >= 5.10 را requirement اعلام می‌کند. citeturn0search5turn0search8

همچنین:

1swapon --show

اگر swap فعال است:

1sudo swapoff -a

و برای دائمی شدن، entry مربوط به swap را از /etc/fstab حذف یا comment کنید.


6. آماده‌سازی Kernel

روی تمام Nodeها:

1sudo modprobe overlay
2sudo modprobe br_netfilter

Persistent:

1cat <<EOF | sudo tee /etc/modules-load.d/kubernetes.conf
2overlay
3br_netfilter
4EOF

Sysctl:

1cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cilium.conf
2net.bridge.bridge-nf-call-iptables = 1
3net.bridge.bridge-nf-call-ip6tables = 1
4net.ipv4.ip_forward = 1
5EOF

اعمال:

1sudo sysctl --system

بررسی:

1sysctl net.ipv4.ip_forward

باید:

1net.ipv4.ip_forward = 1

باشد.


7. بررسی Interface و Routing

روی هر Node:

1ip -br addr
2ip route

مثلاً:

1eth0    UP    192.168.10.11/24

و:

1default via 192.168.10.1 dev eth0
2192.168.10.0/24 dev eth0

اگر Node چند NIC دارد، Node IP اشتباه می‌تواند باعث مشکل شدید در Cilium و Kubernetes شود.


8. آماده‌سازی containerd

بررسی:

1systemctl status containerd

اگر config ندارید:

1sudo mkdir -p /etc/containerd
2
3containerd config default | \
4  sudo tee /etc/containerd/config.toml

Systemd cgroup:

1sudo sed -i \
2's/SystemdCgroup = false/SystemdCgroup = true/' \
3/etc/containerd/config.toml

Restart:

1sudo systemctl restart containerd
2sudo systemctl enable containerd

بررسی:

1containerd config dump | grep SystemdCgroup

9. آماده‌سازی Hostname و hosts

نمونه:

1192.168.10.11 control-01
2192.168.10.12 control-02
3192.168.10.13 control-03
4192.168.10.21 worker-01
5192.168.10.22 worker-02
6192.168.10.23 worker-03

تست:

1ping -c 3 worker-01

10. Bootstrap Control Plane

برای حالت استاندارد:

1sudo kubeadm init \
2  --control-plane-endpoint "192.168.10.10:6443" \
3  --pod-network-cidr=10.244.0.0/16 \
4  --service-cidr=10.96.0.0/12

بعد kubeconfig:

1mkdir -p $HOME/.kube
2
3sudo cp /etc/kubernetes/admin.conf \
4  $HOME/.kube/config
5
6sudo chown "$(id -u)":"$(id -g)" \
7  $HOME/.kube/config

بررسی:

1kubectl get nodes

در این مرحله ممکن است Node NotReady باشد؛ قبل از نصب CNI طبیعی است. Kubernetes نیز اشاره می‌کند که CoreDNS قبل از نصب Pod Network نمی‌تواند به‌طور کامل فعال شود. citeturn0search3


11. Join کردن Workerها

خروجی kubeadm init یک دستور مشابه زیر می‌دهد:

1sudo kubeadm join 192.168.10.10:6443 \
2  --token <TOKEN> \
3  --discovery-token-ca-cert-hash sha256:<HASH>

همان دستور را روی Workerها اجرا کنید.

سپس:

1kubectl get nodes -o wide

12. بررسی kube-proxy

در حالت استاندارد:

1kubectl -n kube-system get ds kube-proxy

انتظار:

1DESIRED = CURRENT = READY

فعلاً kube-proxy را حذف نکنید.


13. نصب Cilium CLI

بعد از نصب CLI:

1cilium version

نسخه CLI و image را بررسی کنید.


14. نصب Cilium با CLI

نسخه را Pin کنید:

1cilium install --version 1.20.0

نسخه 1.20.0 در مستندات stable فعلی Cilium برای نصب استفاده شده است. citeturn0search8turn0search5


15. نصب Cilium با Helm

اگر می‌خواهید Configuration به‌صورت Infrastructure as Code مدیریت شود:

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

سپس:

1helm install cilium cilium/cilium \
2  --version 1.20.0 \
3  --namespace kube-system

Cilium نصب رسمی با Helm را نیز مستند کرده است. citeturn0search0turn0search5

برای Production بهتر است Helm values در Git نگهداری شود.

مثلاً:

1helm show values cilium/cilium \
2  --version 1.20.0 > cilium-values-reference.yaml

16. بررسی Cilium

1kubectl -n kube-system get pods \
2  -l k8s-app=cilium -o wide

همه Agentها باید:

11/1 Running

باشند.

Operator:

1kubectl -n kube-system get pods \
2  -l name=cilium-operator

سپس:

1cilium status --wait

17. بررسی Nodeها

1kubectl get nodes -o wide

حالت مطلوب:

1control-01   Ready
2control-02   Ready
3control-03   Ready
4worker-01    Ready
5worker-02    Ready
6worker-03    Ready

18. بررسی فایل‌های CNI روی Node

روی Node:

1ls -lah /etc/cni/net.d/

و:

1ls -lah /opt/cni/bin/

این دو مسیر برای Troubleshooting بسیار مهم هستند.

اگر Pod به مرحله‌ی sandbox نمی‌رسد، حتماً این مسیرها را بررسی کنید.


19. تست پایه Pod-to-Pod

Namespace:

1kubectl create namespace cilium-lab

دو Pod:

1kubectl -n cilium-lab run nginx-01 \
2  --image=nginx:stable
3
4kubectl -n cilium-lab run nginx-02 \
5  --image=nginx:stable

بررسی:

1kubectl -n cilium-lab get pods -o wide

فرض:

1nginx-01   10.244.1.10   worker-01
2nginx-02   10.244.2.11   worker-02

از Pod اول:

1kubectl -n cilium-lab exec nginx-01 -- \
2  curl -I http://10.244.2.11

اگر HTTP response گرفتید، Pod-to-Pod networking بین دو Node سالم است.


20. تست DNS

Pod تست:

1kubectl -n cilium-lab run dns-test \
2  --image=busybox:1.36 \
3  --restart=Never \
4  -- sleep 3600

تست:

1kubectl -n cilium-lab exec dns-test -- \
2  nslookup kubernetes.default

CoreDNS:

1kubectl -n kube-system get pods \
2  -l k8s-app=kube-dns

اگر DNS خراب بود:

1kubectl -n kube-system logs \
2  -l k8s-app=kube-dns

و:

1kubectl -n cilium-lab exec dns-test -- \
2  cat /etc/resolv.conf

را بررسی کنید.


21. ساخت Deployment

فایل nginx.yaml:

 1apiVersion: apps/v1
 2kind: Deployment
 3metadata:
 4  name: nginx
 5  namespace: cilium-lab
 6
 7spec:
 8  replicas: 3
 9
10  selector:
11    matchLabels:
12      app: nginx
13
14  template:
15    metadata:
16      labels:
17        app: nginx
18
19    spec:
20      containers:
21        - name: nginx
22          image: nginx:stable
23
24          ports:
25            - containerPort: 80

Apply:

1kubectl apply -f nginx.yaml

بررسی:

1kubectl -n cilium-lab get pods -o wide

22. ساخت Service

nginx-service.yaml:

 1apiVersion: v1
 2kind: Service
 3metadata:
 4  name: nginx
 5  namespace: cilium-lab
 6
 7spec:
 8  selector:
 9    app: nginx
10
11  ports:
12    - port: 80
13      targetPort: 80

Apply:

1kubectl apply -f nginx-service.yaml

بررسی:

1kubectl -n cilium-lab get svc nginx

23. تست Service

1kubectl -n cilium-lab exec dns-test -- \
2  wget -qO- http://nginx

همچنین:

1kubectl -n cilium-lab exec dns-test -- \
2  wget -qO- http://nginx.cilium-lab.svc.cluster.local

اگر HTML nginx برگشت:

1DNS
2 +
3Service Discovery
4 +
5ClusterIP
6 +
7Load Balancing

سالم هستند.


24. بررسی Endpointها

1kubectl -n cilium-lab get endpoints nginx

یا:

1kubectl -n cilium-lab get endpointslice

باید IPهای Podهای nginx را ببینید.


25. بررسی Cilium Endpoint

1cilium endpoint list

در این خروجی اطلاعاتی مانند:

1ENDPOINT
2IDENTITY
3POLICY
4LABELS

را مشاهده می‌کنید.

این دستور یکی از ابزارهای اصلی Troubleshooting است.


26. NetworkPolicy — پروژه امنیتی

سه workload تصور کنید:

1frontend
2backend
3database

قانون مطلوب:

1frontend ─────► backend:8080
2backend  ─────► database:5432

ولی:

1frontend ──X──► database
2internet ──X──► backend
3internet ──X──► database

27. CiliumNetworkPolicy

نمونه:

 1apiVersion: cilium.io/v2
 2kind: CiliumNetworkPolicy
 3
 4metadata:
 5  name: backend-policy
 6  namespace: cilium-lab
 7
 8spec:
 9  endpointSelector:
10    matchLabels:
11      app: backend
12
13  ingress:
14    - fromEndpoints:
15        - matchLabels:
16            app: frontend
17
18      toPorts:
19        - ports:
20            - port: "8080"
21              protocol: TCP

Apply:

1kubectl apply -f backend-policy.yaml

28. تست Policy

قبل از Policy:

1frontend ─────► backend   ALLOW
2random   ─────► backend   ALLOW

بعد از Policy:

1frontend ─────► backend   ALLOW
2random   ─────► backend   DENY

اگر نتیجه متفاوت است:

1cilium endpoint list

و:

1cilium monitor

را بررسی کنید.


29. Hubble

Hubble برای Observability شبکه و Cilium بسیار مهم است.

فعال‌سازی:

1cilium hubble enable

بررسی:

1cilium status

و:

1kubectl -n kube-system get pods \
2  -l k8s-app=hubble-relay

30. مشاهده Flow

1hubble observe

محدود به namespace:

1hubble observe \
2  --namespace cilium-lab

برای TCP:

1hubble observe \
2  --protocol TCP

حالا Policy را تست کنید و Flowها را ببینید.

مثلاً:

1frontend → backend TCP/8080 FORWARDED
2random   → backend TCP/8080 DROPPED

این یکی از نقاط قوت Cilium است: می‌توانیم تصمیم datapath را مشاهده کنیم، نه اینکه فقط YAML Policy را ببینیم.


31. Cilium Monitor

1cilium monitor

برای مشاهده eventهای datapath استفاده می‌شود.

اگر Packet Drop دارید:

1Application
2   ↓
3Packet
4   ↓
5Cilium
6   ↓
7DROP

cilium monitor و Hubble را برای فهمیدن علت بررسی کنید.


32. Connectivity Test

مهم‌ترین تست اولیه:

1cilium connectivity test

اگر Fail شد، خروجی را از اولین failure دنبال کنید، نه فقط آخرین خطا.


33. Troubleshooting — Pod Pending

1kubectl -n cilium-lab describe pod <pod>

اگر خطایی مثل:

1FailedCreatePodSandBox

دیدید:

1kubectl get events -A \
2  --sort-by=.lastTimestamp

سپس روی Node:

1ls -lah /etc/cni/net.d/
2ls -lah /opt/cni/bin/
3systemctl status containerd
4journalctl -u containerd -n 100
5journalctl -u kubelet -n 100

34. Troubleshooting — Cilium CrashLoopBackOff

1kubectl -n kube-system get pods \
2  -l k8s-app=cilium -o wide

سپس:

1kubectl -n kube-system describe pod <cilium-pod>

و:

1kubectl -n kube-system logs \
2  <cilium-pod> --previous

Kernel:

1uname -a

BPF:

1mount | grep bpf
2ls -lah /sys/fs/bpf

در صورت نصب بودن:

1bpftool prog show

35. Troubleshooting — فقط یک Node خراب است

اگر:

1worker-01   Cilium OK
2worker-02   Cilium ERROR
3worker-03   Cilium OK

اول Node را مشخص کنید:

1kubectl -n kube-system get pods \
2  -l k8s-app=cilium -o wide

روی Node مشکل‌دار:

1uname -r
2ip -br addr
3ip route
4systemctl status containerd
5systemctl status kubelet
6journalctl -u kubelet -n 100
7journalctl -u containerd -n 100

سپس:

1cilium status

مشکل CNI همیشه Cilium نیست؛ ممکن است Kernel، Runtime، Routing، Interface، Firewall یا MTU مشکل داشته باشد.


36. MTU

اگر Pod-to-Pod فقط برای Packetهای کوچک کار می‌کند یا بعضی connectionها timeout می‌شوند، MTU را بررسی کنید:

1ip link

و:

1ip route

در شبکه‌هایی که encapsulation وجود دارد، header اضافی می‌تواند MTU مؤثر را کاهش دهد.

این سناریو را جدی بگیرید:

1Small Packet  → OK
2Large Packet  → TIMEOUT

37. Routing

روی Nodeها:

1ip route
2ip neigh
3ip -d link

و وضعیت Cilium:

1cilium status

را بررسی کنید.


38. BPF

بررسی:

1mount | grep bpf
1ls -lah /sys/fs/bpf

و در صورت وجود:

1bpftool prog show

هدف این است که بدانیم Cilium واقعاً در datapath چه وضعیتی دارد.


39. kube-proxy در برابر Cilium kube-proxy replacement

حالت اول:

1Cilium
2  +
3kube-proxy

حالت دوم:

1Cilium
2  +
3eBPF kube-proxy replacement

در حالت دوم Cilium بخشی از Service Load Balancing را در datapath خود انجام می‌دهد.


40. Kubernetes بدون kube-proxy

برای Cluster جدید:

1sudo kubeadm init \
2  --control-plane-endpoint "192.168.10.10:6443" \
3  --pod-network-cidr=10.244.0.0/16 \
4  --service-cidr=10.96.0.0/12 \
5  --skip-phases=addon/kube-proxy

Cilium نیز برای Kubernetes بدون kube-proxy همین مدل را مستند کرده است. citeturn0search2turn0search0

بعد Cilium:

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

و:

1helm install cilium cilium/cilium \
2  --version 1.20.0 \
3  --namespace kube-system \
4  --set kubeProxyReplacement=true \
5  --set k8sServiceHost=192.168.10.10 \
6  --set k8sServicePort=6443

در این حالت باید API Server به‌صورت مستقیم برای Cilium مشخص شود؛ مستندات Cilium نیز k8sServiceHost و k8sServicePort را برای این سناریو توضیح می‌دهد. citeturn0search2


41. هشدار kube-proxy replacement

روی Cluster فعال Production، kube-proxy را بدون برنامه حذف نکنید.

Cilium هشدار می‌دهد که حذف kube-proxy می‌تواند connectionهای موجود را قطع کند و Service traffic را تا آماده شدن replacement مختل کند. citeturn0search2

بنابراین برای Production بهتر است:

1New Cluster
2     ↓
3kubeadm --skip-phases=addon/kube-proxy
4     ↓
5Cilium
6     ↓
7kubeProxyReplacement=true

را از ابتدا طراحی کنید.


42. Production Architecture

معماری پیشنهادی:

 1                    API Load Balancer
 2                           │
 3                           ▼
 4                    Kubernetes API
 5                           │
 6              ┌────────────┼────────────┐
 7              ▼            ▼            ▼
 8           CP-01         CP-02        CP-03
 9              │            │            │
10              └────────────┼────────────┘
11                           │
12                    Kubernetes Cluster
13                           │
14          ┌────────────────┼────────────────┐
15          ▼                ▼                ▼
16       Worker-01       Worker-02        Worker-03
17          │                │                │
18       Cilium            Cilium           Cilium
19          │                │                │
20       Hubble            Hubble           Hubble
21          └────────────────┼────────────────┘
22                           ▼
23                     Observability

43. Helm Values را در Git نگه دارید

برای Production:

1git/
2└── infrastructure/
3    └── cilium/
4        ├── Chart.yaml
5        ├── values.yaml
6        └── README.md

یا حداقل:

1cilium/
2└── values-production.yaml

و نصب:

1helm upgrade --install cilium cilium/cilium \
2  --version 1.20.0 \
3  --namespace kube-system \
4  --values values-production.yaml

مزیت:

1Version Control
2+
3Review
4+
5Rollback
6+
7Reproducibility

44. Production Checklist

Node

1[ ] Kernel compatible
2[ ] containerd healthy
3[ ] kubelet healthy
4[ ] swap handled
5[ ] IP forwarding enabled
6[ ] Required modules loaded
7[ ] Correct Node IP
8[ ] MTU validated

Kubernetes

1[ ] Control Plane HA
2[ ] API Load Balancer
3[ ] etcd backup
4[ ] Pod CIDR documented
5[ ] Service CIDR documented
6[ ] Kubernetes version pinned
7[ ] Upgrade procedure

Cilium

1[ ] Cilium version pinned
2[ ] Helm values in Git
3[ ] CNI paths verified
4[ ] IPAM understood
5[ ] Routing validated
6[ ] NetworkPolicy tested
7[ ] Hubble enabled where required
8[ ] Failure test completed

Security

1[ ] Default-deny strategy
2[ ] Namespace isolation
3[ ] RBAC
4[ ] Pod Security
5[ ] NetworkPolicy
6[ ] Secrets management

Observability

1[ ] Hubble
2[ ] Prometheus
3[ ] Grafana
4[ ] Alerts
5[ ] Flow visibility
6[ ] Cilium metrics

45. پروژه نهایی سه‌لایه

در پایان Lab یک Application سه‌لایه بسازید:

 1                    Internet
 2                       │
 3                       ▼
 4                    Ingress
 5                       │
 6                       ▼
 7                  ┌──────────┐
 8                  │ Frontend │
 9                  └────┬─────┘
10                       │
11                    TCP/8080
12                       │
13                       ▼
14                  ┌──────────┐
15                  │ Backend  │
16                  └────┬─────┘
17                       │
18                    TCP/5432
19                       │
20                       ▼
21                  ┌──────────┐
22                  │Postgres  │
23                  └──────────┘

Policy:

1Internet ───► Frontend       ALLOW
2Frontend ───► Backend:8080   ALLOW
3Backend ────► Postgres:5432  ALLOW
4
5Internet ───X──► Backend
6Internet ───X──► Postgres
7Frontend ───X──► Postgres

سپس با Hubble بررسی کنید که Flowها دقیقاً مطابق این Graph هستند.


46. Failure Testing

Pod Failure

1kubectl -n cilium-lab delete pod <pod>

انتظار:

1Pod deleted
2   ↓
3ReplicaSet
4   ↓
5New Pod
6   ↓
7Traffic restored

Cilium Agent Restart

در Lab:

1kubectl -n kube-system delete pod \
2  -l k8s-app=cilium

سپس:

1watch kubectl -n kube-system get pods \
2  -l k8s-app=cilium

هدف: مشاهده Recovery Agentها.


Node Failure

در Lab یک Worker را موقتاً از دسترس خارج کنید و:

1kubectl get nodes
2kubectl get pods -A -o wide

را بررسی کنید.

سؤال مهم:

آیا Workloadها به Node دیگر منتقل می‌شوند؟


NetworkPolicy Failure

Policy را تغییر دهید و همزمان:

1hubble observe \
2  --namespace cilium-lab

را اجرا کنید.

باید تفاوت بین:

1FORWARDED

و:

1DROPPED

را مشاهده کنید.


47. Decision Tree برای Troubleshooting

اگر:

1Pod → Pod = FAILED

از این ترتیب بروید:

 1Pod Running؟
 2  │
 3  ├── NO → kubelet / image / runtime
 4  │
 5  ▼
 6Pod IP دارد؟
 7  │
 8  ├── NO → Cilium / IPAM
 9  │
10  ▼
11Cilium Running؟
12  │
13  ├── NO → logs / kernel / runtime
14  │
15  ▼
16CNI config وجود دارد؟
17  │
18  ├── NO → /etc/cni/net.d
19  │
20  ▼
21Node Routing سالم؟
22  │
23  ├── NO → ip route / interface
24  │
25  ▼
26NetworkPolicy؟
27  │
28  ├── YES → Hubble / cilium monitor
29  │
30  ▼
31MTU؟
32  │
33  ├── SUSPECT → ip link / packet size
34  │
35  ▼
36BPF / Datapath

48. Cheat Sheet

Kubernetes

1kubectl get nodes -o wide
2
3kubectl get pods -A -o wide
4
5kubectl get events -A \
6  --sort-by=.lastTimestamp

Cilium

1cilium status
2
3cilium connectivity test
4
5cilium endpoint list
6
7cilium config view
8
9cilium monitor

Hubble

1hubble observe
2
3hubble observe \
4  --namespace cilium-lab
5
6hubble observe \
7  --protocol TCP

Node

 1uname -r
 2
 3ip -br addr
 4
 5ip route
 6
 7ip neigh
 8
 9ip link
10
11mount | grep bpf
12
13ls -lah /sys/fs/bpf

Runtime

1systemctl status containerd
2
3journalctl -u containerd -n 100
4
5journalctl -u kubelet -n 100

49. چیزی که باید از این پروژه یاد بگیریم

هدف پروژه صرفاً این نیست:

1cilium install

هدف این است که مسیر کامل را بفهمیم:

 1Kubernetes
 2    ↓
 3CNI
 4    ↓
 5Cilium
 6    ↓
 7IPAM
 8    ↓
 9Endpoint
10    ↓
11eBPF
12    ↓
13Routing
14    ↓
15Service Load Balancing
16    ↓
17NetworkPolicy
18    ↓
19Hubble
20    ↓
21Troubleshooting

و بتوانیم برای یک خطای واقعی مثل:

1Pod A → Service B → TIMEOUT

به‌صورت سیستماتیک بررسی کنیم:

 1Application
 2   ↓
 3DNS
 4   ↓
 5Service
 6   ↓
 7EndpointSlice
 8   ↓
 9Cilium Endpoint
10   ↓
11NetworkPolicy
12   ↓
13Hubble Flow
14   ↓
15Routing
16   ↓
17MTU
18   ↓
19eBPF Datapath
20   ↓
21Linux Kernel

این نقطه‌ای است که دانش Kubernetes از اجرای چند دستور kubectl عبور می‌کند و وارد Platform Engineering می‌شود.


جمع‌بندی

در این پروژه از:

1Linux
2  ↓
3containerd
4  ↓
5kubeadm
6  ↓
7Kubernetes

به:

 1Kubernetes
 2  ↓
 3Cilium CNI
 4  ↓
 5eBPF
 6  ↓
 7Pod Networking
 8  ↓
 9Service Networking
10  ↓
11NetworkPolicy
12  ↓
13Hubble

رسیدیم.

بعد حالت پیشرفته:

1Kubernetes
2  ↓
3Cilium
4  ↓
5eBPF kube-proxy replacement

را بررسی کردیم.

Cilium زمانی در Production ارزش واقعی خود را نشان می‌دهد که تیم بتواند:

  1. IPAM را طراحی کند.
  2. Routing را بفهمد.
  3. MTU را مدیریت کند.
  4. NetworkPolicy را درست طراحی کند.
  5. Flowها را observe کند.
  6. Failure را شبیه‌سازی کند.
  7. Cilium را Upgrade و Rollback کند.
  8. Datapath را Troubleshoot کند.
  9. Kernel و eBPF را درک کند.
  10. Configuration را با GitOps مدیریت کند.

نصب Cilium پایان کار نیست؛ فهمیدن datapath و توانایی Troubleshooting آن، اصل ماجراست.


منابع رسمی

  • Cilium — Installation using kubeadm citeturn0search0
  • Cilium — Quick Installation citeturn0search8
  • Cilium — Kubernetes Without kube-proxy citeturn0search2
  • Cilium — Helm Installation citeturn0search5
  • Kubernetes — Creating a Cluster with kubeadm citeturn0search3
  • Kubernetes — Network Plugins / CNI citeturn0search7

گیتنامی — From Infrastructure to Production AI Engineering