Vấn đề
Công cụ phổ biến nhất để truy cập các dịch vụ nội bộ của Kubernetes là kubectl port-forward. Nó đơn giản và hiệu quả. Tuy nhiên, nếu Pod mục tiêu chưa khởi động hoàn toàn, lệnh này sẽ thất bại ngay lập tức với một lỗi gây khó chịu:
error: unable to forward port because pod is not running. Current status=Pending
Nguyên nhân gốc rễ rất đơn giản. kubectl cần một container đang hoạt động để thiết lập đường truyền mạng (network tunnel). Nếu Pod của bạn bị kẹt ở trạng thái Pending, container thậm chí còn chưa tồn tại trên node, khiến lệnh không có nơi nào để kết nối.
Tóm tắt: Cách khắc phục nhanh
- Kiểm tra trạng thái Pod:
kubectl get pods - Điều tra nguyên nhân:
kubectl describe pod <pod-name> - Kéo xuống phần Events ở dưới cùng.
- Khắc phục vấn đề về tài nguyên hoặc image và chờ trạng thái chuyển sang
Running.
Các bước gỡ lỗi chi tiết
1. Xác minh trạng thái Pod
Bắt đầu bằng việc xác định Pod nào đang gây cản trở. Chạy lệnh sau:
kubectl get pods
Bạn có thể sẽ thấy kết quả tương tự như sau:
NAME READY STATUS RESTARTS AGE
web-api-7444d589-abcde 0/1 Pending 0 4m
Chừng nào trạng thái còn là Pending, ContainerCreating, hoặc ImagePullBackOff, đường truyền port-forward không thể thiết lập. Bạn cần thấy trạng thái 1/1 READY.
2. Kiểm tra các sự kiện (Events) của Pod
Trạng thái Pending chỉ là triệu chứng. Để tìm điểm nghẽn thực sự, hãy mô tả (describe) Pod để xem nhật ký nội bộ của nó:
kubectl describe pod web-api-7444d589-abcde
Phần Events là phần quan trọng nhất của kết quả này. Đây là nơi bộ lập lịch (scheduler) của Kubernetes giải thích lý do tại sao nó thất bại. Hãy tìm các dấu hiệu cảnh báo phổ biến sau:
FailedScheduling: Cluster thiếu node có đủ CPU hoặc RAM trống.ErrImagePull: Tên image bị viết sai hoặc registry yêu cầu secret để đăng nhập.NetworkPlugin cni config not initialized: Lớp mạng của node bị lỗi.
3. Các cách khắc phục phổ biến cho trạng thái Pending
Tình huống A: Thiếu tài nguyên
Nếu nhật ký sự kiện báo 0/3 nodes are available: 3 Insufficient cpu, cluster của bạn đã hết công suất. Ví dụ, nếu Pod yêu cầu 500m (0.5 CPU) nhưng các node chỉ còn trống 200m, Pod sẽ nằm ở trạng thái Pending mãi mãi. Để khắc phục, bạn có thể:
- Giảm
resources.requeststrong file YAML của Deployment. - Mở rộng cluster bằng cách thêm nhiều node hơn.
- Dọn dẹp các Pod không sử dụng để thu hồi tài nguyên.
Tình huống B: Vấn đề về Image
Khi bạn thấy lỗi ImagePullBackOff, hãy kiểm tra đường dẫn image ngay lập tức. Nếu bạn đang sử dụng registry riêng tư như Docker Hub hoặc AWS ECR, hãy xác minh rằng imagePullSecrets đã được định nghĩa trong cấu hình Pod. Một lỗi đánh máy nhỏ trong tag của image (ví dụ: v1.2.0 thay vì v1.2.1) cũng sẽ làm dừng quá trình triển khai.
Tình huống C: Giới hạn mạng của Node
Các Pod thường ở trạng thái Pending vì node đã hết địa chỉ IP khả dụng. Điều này thường xảy ra trong các môi trường đám mây như AWS EKS khi sử dụng subnet nhỏ. Ví dụ, một subnet /28 chỉ cung cấp 16 địa chỉ IP. Nếu hết IP, bộ lập lịch không thể gán IP cho Pod mới. Tôi thường sử dụng Công cụ tính toán Subnet IP để đảm bảo các dải CIDR đủ lớn cho quy mô dự kiến.
Chờ đợi và Xác minh
Sau khi giải quyết nguyên nhân gốc rễ, hãy theo dõi Pod cho đến khi nó chuyển sang trạng thái Running:
kubectl get pods -w
Khi trạng thái đạt đến Running và cột READY hiển thị 1/1, hãy chạy lại lệnh port-forward của bạn:
kubectl port-forward deployment/web-api 8080:80
Mẹo phòng ngừa
- Forward đến Deployment: Đừng port-forward đến một tên Pod cụ thể. Hãy sử dụng
kubectl port-forward deployment/my-app 8080:80. Nếu một Pod đang ở trạng thái Pending nhưng Pod khác đang Running, Kubernetes sẽ tự động điều hướng bạn đến Pod khỏe mạnh. - Thiết lập Request thực tế: Tránh thiết lập yêu cầu tài nguyên (resource requests) quá cao trừ khi cần thiết. Nếu bạn yêu cầu 4 CPU trên một máy chỉ có 2 CPU, Pod sẽ không bao giờ khởi động được.
- Kiểm tra Liveness Probe: Đảm bảo
readinessProbecủa bạn không bị thất bại. Một Pod có thể đang "Running" nhưng chưa "Ready", điều này cũng có thể làm gián đoạn lưu lượng mạng.

