Tổng kết module & track Networking
Recap K8s networking + cả track foundations→web→containers. Cheat sheet pod/CNI/Service, glossary, 5 self-assessment, học tiếp mesh/eBPF.
TL;DR: Module 3 scale plumbing M1–M2 lên cluster: pod = netns + IP phẳng → CNI (interface gắn veth/bridge/route) → Service + kube-proxy (VIP + DNAT/IPVS) → Ingress/NodePort/LB (cửa L4/L7) → NetworkPolicy (filter theo identity, chỉ khi CNI enforce). Kubernetes không invent TCP stack mới. Bookmark trang này: map K8s ↔ Linux/Docker, cheat sheet lệnh, glossary, self-assessment 5 outcome, nhìn lại cả track foundations → web → containers, và gợi ý học tiếp (service mesh, eBPF — ngoài scope course này).
Đã đi qua những gì
Bạn bắt đầu từ contract pod: mỗi pod một IP cluster-wide; model pod-to-pod không NAT; container trong pod share một netns (localhost, cùng port space); pause/infra giữ netns. Dưới hood: cùng veth + bridge/route Module 1–2 — chỉ đơn vị deploy đổi từ “một container” sang “một pod”.
Tiếp theo CNI: kubelet gọi binary theo spec interface — Flannel / Calico / Cilium là implementation, không phải “mạng K8s”. Trade-off overlay (encapsulation, dễ multi-subnet) vs routed (route/BGP thuần, latency/ops khác). Plugin không implement NetworkPolicy ⇒ YAML policy im lặng.
Rồi Service: ClusterIP là VIP (không process listen); Endpoints/EndpointSlice là sổ backend; kube-proxy rewrite (iptables DNAT hoặc IPVS) tới pod IP:port — đúng họ DNAT Module 2, quy mô nhiều backend. Expose: ClusterIP nội bộ; NodePort/LoadBalancer L4 ra ngoài; Ingress (cần controller) route L7 host/path + TLS.
Cuối NetworkPolicy: default allow nếu chưa có policy chạm pod; isolation khi có; selector pod/namespace/ipBlock; rule additive (union); default-deny hay quên DNS egress. Pitfall cứng: policy không enforce nếu CNI không hỗ trợ — full-mesh dù YAML xanh.
Bản đồ module (khái niệm):
flowchart LR
P["1. Pod network<br/>flat IP + shared netns"] --> C["2. CNI<br/>plugin interface"]
C --> S["3. Service<br/>kube-proxy DNAT/IPVS"]
S --> I["4. Ingress / L4 entry<br/>host path TLS"]
I --> N["5. NetworkPolicy<br/>identity filter"]🗺️ Bản đồ cả track Networking
Ba course tuần tự — mỗi tầng giả định tầng dưới đã thấm:
flowchart TB
F["Tier 1 — Foundations<br/>packet, IP, route, port, DNS"]
W["Tier 2 — Web<br/>TCP/UDP, HTTP, TLS, cong cu"]
C["Tier 3 — Containers<br/>stack, netns, NAT, K8s"]
F --> W --> C| Course | Bạn mang đi được gì | Link |
|---|---|---|
| Networking Foundations | Packet đi từ máy bạn tới server: model TCP/IP, địa chỉ & định tuyến, port/socket, DNS. | Bắt đầu track |
| Networking Web | TCP vs UDP, HTTP/web, TLS + chứng chỉ, bộ công cụ debug (dig/curl/ss/tcpdump). | Tiếp theo |
| Networking Containers (course này) | Plumbing Linux → Docker-style bridge + SNAT/DNAT → nhập môn K8s (pod/CNI/Service/Ingress/NetworkPolicy). | Capstone track |
Cheat sheet dọc track (một dòng mỗi chặng)
| Chặng | Ý chính |
|---|---|
| Packet / stack | NIC → softirq → sk_buff → netfilter → socket |
| IP + route | L3 tới host; bảng route quyết định next hop |
| Port / socket | Process listen; ss soi local |
| DNS | Tên → IP trước khi TCP |
| TCP / HTTP / TLS | Byte stream, request/response, kênh mã hoá |
| netns + veth + bridge | Isolation + cáp + LAN ảo (docker0) |
| SNAT / DNAT | Egress MASQUERADE; publish port PREROUTING |
| Pod + CNI | netns scale + plugin gắn mạng |
| Service + Ingress | VIP + DNAT/IPVS; cửa L4/L7 |
| NetworkPolicy | Filter identity — cần CNI enforce |
🗺️ Cheat sheet Module 3
Map K8s → plumbing Linux / Docker
| Khái niệm K8s | Map M1–M2 | Nhìn nhanh |
|---|---|---|
| Pod | Network namespace (+ multi-container share) | kubectl exec → ip addr / ss trong pod |
| Pod IP | IP trên eth trong netns pod | kubectl get pod -o wide |
| Pause / infra | Process giữ netns sống | Xoá pod = teardown netns + iface |
| CNI plugin | Script veth + bridge/route/overlay thay Docker daemon | Binary + conf trong /etc/cni/net.d (tuỳ distro) |
| Service ClusterIP | VIP — không listen process | kubectl get svc — dải service CIDR |
| kube-proxy (iptables) | DNAT / probability load-balance (họ Module 2) | Survey iptables -t nat -L -n (node) |
| kube-proxy (IPVS) | Virtual server L4 trong kernel | ipvsadm -Ln (khi mode IPVS) |
| Endpoints / EndpointSlice | Sổ pod IP:port backend | kubectl get endpoints / endpointslice |
| NodePort | DNAT host:nodePort → pod | Mở L4 trên mọi node |
| LoadBalancer | Cloud/provider VIP → NodePort/backend | L4 ngoài cluster |
| Ingress + controller | Proxy L7 (host/path) + TLS | YAML Ingress không thay controller |
| NetworkPolicy | filter theo label (dataplane CNI) | Không enforce nếu plugin không support |
Lệnh survey (cluster demo)
| Việc | Lệnh |
|---|---|
| Pod IP + node | kubectl get pods -o wide |
| Service + ClusterIP | kubectl get svc / kubectl describe svc NAME |
| Backend thật | kubectl get endpoints NAME / kubectl get endpointslice |
| Vào netns “view” pod | kubectl exec -it POD -- ip -br a / ss -lntp |
| Events / selector | `kubectl describe pod |
| NetworkPolicy list | kubectl get networkpolicy -A |
| CNI conf trên node (lab) | ls /etc/cni/net.d (SSH/node shell; tuỳ kind/k3s path) |
Bốn kiểu expose — chọn theo chiều traffic
| Kiểu | Tầng | Ai thấy | Khi nào |
|---|---|---|---|
| ClusterIP | L4 VIP nội bộ | Trong cluster | Service-to-service |
| NodePort | L4 host port | Ngoài qua nodeIP:nodePort | Lab / on-prem đơn giản |
| LoadBalancer | L4 VIP ngoài | Internet/VPC qua provider | Cloud production L4 |
| Ingress | L7 host/path (+ TLS) | HTTP(S) đa service một IP | API/web nhiều host/path |
NetworkPolicy — checklist 30 giây
- Có policy chạm pod subject chưa? (chưa → default allow.)
- CNI/plugin có enforce NetworkPolicy không?
- Cả hai phía (ingress subject + egress peer) có rule cho phép không?
- Default-deny egress: đã cho DNS (port 53) chưa?
- Selector label khớp thật (
kubectl get pod --show-labels)?
📖 Glossary module & track (rút gọn)
| Thuật ngữ | Định nghĩa 1 câu |
|---|---|
| Pod network model | Mọi pod IP thấy nhau (trong model); không NAT pod-to-pod trừ segmentation có chủ đích. |
| Shared netns | Mọi container trong pod dùng chung IP, port space, localhost. |
| Pause / infra container | Container “ngủ” giữ network namespace khi app container join cùng ns. |
| CNI | Container Network Interface — spec gọi plugin gắn/tháo mạng pod; không phải một hãng. |
| Overlay | Gói pod bọc thêm (vd VXLAN) để đi trên underlay — trade-off ops vs encapsulation. |
| Routed / BGP CNI | Pod IP được route thuần (không bọc) — latency/ops khác overlay. |
| ClusterIP | VIP Service nội cluster; không process listen. |
| kube-proxy | Agent node rewrite/load-balance traffic tới Service → pod (iptables hoặc IPVS). |
| EndpointSlice | API object (thay/kèm Endpoints) liệt kê backend pod sẵn sàng. |
| NodePort | Mở port trên mỗi node, forward vào Service/pod. |
| LoadBalancer | Service type + VIP provider (cloud/metalLB…) trước cluster. |
| Ingress | API L7 (host/path); cần Ingress controller triển khai thật. |
| NetworkPolicy | Policy filter traffic pod theo label/namespace/CIDR — dataplane do CNI. |
| Default deny | Policy cô lập: không match rule ⇒ drop (sau khi isolation bật). |
| netns / veth / bridge | Plumbing M1–M2: isolation, cáp ảo, switch L2 — nền pod + Docker bridge. |
| SNAT / DNAT / MASQUERADE | Rewrite source/dest trên netfilter — egress container & publish port; họ hàng Service. |
⚠️ Pitfall tổng hợp (M3 + nối track)
- "ClusterIP timeout từ laptop = Service hỏng." VIP thường chỉ trong cluster — curl từ ngoài không chứng minh pod chết.
- "Pod IP = Service IP." Pod IP ephemeral + eth thật; ClusterIP là VIP rewrite.
- "Cài Calico/Cilium = hiểu CNI." Học interface trước brand; đổi plugin không đổi contract pod model.
- "Ingress YAML apply xong là có HTTPS." Không controller / sai class ⇒ object nằm im; TLS còn Secret + terminate đúng hop.
- "NetworkPolicy default deny mọi thứ an toàn ngay." Quên DNS egress = app “mất mạng” theo cách khó đọc; và không có enforce = YAML trang trí.
- "Timeout app K8s = restart pod." Map lại: DNS (tier 1–2) → TCP/TLS → netns/veth/CNI → Service endpoints/kube-proxy → policy — cùng mindset chặng đã học cả track.
- "kind = production CNI." kind đủ minh hoạ pod IP/Service; NetworkPolicy có thể không enforce — đó là bài học pitfall, không phải “K8s sai”.
✅ Self-assessment
Bạn đã đạt module này nếu trả lời được:
- Explain mô hình pod networking (flat IP, shared netns, pause container) và liên hệ veth/bridge
- Nếu chưa: đọc lại 01 — Pod networking cơ bản; map pod ↔ netns, pause, veth/bridge/route.
- Explain CNI là interface (không implementation) và trade-off overlay vs routed
- Nếu chưa: 02 — CNI là gì; spec vs Flannel/Calico/Cilium; bảng overlay vs routed; policy phụ thuộc plugin.
- Trace traffic tới pod qua Service và kube-proxy (iptables/IPVS)
- Nếu chưa: 03 — Service & kube-proxy; VIP → EndpointSlice → DNAT/IPVS → pod IP:port.
- Compare ClusterIP, NodePort, LoadBalancer và Ingress theo chiều traffic L4/L7
- Nếu chưa: 04 — Ingress & load balancing; bảng expose + pitfall Ingress không controller.
- Design NetworkPolicy ingress/egress cơ bản và nhận biết khi policy không có hiệu lực
- Nếu chưa: 05 — NetworkPolicy; isolation, both-sides allow, default-deny + DNS, CNI không enforce.
Nhìn lại course — ba module containers
| Module | Plumbing bạn đã “sờ” |
|---|---|
| M1 — Linux Network Internals | Stack, veth/tun/tap, bridge, iptables/netfilter |
| M2 — Container Networking | netns, bridge from scratch, SNAT, DNAT, nsenter/tcpdump |
| M3 — Kubernetes Networking | Pod, CNI, Service/kube-proxy, Ingress, NetworkPolicy |
Nếu self-assessment còn trống: quay đúng bài concept (không nhảy YAML production). Capstone chỉ chắc khi M1–M2 đã thấm tay.
Học tiếp (ngoài scope v1)
Course dừng ở bản đồ nhập môn K8s networking. Các chủ đề sau không nằm trong scope v1 — học khi đã debug được pod/Service/policy bằng plumbing Linux:
| Hướng | Vì sao để sau | Gợi ý tiếp cận |
|---|---|---|
| Service mesh (Istio, Linkerd, Cilium service mesh…) | Thêm data plane sidecar/ztunnel, mTLS, traffic policy L7 chồng lên Service/CNI — dễ nhầm “mesh = thay CNI”. | Nắm Service + NetworkPolicy trước; rồi lab mesh trên cluster demo, trace thêm hop proxy. |
| eBPF dataplane (Cilium eBPF, kube-proxy replacement…) | Bypass/cạnh iptables, observability sâu, map kernel — ops và failure mode khác rule netfilter cổ điển. | Giữ mental model “rewrite + filter trên path”; học eBPF như implementation mới của cùng ý. |
| Multi-cluster / Gateway API | Mở rộng Ingress/L7 và east-west đa cluster — API và topology phức tạp hơn v1. | Đọc Gateway API sau khi Ingress + controller đã rõ. |
| Network observability | Hubble, flow log, packet path multi-hop mesh. | tcpdump/Hubble chỉ mạnh khi đã biết điểm capture (M2 debug). |
Trong scope: đọc và debug pod IP, CNI cơ bản, Service/kube-proxy, expose L4/L7, NetworkPolicy “có/không enforce”.
Ngoài scope: vận hành mesh production, viết eBPF, multi-CNI HA, platform networking cloud chi tiết. Đừng coi thiếu mesh/eBPF là “course dở” — đó là tầng sau khi nền tảng đã chắc.
Track Networking — bạn đã đi hết ba course. Giữ trang này + recap M1/M2 làm cheat sheet khi on-call: mọi “mạng K8s hỏng” cuối cùng vẫn là packet, namespace, rule, và process listen.
Bài này đáng gửi cho bạn học cùng?
Copy link đã gắn nguồn — dán group, chat, hoặc LinkedIn.
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên