반응형
문제 발생
- 다음과 같은 Deployment를 배포할 때, docker login을 못하여 ImagePullBackOff / ErrImagePull 에러 발생
apiVersion: apps/v1
kind: Deployment
metadata:
name: django-app
spec:
replicas: 2
selector:
matchLabels:
app: django-app
template:
metadata:
labels:
app: django-app
spec:
containers:
- name: django-app
image: ironjin92/my-registry:latest
ports:
- containerPort: 8000
imagePullSecrets:
- name: my-registry
문제 원인
- Docker Login이 안 돼서 발생하는 상황
- 왜 로그인이 안 되는 것인지 알아볼 필요성을 느꼈다
1차 접근 - 이미지는 잘 생성되었는가
- Container 이미지가 잘 생성되었는지, 잘 동작하는지 확인하기 위해 로컬 이미지 배포 (정상 동작)
2차 접근 - 로컬에서 Docker 로그인
- 로컬에서의 docker login 명령어를 통해 확인
3차 접근 - Kubernetes Secret 정보 디코딩
- Kubernetes의 Secret 정보를 확인해본다
정상적인 Secret 구조
{
"auths": {
"your.private.registry.example.com": {
"username":"janedoe",
"password":"xxxxxxxxxxx",
"email":"jdoe@example.com",
"auth":"c3R...zE2"
}
}
}
현재 내 Secret 구조
- 상태 확인 명령어
kubectl get secret <screte name> --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
- 결과
문제 원인 파악
- kubectl create secret generic 타입으로 생성할 때는 secret 내부 auth 값이 비어있는 것을 확인
- 쓰기 권한이 없을 경우 문제가 될 수 있다고 생각하여 권한 확인 결과 이상 없었고, 쓰기 권한을 추가해도 같은 현상 발생
- 이 값이 비어있기 때문에 kubernetes 내부에서 docker registry에 로그인할 인증 정보가 없어서 denined 되었다고 판단
- 인증 정보를 저장할 다른 수단 필요
커맨드 라인에서 자격 증명을 통하여 시크릿 생성
Kubernetest Secret 생성
kubectl create secret docker-registry <scret name> \
--docker-server=<your-registry-server> \
--docker-username=<your-name> \
--docker-password=<your-pword>\
--docker-email=<your-email>
생성 시 주의 사항
- 보통 비밀번호나 이메일에 특수 문자가 들어가게 되는데, 그냥 적어줄 경우 'no matches found: --docker-password' 에러 발생
- 문제 원인은 특수 문자가 들어가서 이를 파싱하는데 에러가 발생한듯하다
- 따라서 이럴 경우 '(따옴표) 안에 문자열 형식으로 적어주면 정상적으로 secret이 생성된다
Secret 정상 동작 후 배포 현황
Secret만 정상적으로 동작하게끔 바꿔줬기 때문에 배포 코드 이미지는 이 전과 같다
- 기존에 실패한 Deployment 삭제 => kubectl delete deployment <deployment name>
- 정상 동작하는 seceret을 Deployment 파일에 입력
- 예시 )
apiVersion: apps/v1
kind: Deployment
metadata:
name: success-app
spec:
replicas: 2
selector:
matchLabels:
app: success-app
template:
metadata:
labels:
app: success-app
spec:
containers:
- name: success-app
image: ironjin92/my-registry:latest
ports:
- containerPort: 8000
imagePullSecrets:
- name: my-registry # 정상 동작하는 Secret 추가
# - name: error-repository 기존 Secret 제거
Deployment 파일이 있는 위치에서 kubectl apply -f <filename.yml> 명령어로 배포
추가 보완
- 만약 Deployment 단일로 배포했을 때 정상 동작하지만, ArgoCD 등의 배포 파이프 라인에서 실패할 경우
- 배포 파이프라인의 Namespace를 확인해보자
- 위 예제에서는 Secret의 Namespace를 따로 설정해주지 않았기 때문에 default로 적용이 된다
- 하지만, 배포 파이프라인에서 Namespace를 지정했을 경우 해당 Namespace에 Secret를 찾을 수 없기 때문에 여전히 docker login이 denied 될 것이다
- 이럴 경우 배포 파이프라인을 위한 Namespace를 가진 Secret을 생성해줘야 정상적으로 동작한다
[참고]
반응형
LIST