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.
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=ngix
pod/err-pod created
Kiểm tra.
kubectl get pod
NAME READY STATUS RESTARTS AGE
err-pod 0/1 ImagePullBackOff 0 60s
Bâ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
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 96s default-scheduler Successfully assigned default/err-pod to docker-desktop
Normal Pulling 48s (x3 over 96s) kubelet Pulling image "ngix"
Warning Failed 45s (x3 over 92s) kubelet Failed to pull image "ngix": rpc error: code = Unknown desc = Error response from daemon: pull access denied for ngix, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Warning Failed 45s (x3 over 92s) kubelet Error: ErrImagePull
Normal BackOff 7s (x5 over 92s) kubelet Back-off pulling image "ngix"
Warning Failed 7s (x5 over 92s) kubelet Error: ImagePullBackOff
Ở 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:lasted
pod/nginx created
Kiểm tra.
kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 0/1 ImagePullBackOff 0 31s
Dùng describe
để kiểm tra lỗi.
kubectl describe pod nginx
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m53s default-scheduler Successfully assigned default/nginx to docker-desktop
Normal Pulling 82s (x4 over 2m53s) kubelet Pulling image "nginx:lasted"
Warning Failed 77s (x4 over 2m50s) kubelet Failed to pull image "nginx:lasted": rpc error: code = Unknown desc = Error response from daemon: manifest for nginx:lasted not found: manifest unknown: manifest unknown
Warning Failed 77s (x4 over 2m50s) kubelet Error: ErrImagePull
Warning Failed 49s (x6 over 2m50s) kubelet Error: ImagePullBackOff
Normal BackOff 34s (x7 over 2m50s) kubelet Back-off pulling image "nginx:lasted"
Ta 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 unknown
Registry 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/microservice
pod/microservice created
Kiểm tra.
kubectl get pod
NAME READY STATUS RESTARTS AGE
microservice 0/1 ImagePullBackOff 0 81s
Dùng describe
để xem lỗi.
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m27s default-scheduler Successfully assigned default/microservice to docker-desktop
Normal Pulling 43s (x4 over 2m27s) kubelet Pulling image "hoalongnatsu/microservice"
Warning Failed 40s (x4 over 2m22s) kubelet Failed to pull image "hoalongnatsu/microservice": rpc error: code = Unknown desc = Error response from daemon: pull access denied for hoalongnatsu/microservice, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
Warning Failed 40s (x4 over 2m22s) kubelet Error: ErrImagePull
Warning Failed 25s (x6 over 2m22s) kubelet Error: ImagePullBackOff
Normal BackOff 14s (x7 over 2m22s) kubelet Back-off pulling image "hoalongnatsu/microservice"
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 microservice
kubectl run microservice --image=registry.gitlab.com/hoalongnatsu/microservice
pod/microservice created
Kiểm tra.
kubectl get pod
NAME 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 microservice
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 110s default-scheduler Successfully assigned default/microservice to docker-desktop
Normal Pulling 19s (x4 over 109s) kubelet Pulling image "registry.gitlab.com/hoalongnatsu/microservice"
Warning Failed 17s (x4 over 108s) kubelet 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
Warning Failed 17s (x4 over 108s) kubelet Error: ErrImagePull
Normal BackOff 6s (x6 over 107s) kubelet Back-off pulling image "registry.gitlab.com/hoalongnatsu/microservice"
Warning Failed 6s (x6 over 107s) kubelet Error: ImagePullBackOff
Ta 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: dockersecret
Vấ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.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?