Capturing Network Packets in Kubernetes

Bài tóm tắt Mercari 2025 3. Quy mô lớn Độ khó: Trung bình

Mercari · 2025 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Mercari chạy vài trăm microservice; đội Network (thuộc Platform) thường được nhờ điều tra sự cố mạng. Theo họ, khi không còn manh mối thì bắt gói tin là cách cuối, nhưng quy trình phải định sẵn, không thì vô dụng đúng lúc sự cố gấp.
  • Khó trên Kubernetes: developer không có quyền vào node (lý do bảo mật), pod cách ly multi-tenant; service mesh Istio mã hoá mTLS nên bắt ở card mạng chỉ thấy dữ liệu đã mã hoá. Và đội Platform muốn developer tự làm được mà không cần quyền đặc biệt của Platform.

Thay đổi chính

  • Mức pod (cách chính), dùng Ephemeral Container (GA từ Kubernetes 1.25): gắn container debug tạm vào network namespace của pod đang chạy, không cần cài tcpdump vào image ứng dụng, không cần quyền node.
    1. Xin quyền tạm qua công cụ nội bộ Carrier (mô hình Zero Touch Production: bình thường không ai có quyền thao tác production); Role đã định sẵn quyền với pods/ephemeralcontainers.
    2. kubectl debug với image netshoot, chạy root (file securityContext riêng).
    3. tcpdump -i any: với Istio, lưu lượng đi qua cả interface ảo do iptables chuyển hướng; chỉ bắt eth0 thì chỉ thấy bản mã hoá. Lọc bớt bằng tham số để dễ phân tích, nhưng lọc quá thì có thể thiếu dữ liệu.
    4. kubectl cp lấy file về; quen rồi thì gộp bước 2–4 thành một lệnh có giới hạn thời gian.
  • Mức node (dự phòng): SSH vào node GKE (quyền cao, xin qua Carrier), vào CoreOS Toolbox, bắt theo IP của pod. Dùng cho vấn đề toàn node (CNI, iptables), nhưng chỉ thấy lưu lượng đã mã hoá. Họ chưa phải dùng trong điều tra thật nhưng đã có sẵn quy trình.

Vì sao

Bài học cho SWE

  • Viết và thử quy trình chẩn đoán trước khi cần nó.
  • Với service mesh mã hoá, bắt gói ở phía pod (sau khi giải mã) mới thấy nội dung.
  • Kết hợp quyền tạm thời (just-in-time) với Role định sẵn cho từng thao tác chẩn đoán.

Liên quan