본문 바로가기
클라우드/쿠버네티스

쿠버네티스, Docker Hub 인증 Secret 설정하기

by gasbugs 2025. 7. 26.
반응형

Kubernetes를 사용하다 보면 직접 빌드한 이미지를 Docker Hub의 프라이빗 레지스트리에 저장하고 배포해야 하는 경우가 많습니다. 그런데 kubectl apply -f deployment.yaml 명령어를 실행했을 때, Pod이 정상적으로 실행되지 않고 ImagePullBackOff 또는 ErrImagePull 같은 에러 메시지를 마주할 때가 있습니다.

이것은 Kubernetes 클러스터가 여러분의 프라이빗 레지스트리에 접근할 권한, 즉 로그인 정보가 없기 때문에 발생하는 자연스러운 문제입니다.

이번 글에서는 이 문제를 해결하고 Docker Hub의 프라이빗 이미지를 원활하게 가져올 수 있도록 Kubernetes에 인증 정보를 추가하는 가장 확실한 방법을 알아보겠습니다.

Kubernetes는 어떻게 인증 정보를 관리할까? imagePullSecret

Kubernetes는 레지스트리 인증 정보와 같은 민감한 데이터를 **시크릿(Secret)**이라는 오브젝트를 통해 안전하게 관리합니다. 특히 Docker 레지스트리 인증을 위해서는 kubernetes.io/dockerconfigjson 타입의 시크릿을 사용하며, 이를 흔히 imagePullSecret 이라고 부릅니다.

이제 이 imagePullSecret을 직접 생성하고 적용하는 방법을 단계별로 알아보겠습니다.

1단계: imagePullSecret 생성하기

가장 간단한 방법은 kubectl CLI 명령어를 사용하는 것입니다.

⚠️ 잠깐! 비밀번호 대신 액세스 토큰을 사용하세요

본격적으로 시작하기 전에 중요한 보안 팁이 있습니다. Docker Hub 계정의 실제 비밀번호를 직접 사용하는 것보다, 보안 강화를 위해 **액세스 토큰(Access Token)**을 생성하여 사용하는 것을 강력히 권장합니다. 액세스 토큰은 특정 권한만 부여할 수 있고 언제든 비활성화할 수 있어 훨씬 안전합니다.

Docker Hub 액세스 토큰 생성 방법:

  1. Docker Hub 로그인 > 우측 상단 프로필 클릭 > Account Settings
  2. 왼쪽 메뉴에서 Security > New Access Token 클릭

이제 준비된 액세스 토큰으로 아래 명령어를 실행합니다.

kubectl create secret docker-registry dockerhub-auth \
  --docker-server=docker.io \
  --docker-username=<도커허브_사용자이름> \
  --docker-password=<도커허브_액세스토큰> \
  -n my-app-space # 파드와 동일한 네임스페이스(필수)
  • <시크릿_이름>: 나중에 사용하기 위해 지어주는 시크릿의 이름입니다. (예: dockerhub-auth)
  • --docker-server: Docker Hub의 공식 서버 주소인 docker.io 입니다.
  • --docker-username: 여러분의 Docker Hub 아이디입니다.
  • --docker-password: 방금 생성한 액세스 토큰입니다.
  • -n <네임스페이스>: 이 시크릿을 생성하고 사용할 네임스페이스입니다. Pod은 같은 네임스페이스에 있는 시크릿만 사용할 수 있으므로 매우 중요합니다.

2단계: 생성된 Secret 적용하기

시크릿을 만드는 것만으로는 끝나지 않습니다. Kubernetes에게 "이 시크릿을 사용해서 이미지를 가져와!"라고 알려주어야 합니다. 여기에는 두 가지 방법이 있습니다.

방법 1: Pod/Deployment에 직접 지정하기

가장 기본적인 방법입니다. 이미지를 사용하는 Pod, Deployment, StatefulSet 등의 YAML 파일에 직접 imagePullSecrets 필드를 추가합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-private-app
  namespace: my-app-space
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-private-app
  template:
    metadata:
      labels:
        app: my-private-app
    spec:
      containers:
      - name: app-container
        image: mydockerid/my-private-image:1.0
      imagePullSecrets:
      - name: dockerhub-auth # 1단계에서 생성한 시크릿 이름

방법 2: ServiceAccount에 연결하여 네임스페이스 전체에 적용하기 (권장 👍)

매번 YAML 파일을 수정하는 것은 번거롭고 실수의 여지가 있습니다. 특정 네임스페이스의 모든 Pod이 기본적으로 이 인증 정보를 사용하게 하려면 ServiceAccount에 시크릿을 연결하는 것이 훨씬 효율적입니다.

아래 명령 한 줄이면 해당 네임스페이스의 default ServiceAccount에 시크릿이 영구적으로 연결됩니다.

kubectl patch serviceaccount default \
  -p '{"imagePullSecrets": [{"name": "dockerhub-auth"}]}' \
  -n my-app-space

 

이제 my-app-space 네임스페이스에 생성되는 모든 Pod은 YAML 파일에 imagePullSecrets를 명시하지 않아도 자동으로 dockerhub-auth 시크릿을 사용하여 프라이빗 이미지를 가져올 수 있습니다.

 

결론

이제 여러분의 Kubernetes 클러스터는 더 이상 ImagePullBackOff 에러를 뿜어내지 않고 Docker Hub의 프라이빗 이미지를 원활하게 배포할 수 있게 되었습니다.

정리하자면, kubectl create secret docker-registry 명령어로 액세스 토큰을 사용해 시크릿을 생성하고, 가급적 ServiceAccount에 연결하여 자동화하는 것이 가장 효율적이고 안전한 방법입니다. 이 간단한 설정으로 여러분의 CI/CD 파이프라인은 한 단계 더 부드러워질 것입니다.

반응형