728x90
반응형
Troubleshooting
CI/CD 파이프라인을 만들다 보면 다양한 에러를 마주하게 됩니다.
아래는 제가 실제로 마주쳤던 문제들과 해결 방법을 정리한 리스트입니다.
1. ❌ ImagePullBackOff
현상
kubectl get pods
# STATUS: ImagePullBackOff
원인
- Kubernetes가 컨테이너 이미지를 GHCR (private registry) 에서 가져오지 못함
해결 방법
- GHCR Personal Access Token을 만들 때
read:packages권한 포함했는지 확인 - Kubernetes Secret 생성
kubectl create secret docker-registry ghcr-secret \ --docker-server=ghcr.io \ --docker-username=<USERNAME> \ --docker-password=<TOKEN> \ --docker-email=nonevalues-dev.yaml또는 Deployment에imagePullSecrets추가imagePullSecrets: - name: ghcr-secret
2. ❌ failed to authorize: failed to fetch anonymous token
현상
failed to authorize: failed to fetch anonymous token: unexpected status from GET request
원인
- Kubernetes가 인증 없이 GHCR 접근을 시도함 (Secret 누락)
해결 방법
- 2번과 같이
ghcr-secret을 생성하고, Helm values에 반영
3. ❌ nil pointer evaluating interface {}.image
현상
executing "image-gallery/templates/backend-deployment.yaml" at <.Values.backend.image>: nil pointer evaluating interface {}.image
원인
values.yaml에backend.image또는frontend.image값이 빠져 있음
해결 방법
values-dev.yaml값이 잘 정의되어 있는지, helm 에 잘 주입되었는지 확인backend: image: ghcr.io/<USERNAME>/backend tag: latestfrontend: image: ghcr.io/<USERNAME>/frontend tag: latest
4. ❌ helm upgrade ... path not found
현상
Error: path "./helm/image-gallery" not found
원인
- Jenkins workspace와 실제 Helm Chart 경로가 다름
해결 방법
- Jenkinsfile에서 Helm 실행 시 경로 지정하거나 main 브랜치로 check out 하기
dir('helm/image-gallery') { sh "helm upgrade --install image-gallery . -f values-dev.yaml" }
5. ❌ Unsplash API Key 전달 문제
현상
- Docker build 시
--build-arg로 API Key를 전달 → 배포 후 Pod에서 값이 없음
해결 방법
- Kubernetes Secret 사용
kubectl create secret generic unsplash-secret \ --from-literal=ACCESS_KEY=<UNSPLASH_KEY>- Helm 템플릿에 환경변수 주입
env:- name: UNSPLASH_ACCESS_KEYvalueFrom: secretKeyRef:name: unsplash-secretkey: ACCESS_KEY
6. ❌ 포트 접근 불가
현상
- 브라우저에서 프론트엔드/백엔드 접근이 안 됨
원인
- Service 타입이
ClusterIP라 외부 접근 불가
해결 방법
- 로컬 테스트 시 포트포워딩
kubectl port-forward svc/image-gallery-frontend 3000:80kubectl port-forward svc/image-gallery-backend 8000:8000- 이후 브라우저에서
http://localhost:3000/http://localhost:8000확인
7. ❌ ADDRESS가 비어 있음 / <none> 표시 (Ingress)
- 현상
NAME CLASS HOSTS ADDRESS PORTS AGE
image-gallery-backend-ingress <none> myapp.local 80 67s
image-gallery-frontend-ingress <none> myapp.local 80 67s
- 원인
- Ingress 리소스가 제대로 ingressClassName을 지정하지 않아서 발생하는 상황
- ingress-nginx 컨트롤러는 특정 Ingress 리소스를 처리하기 위해 ingressClassName 필드를 사용하는데, 이 필드가 없으면 Ingress 컨트롤러는 어떤 Ingress를 처리해야 할지 모르기 때문에 IP 주소를 할당하지 않는다.
- Minikube NGINX Ingress Controller가 이 리소스를 처리하지 않음
- 해결 방법
- 각 Ingress YAML에 spec.ingressClassName: nginx 추가
- spec: ingressClassName: nginx
- 각 Ingress YAML에 spec.ingressClassName: nginx 추가
✅ 정리
- ImagePullBackOff → GHCR 인증 문제 →
ghcr-secret생성 & Helm values에 반영 - failed to authorize → Secret 누락 →
imagePullSecrets확인 - nil pointer → values.yaml에
image값 빠짐 →values-dev.yaml수정 - path not found → Jenkins workspace 경로 문제 →
dir('helm/image-gallery')사용 - API Key 전달 문제 → Docker build-time 전달 ❌, Kubernetes Secret ✅
- 포트 접근 문제 →
ClusterIP는 직접 접근 불가 → 포트포워딩 사용 - Ingress Address 비어 있음 → 각 Ingress YAML에 spec.ingressClassName 설정
728x90
반응형
'Side Project' 카테고리의 다른 글
| React+Flask 어플리케이션: 코드부터 Jenkins 배포까지 (CI/CD) - 3 (Ingress 활용하기) (0) | 2025.09.07 |
|---|---|
| React+Flask 어플리케이션: 코드부터 Jenkins 배포까지 (CI/CD) - 2 (2) | 2025.09.04 |
| Jenkins 배포 중 마주한 에러들과 해결방법 (0) | 2025.09.04 |
| React+Flask 어플리케이션: 코드부터 Jenkins 배포까지 (CI/CD) - 1 (0) | 2025.09.04 |
| Docker compose로 MongoDB 사용하기 (Mac) (2) | 2024.11.19 |