Giới thiệu
Một trong những lỗi ta hay gặp nhất khi làm việc với Kubernetes là lỗi ImagePullBackOff, vì thế ở bài này chúng ta sẽ cùng tìm hiểu một số lỗi ImagePullBackOff thường xảy ra để ta có thể dễ dàng tránh và khắc phục.
Mục lục
- Lỗi ImagePullBackOff là gì?
- Image không tồn tại
- Image Tag không chính xác
- Registry không chính xác
- Chưa có chứng thực khi cần tải từ Private Registry
- Vấn đề về mạng
- Container Registry có giới hạn lượt tải
- Kết luận
- Bài viết liên quan
Lỗi ImagePullBackOff là gì?
ImagePullBackOff là lỗi Kubernetes Container Runtime không thể tải Image từ Container Registry xuống khi tạo Pod. Một số lý do phổ biến của lỗi này:
- Image không tồn tại hoặc sai tên
- Image Tag không chính xác
- Registry không chính xác
- Chưa có chứng thực khi cần tải từ Private Registry
- Vấn đề về mạng
- Container Registry có giới hạn lượt tải
Image không tồn tại
Đây là lý do phổ biến nhất khiến ta gặp lỗi ImagePullBackOff, là bạn dùng một Image không tồn tại để tạo Pod. Ví dụ thay vì dùng nginx ta lại dùng ngix:
kubectl run err-pod --image=ngixpod/err-pod createdKiểm tra.
kubectl get podNAME READY STATUS RESTARTS AGE
err-pod 0/1 ImagePullBackOff 0 60sBây giờ ta đã thấy lỗi ImagePullBackOff và để xác định chính xác lỗi do đâu thì ta dùng câu lệnh describe.
kubectl describe pod err-podỞ phần Events ta sẽ thấy được lỗi.
Image Tag không chính xác
Lý do phổ biến thứ hai là ta chỉ định Image Tag không chính xác. Ví dụ thay vì dùng latest ta lại chỉ định lasted:
kubectl run nginx --image=nginx:lastedpod/nginx createdKiểm tra.
kubectl get podNAME READY STATUS RESTARTS AGE
nginx 0/1 ImagePullBackOff 0 31sDùng describe để kiểm tra lỗi.
kubectl describe pod nginxTa sẽ thấy được dòng thông báo lỗi chính xác là do đâu.
Failed to pull image "nginx:lasted": rpc error: code = Unknown desc = Error response from daemon: manifest for nginx:lasted not found: manifest unknown: manifest unknownRegistry không chính xác
Lý do phổ biến thứ ba là ta chỉ định tên của Registry không chính xác khi tạo Pod, lỗi này hay gặp với các bạn dùng Registry không phải là Docker Hub, ví dụ với Gitlab thì tên của Registry thường là registry.gitlab.com/<account>/<repo>.
Ta có một Image được để trên Gitlab với tên là registry.gitlab.com/hoalongnatsu/microservice, nhưng khi tạo Pod ta lại bỏ phần Registry đi.
kubectl run microservice --image=hoalongnatsu/microservicepod/microservice createdKiểm tra.
kubectl get podNAME READY STATUS RESTARTS AGE
microservice 0/1 ImagePullBackOff 0 81sDùng describe để xem lỗi.
Ta sẽ thấy lỗi là repository does not exist. Để sửa thì khi chạy các bạn chỉ định thêm tên của Registry là được.
kubectl delete pod microservicekubectl run microservice --image=registry.gitlab.com/hoalongnatsu/microservicepod/microservice createdKiểm tra.
kubectl get podNAME READY STATUS RESTARTS AGE
microservice 0/1 ImagePullBackOff 0 31sỦa??? Nó vẫn báo lỗi??? Đây là lỗi phổ biến tiếp theo ta hay gặp phải.
Chưa có chứng thực khi cần tải từ Private Registry
Các bạn dùng câu lệnh describe để kiểm tra lỗi.
kubectl describe pod microserviceTa thấy lỗi là.
Failed to pull image "registry.gitlab.com/hoalongnatsu/microservice": rpc error: code = Unknown desc = Error response from daemon: Head "https://registry.gitlab.com/v2/hoalongnatsu/microservice/manifests/latest": denied: access forbiddenĐây là lỗi ta chỉ định Image từ Private Registry mà chưa có chứng thực vào Registry đó. Để sửa lỗi này thì ta cần đăng nhập vào Registry, ở trong Kubernetes ta làm việc đó bằng cách dùng Secret.
kubectl create secret docker-registry dockersecret --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>Ở trên ta tạo Secret tên là dockersecret, sau đó ta chỉ định nó vào trường imagePullSecrets khi tạo Pod.
apiVersion: v1
kind: Pod
metadata:
name: microservice
spec:
containers:
- name: microservice
image: registry.gitlab.com/hoalongnatsu/microservice
imagePullSecrets:
- name: dockersecretVấn đề về mạng
Nếu máy chủ của ta có cấu hình proxy, tường lửa hoặc một số thứ khác liên quan tới tầng mạng thì khi ta tạo Pod sẽ gặp lỗi như sau.
Failed to pull image "nginx:latest": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/nginx:latest": failed to resolve reference "docker.io/library/nginx:latest": failed to do request: Head https://registry-1.docker.io/v2/library/nginx/manifests/latest: dial tcp: lookup registry-1.docker.io on 192.168.64.1:53: server misbehavingĐể sửa lỗi này thì tùy vào các máy chủ của các bạn đang cấu hình proxy như thế nào.
Container Registry có giới hạn lượt tải
Vấn đề này xảy ra khi ta sử dụng Docker Hub, nếu bạn không xài bản Docker có phí thì mặc định Docker Hub chỉ cho phép ta tải 100 ~ 200 Image trong vòng 6 tiếng.
Nên khi làm việc ở môi trường Production ta thường sẽ tự hosting một Registry riêng hoặc là xài của những thằng khác không có giới hạn.
Kết luận
Ở trên là một số lỗi ImagePullBackOff ta thường gặp và cách khắc phục, vấn đề sai tên của Image và Tag tuy đơn giản nhưng lại hay xảy ra nhất, nên ta nhớ để ý tên của Image thật chính xác trước khi tạo Pod để tránh lỗi.
First AI Journey for DevOps:
- PromptOps: From YAML to AI
- The DevOps AI Advantage
- The AIOps Book