Trạng thái của một pod trong cụm Kubernetes (K8S) của bạn có thể hiển thị lỗi ‘CrashLoopBackOff’. Lỗi này xuất hiện khi một pod bị crash và cố gắng khởi động lại nhiều lần.
Trong bài viết này, chúng ta sẽ tìm hiểu cách phát hiện lỗi này, cách khắc phục và một số nguyên nhân có thể gây ra nó.
CrashLoopBackOff trong Kubernetes là gì?
CrashLoopBackOff là một trạng thái trong K8S báo hiệu rằng một pod đang gặp vòng lặp khởi động lại liên tục. Đây là một lỗi phổ biến xảy ra khi một container trong K8S không thể khởi động đúng cách vì một lý do nào đó và liên tục bị crash.
CrashLoopBackOff không phải là một lỗi cụ thể, mà nó chỉ ra rằng có một lỗi đang ngăn pod khởi động bình thường. Kubernetes sẽ áp dụng cơ chế “back-off”, tức là tăng dần thời gian chờ giữa các lần khởi động lại để bạn có thời gian khắc phục sự cố.
Cách tìm lỗi ‘CrashLoopBackOff’ Để kiểm tra trạng thái của các pod, hãy chạy lệnh sau:
kubectl get pods -n
<namespace>
Phần status sẽ hiển thị trạng thái của pod. Nếu pod đang ở trạng thái CrashLoopBackOff, nó sẽ hiển thị là không sẵn sàng (ví dụ: 0/1), đồng thời số lần khởi động lại sẽ lớn hơn 0:
NAME READY STATUS RESTARTS AGE
nginx-6bc3f4de8a-km2rq 0/1 CrashLoopBackOff 6 2m
Các trạng thái “bình thường” bao gồm:
Running Pod đang chạy mà không gặp bất kỳ vấn đề nào.
Waiting Pod vẫn đang khởi động, có thể đang tải image container hoặc nhận dữ liệu bí mật. Khi hoàn tất, nó sẽ chuyển sang trạng thái Running.
Terminated Pod có trạng thái này có thể đã chạy xong hoặc bị lỗi vì một lý do nào đó.
Khắc phục sự cố Pod với trạng thái CrashLoopBackOff
Dưới đây là bốn lệnh kubectl được khuyến nghị để bắt đầu chẩn đoán các pod bị lỗi:
- kubectl describe deployment – Kiểm tra chi tiết về deployment liên quan đến pod.
- kubectl describe pod – Hiển thị thông tin chi tiết về pod, bao gồm sự kiện và nguyên nhân lỗi.
- kubectl logs – Xem log của container trong pod để tìm hiểu lý do thất bại.
- kubectl get events – Hiển thị danh sách sự kiện trong cụm để phát hiện lỗi liên quan đến pod.
Để biết thêm lệnh kubectl, hãy tham khảo Kubernetes Cheat Sheet.
1. Kiểm tra lỗi “Back-Off Restarting Failed Container” bằng lệnh kubectl describe
Trước tiên, lệnh kubectl describe deployment có thể được sử dụng để xác định deployment đang gặp lỗi CrashLoopBackOff. Bạn có thể liệt kê tất cả các deployment bằng lệnh:
kubectl get deployments
Để xem danh sách các pod liên kết với deployment, bạn có thể sử dụng bộ chọn nhãn (label selector).
Ví dụ, nếu deployment của bạn có tên “myapp-deployment”, bạn có thể sử dụng lệnh sau:
kubectl get pods -l app=myapp-deployment
Tiếp theo, bạn có thể sử dụng lệnh kubectl describe pod để xem chi tiết hơn về pod:
kubectl describe pod <pod name> -n <namespace>
Phần status của pod sẽ hiển thị bất kỳ thông báo lỗi nào liên quan đến pod.
Phần events trong kết quả đầu ra sẽ cung cấp thông tin về trạng thái của pod. Hãy tìm các mục chứa thông báo “Back-off restarting failed container”, như trong ví dụ dưới đây:
Name: pod-name
Namespace: default
Priority: 0
…
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Error
…
Warning BackOff 2m (x3 over 1m) kubelet, ip-10.10.50.11 Back-off restarting failed container
…
2. Kiểm tra log của pod bị lỗi bằng lệnh kubectl logs.
Tiếp theo, kiểm tra log của pod bị lỗi bằng lệnh kubectl logs. Cờ -p (hoặc –previous) sẽ lấy log từ lần chạy trước đó của pod, giúp bạn xem điều gì đã xảy ra ở cấp ứng dụng.
Log từ tất cả các container hoặc chỉ một container có thể được chỉ định bằng cờ –all-containers. Bạn có thể xem phần cuối của file log bằng cách thêm cờ –tail.
kubectl logs <pod-name> -p
kubectl logs <pod-name> --all-containers
kubectl logs <pod-name> --tail=50
3. Kiểm tra các sự kiện bằng lệnh kubectl get events.
Tiếp theo, bạn nên kiểm tra các sự kiện trong K8S bằng lệnh kubectl get events và xem các sự kiện xảy ra trước khi pod bị crash.
- Sử dụng cờ –sort-by= để sắp xếp theo timestamp.
- Để xem sự kiện từ một pod cụ thể, sử dụng cờ –field-selector.
kubectl get events -n
<namespace> --sort-
by=.metadata.creationTimestamp
kubectl get events -n
<namespace> --field-selector
involvedObject.name=<pod name>
Kết quả sẽ được hiển thị dưới dạng danh sách, ví dụ như sau:
kube-system 60m Normal Pulling pod/node-problem-detector-vmcf2 pulling image "k8s.gcr.io/node-problem-detector:v0.7.0"
kube-system 60m Normal Pulled pod/node-problem-detector-vmcf2 Successfully pulled image "k8s.gcr.io/node-problem-detector:v0.7.0"
kube-system 60m Normal Created pod/node-problem-detector-vmcf2 Created container
kube-system 60m Normal Started pod/node-problem-detector-vmcf2
Nguyên nhân và cách ngăn chặn lỗi CrashLoopBackOff
Lỗi CrashLoopBackOff có thể do nhiều nguyên nhân khác nhau. Dưới đây là một số nguyên nhân phổ biến và cách khắc phục:
1. Cấu hình container sai
- Kiểm tra lỗi chính tả hoặc các giá trị bị cấu hình sai trong file cấu hình.
2. Thiếu bộ nhớ hoặc tài nguyên
- Kiểm tra giới hạn tài nguyên (resources: limits).
- Nguyên nhân có thể do lưu lượng truy cập hoặc hoạt động tăng đột biến.
3. Hai hoặc nhiều container sử dụng cùng một cổng
- Nếu các container nằm trong cùng một pod và sử dụng chung một cổng, lỗi sẽ xảy ra.
- Kiểm tra file cấu hình để đảm bảo mỗi container có cổng riêng.
4. Pod cố gắng kết nối với file hoặc database bị khóa do pod khác đang sử dụng
- Đảm bảo file hoặc database hỗ trợ cơ chế khóa phù hợp.
- Xem xét sử dụng transaction để đảm bảo tính nhất quán khi truy cập dữ liệu đồng thời.
5. Pod tham chiếu đến tài nguyên hoặc package không tồn tại
- Kiểm tra lại tất cả các tham chiếu đến file, database, hoặc dịch vụ bên ngoài trong cấu hình pod.
- Đảm bảo đường dẫn và endpoint chính xác.
6. Lỗi tổng quát khi triển khai phần mềm
- Kiểm tra các bug và exception liên quan đến ứng dụng.
7. Tham số dòng lệnh bị sai hoặc thiếu
- Nếu cấu hình yêu cầu tham số dòng lệnh, hãy kiểm tra và đảm bảo chúng hợp lệ.
8. Liveness probe không được cấu hình đúng
- Kiểm tra file cấu hình, đặc biệt là đường dẫn, cổng hoặc endpoint của liveness probe.
9. Quyền bị chỉ định sai hoặc thiếu quyền cần thiết
Đảm bảo pod có quyền thực thi nhiệm vụ của nó, ví dụ: ghi vào thư mục hoặc kết nối database.
10. Pod đang cố ghi vào hệ thống file hoặc thư mục chỉ đọc
Kiểm tra quyền ghi của thư mục hoặc hệ thống file mà pod đang sử dụng.
11. Sự cố kết nối
- Cấu hình mạng bị sai hoặc DNS không khả dụng.
- kube-dns có thể không chạy, làm cho container không thể kết nối với dịch vụ bên ngoài.
12. Biến môi trường sai
- Dùng lệnh env để kiểm tra các biến môi trường trong container.
13. Managed Identity không thể truy cập được
- Trong các dịch vụ như Azure Kubernetes Service (AKS), nếu pod được gán Managed Identity, hãy kiểm tra xem identity có hợp lệ và được gán đúng cách không.
Kết luận
Trên đây là các lưu ý CrashLoopBackOff mà bạn rất hay có thể gặp khi sử dụng Kubernetes. Mình cũng gặp rất nhiều và dành thời gian research mong rằng giúp ích được cho bạn khi làm việc trên kubernetes.
Tài liệu tham khảo: Troubleshoot and Fix Kubernetes CrashLoopBackoff Status