본문 바로가기
Kubernetes

EKS 클러스터에서 Deployment 및 Service 생성 문제 해결하기

by Antraxmin 2024. 12. 8.

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>

kubectl describe pod 명령 실행 결과

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 상태를 확인했더니 잘 된다..!