EKS 클러스터에 kubectl apply 명령을 사용하여 Deployment와 Service를 생성한 후, kubectl get pods를 통해 확인했을 때, Pod의 상태가 ContainerCreating으로 표시되고 실행이 불가능했다.
antraxmin@imchaemin-ui-MacBookPro k8s-ssh-server % kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
k8s-ssh-server 0/2 2 0 7s
antraxmin@imchaemin-ui-MacBookPro k8s-ssh-server % kubectl get pods
NAME READY STATUS RESTARTS AGE
k8s-ssh-server-55779b86c6-s5mpw 0/1 ContainerCreating 0 17s
k8s-ssh-server-55779b86c6-s6rld 0/1 ContainerCreating 0 17s
Pod이 계속 ContainerCreating 상태에 머물러 있는 문제를 해결하기 위해 단계별로 원인을 분석하고자 했다.
1. Pod 상태 확인 및 문제 원인 분석
Pod 상태가 ContainerCreating으로 표시되는 자세한 원인을 확인하기 위해 kubectl describe pod 명령을 실행하였다.
kubectl describe pod <POD_NAME>
describe 명령 출력을 통해 다음과 같은 상태를 확인할 수 있었다.
- State: Waiting / CrashLoopBackOff - Pod 내 컨테이너가 시작되지 못하고 CrashLoopBackOff 상태에 빠져 있음
- Last State: Terminated / Reason: Error - 컨테이너가 이전 실행에서 종료되었으며, 종료 이유가 Error로 표시됨
- Exit Code: 1 - 컨테이너 실행 중 에러로 인해 종료됨
추가적으로 이벤트 로그에서 컨테이너가 반복적으로 재시작되는 문제를 발견하였다.. 아마 컨테이너 초기 실행 중에 발생하는 에러 때문인 듯 하다.
2. 컨테이너 내부 문제 확인
Pod이 CrashLoopBackOff 상태에 빠진 이유를 확인하기 위해 Pod 내부 컨테이너의 실행 로그를 확인했다.
Error: Missing required environment variable: REQUIRED_ENV_VAR
로그에는 애플리케이션이 실행 도중 특정 환경 변수를 찾을 수 없다는 오류 메시지가 포함되어 있었다. Pod의 상세 설정을 확인한 결과, 필요한 환경 변수가 제대로 설정되지 않았다.
현재 환경 변수를 .env 파일로 분리하여 관리하고 있었는데, 이 환경 변수가 Deployment 설정에 제대로 적용되지 않은 것 같았다. 안타깝게도 kubectl은 .env 파일을 직접 인식하지 못하기 때문에 환경 변수를 Deployment 설정에 명시적으로 추가하지 않으면 컨테이너 실행 시 필요한 환경 변수가 누락된다는 것을 알게 되었다. 일반적으로는 ConfigMap이나 Secret을 통해 관리한다고 한다.
3. ConfigMap으로 환경 변수 관리
kubectl create configmap k8s-ssh-server-env --from-env-file=.env
.env 파일의 내용을 기반으로 ConfigMap을 생성하고 deployment.yaml에서 ConfigMap을 참조하도록 수정하였다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-ssh-server
spec:
replicas: 2
selector:
matchLabels:
app: k8s-ssh-server
template:
metadata:
labels:
app: k8s-ssh-server
spec:
containers:
- name: k8s-ssh-server
image:
ports:
- containerPort: 2222
envFrom:
- configMapRef:
name: k8s-ssh-server-env
deployment.yaml을 다시 적용하고 Pod 상태를 확인했더니 잘 된다..!
'Kubernetes' 카테고리의 다른 글
Kubernetes 클러스터의 OIDC 제공자를 AWS 계정과 연결하기 (1) | 2024.12.09 |
---|---|
멀티스테이지 빌드를 통한 EKS와 Docker 아키텍처 불일치 오류 해결 (0) | 2024.12.09 |
Kubernetes Service의 EXTERNAL-IP 미할당 문제 해결하기 - NodePort와 LoadBalancer는 어떤 차이가 있을까? (0) | 2024.12.09 |
EKS 클러스터 인증 문제 해결하기 - IAM Authenticator (1) | 2024.12.08 |