Giới thiệu: Kubernetes – “Gã khổng lồ” phức tạp cần bí kíp debug
Kubernetes chiếm 78% thị phần container orchestration (theo CNCF), nhưng 67% DevOps engineer thừa nhận gặp khó khăn khi troubleshoot. Bài viết này tập trung giải quyết 5 sự cố kinh điển mà mọi cluster đều gặp phải, kèm workflow debug từng bước và command thực chiến.
Phần 1: Pod CrashLoopBackOff – Khi container “tự sát” liên tục
1.1 Phân tích nguyên nhân qua 3 lớp
-
Lỗi ứng dụng:
kubectl logs <pod_name> --previous # Check log phiên bản trước kubectl describe pod <pod_name> | grep "Exit Code" # Tìm exit code
- Exit Code 137: OOMKilled (thiếu memory) → Tăng
resources.limits.memory
- Exit Code 1: Lỗi runtime (file config sai, missing dependency)
- Exit Code 137: OOMKilled (thiếu memory) → Tăng
-
Lỗi Probe Config:
livenessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 5 # Nếu ứng dụng khởi động chậm, tăng giá trị này
- Sử dụng
kubectl get events --field-selector involvedObject.name=<pod_name>
để xem event cảnh báo probe fail
- Sử dụng
1.2 Case Study thực tế:
- Ứng dụng Java bị CrashLoopBackOff do thiếu
JAVA_OPTS: "-XX:+UseContainerSupport"
→ Container không nhận đúng memory limit
Phần 2: Node Not Ready – Khi worker node “đơ” không rõ nguyên do
2.1 Diagnostic Flow từ A-Z
-
Kiểm tra trạng thái node:
kubectl get nodes -o wide kubectl describe node <node_name> # Tìm section "Conditions"
- DiskPressure/MemoryPressure: Xóa pod không cần thiết hoặc scale down deployment
- NetworkUnavailable: Kiểm tra CNI plugin (Calico/Flannel) có running?
-
SSH vào node lỗi và audit systemd service:
journalctl -u kubelet --since "10 minutes ago" | grep -i error systemctl status containerd # Kiểm tra container runtime
2.2 Bài học đắt giá:
- Node Not Ready xảy ra khi tham số
--node-ip
trong Kubelet config sai → Fix bằng cách cập nhật đúng IP vào/var/lib/kubelet/kubeadm-flags.env
Phần 3: NetworkPolicy chặn traffic – Lỗi “mạng” khó nhằn
3.1 Bộ công cụ chuẩn đoán network:
- Kiểm tra connectivity giữa các pod:
kubectl run -it --rm debug-pod --image=nicolaka/netshoot -- ping <target_pod_ip>
- Trace iptables rules trên node:
iptables-save | grep <namespace> # Tìm rule liên quan đến NetworkPolicy
3.2 Ví dụ thực tế:
- NetworkPolicy block egress traffic đến Redis do sai label selector:
egress: - to: - podSelector: matchLabels: app: redis # Sai label so với thực tế (app: redis-db)
Phần 4: PVC Pending – Storage không mount được
4.1 Debug CSI Driver issues:
- Kiểm tra PVC/PV binding:
kubectl get pvc -n <namespace> kubectl describe pvc <pvc_name> # Tìm event "FailedBinding"
- Kiểm tra storage class:
kubectl get storageclass # Xem volumeBindingMode: Immediate/WaitForFirstConsumer
4.2 Lỗi thường gặp trên AWS EKS:
- Worker node không có IAM role permission để gọi AWS EBS API → Attach policy
AmazonEBSCSIDriverPolicy
vào node role
Phần 5: Kube-API Server Overload – Cluster “sập” tập thể
5.1 Tối ưu API Server Performance
-
Giảm tải LIST request:
kubectl get --raw /metrics | grep apiserver_request_total # Tìm endpoint bị query quá nhiều
→ Sử dụng HorizontalPodAutoscaler với custom metrics thay vì query API liên tục
-
Tuning etcd:
etcdctl check perf # Kiểm tra latency etcdctl defrag # Chống phân mảnh database
5.2 Case Study điển hình:
- Prometheus scrape metrics từ 1000+ pod gây DDoS API Server → Chuyển sang dùng Prometheus Operator với ServiceMonitor và thêm label filter
Kết luận: Troubleshooting Kubernetes – Nghệ thuật phân tích hệ thống phân tán
- Golden Rules:
- Luôn bắt đầu từ
kubectl describe
vàkubectl logs
- Reproduce lỗi với ephemeral debug container (netshoot, busybox)
- Giám sát metrics etcd, API Server, Kubelet từ đầu
- Luôn bắt đầu từ