Cách mình troubleshoot network trong Kubernetes bằng một Pod đa năng

cd9ebb05-4bbe-4754-b578-e985630b61ec

Troubleshoot network trong quá trình dùng Kubernetes chắc anh em nào cũng từng gặp qua. Và lỗi đầu tiên thường nghĩ tới khi có sự cố liên quan đến giao tiếp giữa các ứng dụng hay luồng dữ liệu là vấn đề kết nối: Firewall đã mở đúng port, đúng IP chưa? Server target có thông không? Gateway đầu kia xử lý ra sao?… đủ thứ trên đời.

Cách dễ và hiệu quả nhất mà mình vẫn hay dùng là tạo một Pod trong cùng namespace với ứng dụng, rồi từ Pod đó chạy các lệnh như telnet, curl, traceroute, nmap, dig, v.v… để test kết nối đến các dịch vụ khác. Làm vậy là biết ngay từ ứng dụng của mình đi ra đã thông chưa, và nếu nghẽn thì nghẽn ở đâu.

Trong bài này, mình sẽ chia sẻ luôn image mình đang dùng thực tế và một chút exp cá nhân kèm theo file YAML sẵn để anh em nào cần là triển luôn khỏi nghĩ.

Vấn đề đặt ra: Dùng image nào cho Pod kiểm tra kết nối?

Câu hỏi quan trọng là: image của Pod kiểm tra nên là gì để vừa đủ tool, vừa nhẹ, không tốn RAM/CPU, lại dễ dùng?

Dưới đây là một số image mình đã thử và thường dùng tùy từng mục đích:

Image Ưu điểm Nhược điểm
praqma/network-multitool Có đủ curl, telnet, iperf3, web UI nhỏ Cập nhật chậm, không có tool bắt gói
wbitt/network-multitool Nhẹ, nhanh, có cả nmap, dig, nc, curl Không có tcpdump, debug sâu hơi hạn chế
nicolaka/netshoot Cực mạnh, đủ từ tcpdump, iptables, dig, traceroute, ethtool Nặng hơn (~150MB+), thiên về sysadmin

YAML mẫu mình hay dùng

Tùy mục đích mà mình chọn image khác nhau. Đây là YAML mẫu mình đang dùng cho từng loại:

wbitt/network-multitool – Gọn nhẹ, đủ xài

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wbitt-network-tools
    namespace: my-project
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wbitt-network-tools
  template:
    metadata:
      labels:
        app: wbitt-network-tools
    spec:
      containers:
      - name: multitool
        image: wbitt/network-multitool
        ports:
        - containerPort: 80
        tty: true
        stdin: true

praqma/network-multitool – Vừa đủ, thêm chức năng

apiVersion: apps/v1
kind: Deployment
metadata:
  name: network-tools
  labels:
    app: network-tools
spec:
  replicas: 1
  selector:
    matchLabels:
      app: network-tools
  template:
    metadata:
      labels:
        app: network-tools
    spec:
      containers:
      - name: multitool
        image: praqma/network-multitool
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        - containerPort: 5201  # iperf3
        - containerPort: 8080  # web ui (nếu dùng)
        tty: true
        stdin: true
      restartPolicy: Always

nicolaka/netshoot – Dành cho những ca khó

apiVersion: apps/v1
kind: Deployment
metadata:
  name: netshoot-tools
    namespace: my-project
spec:
  replicas: 1
  selector:
    matchLabels:
      app: netshoot-tools
  template:
    metadata:
      labels:
        app: netshoot-tools
    spec:
      containers:
      - name: netshoot
        image: nicolaka/netshoot
        command: ["/bin/bash", "-c", "--"]
        args: ["while true; do sleep 30; done;"]
        tty: true
        stdin: true

Cách dùng

Sau khi apply YAML:

kubectl exec -it <pod-name> -- /bin/sh

Vào trong là bạn tha hồ:

  • curl http://service-name:port
  • telnet service-name port
  • dig, nslookup
  • traceroute, iperf3, nmap, tcpdump (tuỳ image)
  • Check DNS, route, NAT, network policy…

Bảng so sánh chi tiết các image

Tiêu chí praqma/network-multitool wbitt/network-multitool nicolaka/netshoot
Dung lượng image Trung bình (~50-60MB) Nhẹ (~25-30MB) Nặng (~150MB+)
Base OS Debian Alpine Alpine
curl, wget, ping
telnet, nmap
iperf3
dig, nslookup
tcpdump, iftop
iptables, ip route
ethtool, ss, ip
Có HTTP server test sẵn ✅ (tiny web server port 80) ✅ (tiny web server port 80)
Tối ưu cho beginner ⚠️ (phù hợp sysadmin/devops có kinh nghiệm)
Tối ưu debug network sâu
Tần suất cập nhật Thấp Thấp Cao, duy trì thường xuyên
Dễ sử dụng trong CI/CD ⚠️ (cần hiểu rõ công cụ trong image)

Kinh nghiệm nhỏ

  • Muốn test đơn giản, nhẹ, tiện –> wbitt/network-multitool
  • Muốn kết hợp web server + test TCP –> praqma/network-multitool
  • Muốn debug cấp sysadmin: iptables, tcpdump,… –> nicolaka/netshoot
  • Nếu dùng NetworkPolicy, hãy chắc chắn pod kiểm tra nằm trong namespace và label phù hợp để không bị block
  • Khi test dịch vụ ngoài cluster (VD: Redis hosted ngoài), nhớ mount thêm CA hoặc config DNS cho đúng nếu có TLS

Lời kết

Dùng một Pod nhỏ kiểu “quân sư đi debug” như thế này giúp mình tiết kiệm rất nhiều thời gian khi debug những lỗi mà nhìn qua tưởng như là bug ứng dụng, hóa ra lại là bug… firewall hoặc DNS. Hy vọng bài này giúp anh em có thêm công cụ đơn giản mà hiệu quả để chiến với Kubernetes hằng ngày.

Chia sẻ bài viết:
Theo dõi
Thông báo của
1 Bình luận
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Có thể bạn quan tâm