사설 레지스트리(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
'Infrastructure & Systems > Kubernetes' 카테고리의 다른 글
[Kubernetes] Kubespray로 k8s 설치 (0) | 2025.03.31 |
---|---|
[Kubernetes] StatefulSets and PersistentVolume YAML Sample (0) | 2025.03.24 |
[Kubernetes] DaemonSet YAML Sample (0) | 2025.03.24 |
[Kubernetes] Deployments YAML Sample (0) | 2025.03.24 |
[Kubernetes] Multi-Cluster 환경에서 kubectl (0) | 2024.11.29 |