Infrastructure & Systems/Kubernetes

[Kubernetes] Secret 이용 Private Registry 인증정보 설정

EndiYou 2025. 4. 2. 12:04

사설 레지스트리(docker, harbor, ECR 등)를 이용할 때 인증 정보(자격증명)를 같이 전달해야 하는 경우 쿠버네티스에서 제공하는 Secret 리소스를 이용할 수 있다. 사설 레지스트리의 인증정보를 포함하고 있는 Secret 리소스를 생성한 다음 Pod 혹은 Deployment와 같은 리소스가 사설 레지스트리에서 컨테이너 이미지를 가져올 때 생성한 Secret 리소스를 사용하도록 설정해야 한다.

 

사설 레지스트리 인증을 위한 Secret 생성

Secret을 생성하는 방식은 kubectl 명령에 옵션으로 인증정보를 포함한 도커의 config.json 파일을 적용하거나 직접 커맨드에 인증 정보를 할당할 수 있고, 또는 YAML 파일에 인증정보를 입력해서 생성하는 방법이 있다.

 

1. kubectl 명령에 옵션으로 인증 정보 할당

kubectl create secret 명령을 이용해서 생성할 때 generic 형식이 아닌 docker-registry 형식으로 Secret을 생성할 수 있다. 여기에 사용자의 docker hub username, password, email 정보를 옵션으로 할당해서 생성하는 방식이다.

  • docker hub 
$ kubectl create secret docker-registry auth-secret \
--docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
  • harbor와 같이 private registry의 서버 ip 지정이 필요한 경우
$ kubectl create secret docker-registry auth-secret \
--docker-server=<your-registry-server> --docker-username=<your-name> \
--docker-password=<your-pword> --docker-email=<your-email>

 

2. kubectl 명령에 config.json 파일 할당

docker login 명령을 실행하면 인증 정보를 config.json 파일을 홈 디렉터리 아래 .docker 폴더에 저장한다. 이 파일의 경로를 지정해서 Secret을 생성할 수 있다. 클라우드 환경에서는 id, password 대신 Access & Secret Key 값을 이용해서 인증 정보에 활용할 수도 있는데, 이 때는 [ACCESS_KEY]:[SECRET_KEY] 구조로 값을 인코딩 한 다음 config.json 파일에 설정해서 이용할 수도 있다.

  •  docker hub 로그인
# <username>을 자신의 docker hub id로 바꾸고 메시지가 표시되면 password를 입력한다.
$ docker login -u <username>
Password: 
WARNING! Your password will be stored unencrypted in /home/ubuntu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credential-stores

Login Succeeded
  • config.json 파일 확인
$ cat ~/.docker/config.json 
{
        "auths": {
                "https://index.docker.io/v1/": {
                        "auth": "eX...M="
                }
        }
}
  • Access & Secret Key 인증 정보 설정
$ PRIVATE_REGISTRY_URL="<ACCOUNT_ID>.dkr.ecr.ap-northeast-2.amazonaws.com" 
$ ACCESS_AND_SECRET_KEY_ENCODING_VALUE=$(echo -n '<ACCESS_KEY>:<SECRET_KEY>' | base64)
$ mkdir -p /home/ubuntu/.docker/
$ echo '{
    "auths": {
        "'$PRIVATE_REGISTRY_URL'": {
            "auth": "'$ACCESS_AND_SECRET_KEY_ENCODING_VALUE'"
        }
    }
}' > /home/ubuntu/.docker/config.json
  • config.json 파일을 지정해 Secret 생성
$ kubectl create secret generic auth-secret \
    --from-file=.dockerconfigjson=/home/ubuntu/.docker/config.json \
    --type=kubernetes.io/dockerconfigjson

 

3. YAML 파일에 인증 정보를 등록해서 생성하는 방법

kubectl 명령을 이용할 경우 간단하게 Secret 리소스를 생성해서 활용할 수 있지만 laber, namespace 적용 등 세세한 환경 설정을 하고자 한 다면 YAML 파일을 이용해서 구성할 수 있다.

  • Access & Secret Key 인증 정보 설정
$ PRIVATE_REGISTRY_URL="****.scp.com"
$ ACCESS_AND_SECRET_KEY_ENCODING_VALUE=$(echo -n '<ACCESS_KEY>:<SECRET_KEY>' | base64)
$ DOCKER_CONFIG_FILE_ENCODING_VALUE=$(echo -n '{"auths": {"'$PRIVATE_REGISTRY_URL'": {"auth": "'$ACCESS_AND_SECRET_KEY_ENCODING_VALUE'"}}}' | base64)
  • YAML 파일 구성
$ echo 'apiVersion: v1
kind: Secret
metadata:
  name: auth-secret
  namespace: frontend
data:
  .dockerconfigjson: '$DOCKER_CONFIG_FILE_ENCODING_VALUE'
type: kubernetes.io/dockerconfigjson' > auth-secret.yaml
  • Secret 리소스 생성
$ kubectl apply -f auth-secret.yaml

 

Secret 리소스를 파드에 지정하는 방법

사설 레지스트리 인증을 위한 Secret 리소스를 할당할 때는 imagePullSecrets 항목으로 지정해서 사용한다. 이미지를 가져오는 리소스가 선언된 매니페스트에 직접 할당해서 사용할 수 있고, 리소스에 할당 된 Service Account에 적용해서 Service Account를 사용하는 모든 파드에 자동으로 추가될 수 있게 하는 방법이 있다.

 

1. 이미지를 가져오는 매니페스트에 직접 할당

apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
  labels:
    app: frontend-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend-deploy
  template:
    metadata:
      labels:
        app: frontend-deploy
    spec:
      imagePullSecrets:		# spec.template.spec 항목 하위에 할당한다.
        - name: auth-secret
      containers:
        - name: frontend-container
          image: nginx:1.19
          ports:
            - containerPort: 80

 

2. Service Account 사용

  • Service Account 생성
apiVersion: v1
kind: ServiceAccount
metadata:
  name: auth-service-account
  namespace: default
imagePullSecrets:
- name: auth-secret		# Secret 할당
  • 이미지를 가져오는 매니페스트에 Service Account 할당
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
  labels:
    app: frontend-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend-deploy
  template:
    metadata:
      labels:
        app: frontend-deploy
    spec:
      serviceAccountName: auth-service-account	# service account 할당
      containers:
        - name: frontend-container
          image: nginx:1.19