0. 개요
쿠버네티스에서 파드를 생성할 때 외부로부터 필요한 이미지를 Pull하여 실행한다.
하지만 외부 레포지토리가 Private인 경우 인증 절차를 거쳐야한다.
imagePullSecrets를 적용함으로써 인증 절차를 수행할 수 있다.
인증을 진행하는데 총 2가지 방법이 존재한다.
1.1. ecr 인증 secret 작성
# 현재 iam 사용자 정보 확인
aws sts get-caller-identity
# 현재 설정된 aws cli 프로필 확인
aws configure list
kubectl create secret docker-registry ecr-secret \\
--docker-server=073863069645.dkr.ecr.ap-northeast-2.amazonaws.com \\
--docker-username=AWS \\
--docker-password=$(aws ecr get-login-password --region ap-northeast-2)
- aws ecr get-login-password --region ap-northeast-2는 현재 로그인된 aws 계정 정보 기반으로 AWS에 토큰 요청
- ecr은 dockerhub기반은 아니지만, 동일한 컨테이너 표준을 제공하기 위해 docker 명령어를 사용한다.
1.2. 또는 이미 저장된 정보 활용
kubectl create secret generic regcred --from-file=.dockerconfigjson=/home/ubuntu/.docker/config.json --type=kubernetes.io/dockerconfigjson
- docker에 로그인하게 되면 config.json파일에 계정 정보가 남는다. 이 계정정보를 기반으로 Secret을 작성한다.
두가지 방법 비교
2번의 경우는 도커에 미리 로그인을 하기 때문에, 도커 계정 정보가 파일에 남게된다.
도커 계정 정보는 민감한 정보이기 때문에, 직접적으로 파일에 정보를 남기는 것은 보안상 취약한 면이 있다.
반면 1번 방법의 경우 aws에서 임시 토큰을 받아 대신 사용하기 때문에, 비밀번호를 노출하지 않아도 되는 이점이 있다.
방식 1️⃣ kubectl create secret generic 2️⃣ kubectl create secret docker-registry
저장 정보 | ~/.docker/config.json 파일에 로그인 정보 저장 | AWS에서 즉시 발급한 임시 토큰 사용 |
토큰 저장 위치 | 로컬 디스크 (config.json)에 보관됨 | Kubernetes Secret에 직접 저장됨 |
토큰 유효 기간 | docker login을 사용하면 영구적으로 남음 | ECR 토큰은 기본 12시간 후 자동 만료 |
보안 위험성 | config.json이 유출되면 영구적인 인증 정보가 탈취될 가능성 있음 | 토큰이 자동 만료되므로 노출 위험이 상대적으로 적음 |
IAM 권한 관리 | Docker Hub, GitHub Registry 등 다양한 레지스트리 포함 가능 | IAM Role을 활용하여 세밀한 접근 제어 가능 |
예외로 도커 데스크톱을 사용하는 경우에는 인증정보가 직접적으로 저장되지 않고 데스크톱이 대신 관리한다.
config.json
"credsStore": "desktop",
2. deployment imagePullSecrets에 secret 적용
apiVersion: apps/v1
kind: Deployment
metadata:
name: medeasy-spring-deployment
spec:
replicas: 1
selector:
matchLabels:
app: medeasy
template:
metadata:
labels:
app: medeasy
spec:
containers:
- name: medeasy
image: 073863069645.dkr.ecr.ap-northeast-2.amazonaws.com/medeasy:latest
imagePullPolicy: Always
imagePullSecrets:
- name: ecr-secret
deployment 설정 업데이트 및 재시작
kubectl apply -f deployment.yaml
kubectl rollout restart deployment medeasy-spring-deployment
연결 문제 발생 → 단순 오타 문제
현재 쿠버네티스 클러스터 환경은 테스트를 위해 도커 데스크톱 쿠버네티스를 사용하고 있다.
따라서 service 리소스의 ip주소는 localhost 이고 service의 nodePort를 30000으로 정의하였기 때문에
[localhost:30000](<http://localhost:30000>)/api/swagger로 스웨거 페이지 요청을 하였다.
하지만 페이지가 응답되지 않는 오류가 발생하게 되었고, 디버깅 하게 되었다,
describe를 통하여 오류를 디버깅하였고 ecr이미지 pull은 잘 적용되었으나 실행단계에서 문제가 발생한 것을 알았다.
kubectl get pods
kubectl describe pod <pod_name>
따라서 파드 애플리케이션 로그를 디버깅하였다.
kubectl logs pod_name
엘라스틱 서치 레포를 빈으로 등록하지 못한 오류가 원인이였다.
접속 로그를 보니 ip주소:1 에 연결하는 것이 실패하였다고 나와있었다.
따라서 deployment manifast 파일의 env 적용 파일을 살펴보니 elasticsearch의 연결 Port를 잘못 입력하였던 것이었다. 이를 수정하고 재적용하였다.
kubectl apply -f deploy medeasy-spring-deployment.yaml
kubectl rollout restart deploy medeasy-spring-deployment.yaml
'Kubernetes' 카테고리의 다른 글
[k8s] DaemonSet (0) | 2025.02.20 |
---|---|
[k8s] Resource Requirements&limits (0) | 2025.02.20 |
[k8s] Node Affinity (0) | 2025.02.05 |
[k8s] Node Selector (0) | 2025.02.05 |
[k8s] Taint and Toleration 개념 (0) | 2025.02.05 |