Kubernetes Troubleshooting 2024: Phá băng 5 sự cố kinh điển

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)
  • 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

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

  1. 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?
  2. 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:

  1. Kiểm tra PVC/PV binding:
    kubectl get pvc -n <namespace>
    kubectl describe pvc <pvc_name>  # Tìm event "FailedBinding"
  2. 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:
    1. Luôn bắt đầu từ kubectl describekubectl logs
    2. Reproduce lỗi với ephemeral debug container (netshoot, busybox)
    3. Giám sát metrics etcd, API Server, Kubelet từ đầu
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Đượ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