쿠버네티스 Error: ErrImagePull, toomanyrequests

1 minute read

문제

쿠버네티스를 걸음마 배우듯 한 걸음 한 걸음 배우고 있다. 그런데 유독 회사에서 로컬PC에 minikube를 설치하고 pod를 배포하는 실습을 하다보면, 아래와 같은 에러가 자주 등장했다.

Failed to pull image "<image>": rpc error: code = Unknown desc = Error response from daemon: toomanyrequests: You have reached 
your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit

알고보니 도커 홈페이지에서 말하듯 비인증 IP 기반은 6시간에 100번의 이미지 pull을, 도커 로그인을 한 경우 6시간에 200번의 이미지 pull 제한을 걸고 있었다. 하지만 내 경우는 100번은 커녕 10번도 하지 않았는데 위와 같은 에러가 자꾸 났다. 아마 회사에서 나가는 IP가 싸그리 공용 IP로 나가기 때문에, 다른 직원들과의 pull 합산이 100번이 넘은 듯 했다. 주변에 물어봤을 때 그냥 기다렸다가 하거나 개인의 도커 계정으로 로그인해서 사용한다고 했다. 일반적인 docker 명령어를 사용해서 계정으로부터 이미지를 pull 하는거야 docker login 명령어로 하면 되는데, 쿠버네티스에서 yaml파일 명세로 pod를 배포하는 상황에서는 어떻게 해야 내 계정으로 이미지를 pull하는 지 몰랐다.

해결방법

해결 방법을 짧게 줄이자면, docker-registry 용 k8s secret을 생성한 뒤, 이미지를 pull 할 때 적용할 secret으로 yaml 파일 내에서 지정해주면 된다.

kubectl create secret docker-registry <secret-name> --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

내 경우에는, dockerhub로부터 이미지를 당기되 내 계정 기반으로 당기고 싶었던 것이므로 인자 중 –docker-username, –docker-password 만 사용하였다.

kubectl create secret docker-registry <secret-name> --docker-username=<your-name> --docker-password=<your-pword>

그리고 해당 secret을 배포할 yaml 파일 내에 imagePullSecrets에 명시해주면된다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
spec:
  selector:
    matchLabels:
      app: counter
      tier: db
  template:
    metadata:
      labels:
        app: counter
        tier: db
    spec:
      containers:
        - name: redis
          image: redis
          ports:
            - containerPort: 6379
              protocol: TCP
      ########### 여기 ! #############
      imagePullSecrets:
        - name: <secret-name>
      ###############################

이 방법의 문제는 다른 리소스를 배포할 때마다 위 문구를 적어줘야한다는 것이다. 하지만 내 경우처럼 단순 회사내에서 실습을 하는데 공용 IP로 인한 pull 이슈를 겪는 사람들에겐 임시방편으로 훌륭할 것이다. 더 우아한 방법을 찾으시는 분들은 이 곳에 좋은 방법들이 잘 정리되어 있으니 참고하면 좋을 것 같다.

References

  1. https://kubernetes.io/ko/docs/tasks/configure-pod-container/pull-image-private-registry/
  2. https://subicura.com/k8s/2021/01/02/docker-hub-pull-limit/

Categories:

Updated:

Leave a comment