본문 바로가기

devops/k8s

[Kubernetes] private 저장소의 이미지를 가져오는 법

kubernetes를 공부하기 위해서 진행하는 프로젝트에서 private 저장소의 이미지를 가져와서 배포를 해야하는 상황을 마주하게 되었다. 그 동안은 public 이미지를 통해서 배포를 구성해왔기 때문에 크게 고민하지 않고 사용했던 기능이었지만 이번 기회를 통해서 공부하게 되었다.

로그인을 위한 Secret 생성하기

도커 허브에 접속하기 위해서 필요한 아이디와 비밀번호 정보를 기반으로 비밀을 생성할 수 있다. 만약 도커 허브가 아니라 다른 이미지 저장소를 사용한다면 docker-server의 파라미터를 알맞게 수정해서 사용하면 된다.

kubectl create secret docker-registry regcred --docker-server=https://index.docker.io/v1/ --docker-username=test@gmail.com --docker-password=test --docker-email=test@gmail.com -o yaml

다음 명령을 실행하면 아래의 Secrets을 생성해준다. .dockerconfigjson 파일을 이용해서 외부 저장소의 로그인 정보를 사용할 수 있도록 구성한다.

apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI6eyJodHRwczovL2luZGV4LmRvY2tlci5pby92MS8iOnsidXNlcm5hbWUiOiJ0ZXN0QGdtYWlsLmNvbSIsInBhc3N3b3JkIjoidGVzdCIsImVtYWlsIjoidGVzdEBnbWFpbC5jb20iLCJhdXRoIjoiZEdWemRFQm5iV0ZwYkM1amIyMDZkR1Z6ZEE9PSJ9fX0=
kind: Secret
metadata:
  creationTimestamp: "2024-06-30T03:00:21Z"
  name: regcred
  namespace: default
  uid: e9ca3d59-98d7-4b8e-9a99-87e7d1b50702
type: kubernetes.io/dockerconfigjson

저장된 비밀을 좀 더 가시적으로 확인하고 싶다면 base64를 디코드하면된다. 그러면 처음 비밀을 생성할 때, 입력한 파라미터를 확인할 수 있다.

kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
// output sample
{"auths":{"your.private.registry.example.com":{"username":"janedoe","password":"xxxxxxxxxxx","email":"jdoe@example.com","auth":"c3R...zE2"}}}

kubectl와 base64 명령을 활용해서 터미널에서 쉽게 확인할 수도 있다.

ImagePullSecrets 속성을 통해서 저장소 접근 권한 설정하기

앞서서 생성한 레지스트리 접근 시크릿을 적용하기 위해서 ImagePullSecrets을 사용한다.

💡 Kubernetes는 Pod에서 컨테이너 이미지 레지스트리 키 지정을 지원합니다. imagePullSecrets모두 포드와 동일한 네임스페이스에 있어야 합니다. 참조된 보안 비밀은 kubernetes.io/dockercfg 또는 kubernetes.io/dockerconfigjson 유형이어야 합니다.

위에서 생성한 시크릿에서 .dockerconfigjson 유형이기 때문에 그대로 사용하면 된다. 여기에서 주의할 점은 시크릿의 네임스페이스가 pod와 일치해야한다는 것이다.

apiVersion: v1
kind: Pod
metadata:
  name: foo
  namespace: awesomeapps
spec:
  containers:
    - name: foo
      image: janedoe/awesomeapp:v1
  imagePullSecrets:
    - name: myregistrykey

참고 자료

https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/#inspecting-the-secret-regcred