
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 |
Có curl , wget , ping |
✅ | ✅ | ✅ |
Có telnet , nmap |
✅ | ✅ | ✅ |
Có iperf3 |
✅ | ✅ | ✅ |
Có dig , nslookup |
✅ | ✅ | ✅ |
Có tcpdump , iftop |
❌ | ❌ | ✅ |
Có iptables , ip route |
❌ | ❌ | ✅ |
Có 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.