k8s harbor Unauthorized 에러

hbjs97·2024년 3월 27일
post-thumbnail

네임스페이스를 초기화 할 일이 있어서 제거 후 재설정했다.
이미지 저장소로 harbor를 사용하고 있었고, imagePullSecrets 에 secret 을 사용하고 있었다.
harbor의 robot 계정을 사용하고 있었고 잘 동작하고 있었다.

그런데, 재설정 후 갑자기 image pull 시 Unauthorized 에러가 발생하며 pull을 실패했다.

재현

$ kubectl create secret docker-registry harbor-secret \
  --docker-server=<harbor-domain> \
  --docker-username=robot$<robot-name> \
  --docker-password=<robot-secret> \
  --namespace=<namespace>

위 명령어로 secret 을 생성했고, deployment 의 imagePullSecrets 에 정상적으로 선언했다.

위 상황이 반복되었다.
robot 계정의 권한에는 문제 없었고 username, password 등 모두 정확히 일치했는데 에러가 계속 발생했다.

base64 로 인코딩된 secret 값을 까봤다.

$ kubectl get secret harbor-secret -n <namespace> --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
{"auths":{"<harbor-domain>":{"username":"robot","password":"<robot-secret>","auth":"<base64>"}}}

위와같이 조회되는데, username 이 이상한걸 확인할 수 있다.
분명 robot$<robot-name> 로 정의했는데 $<robot-name> 이 사라지고 robot 만 남아있다.
로봇계정은 원래 이런가 싶어 "auth" 의 base64 값을 디코딩해봤는데 역시 $<robot-name> 이 없는 상태였다.

$ echo "<base64>" | base64 --decode
robot:<robot-secret>

정상적인 상황은 아닌것같아 찾아봤는데... 정말 단순하게 shell 문법 때문이었다.
shell 에서 문자열 안에 $ 기호를 사용할 때, 그 뒤에 오는 문자열은 변수로 간주되므로 $<robot-name> 이 공백으로 대체되었던것이다.

$ kubectl create secret docker-registry harbor-secret \
  --docker-server=<harbor-domain> \
  --docker-username=robot\$<robot-name> \
  --docker-password=<robot-secret> \
  --namespace=<namespace>

위와같이 robot\$<robot-name> Backslash ('\')로 escape 처리했고 해결되었다.

0개의 댓글