DevOps/Kubernetes

[Kubernetes] ContainerCreating 상태 깊이 있게 이해하기

Jflip 2024. 11. 19. 23:57
728x90

Kubernetes 클러스터를 운영하다 보면 종종 "ContainerCreating" 상태에 머물러 있는 파드(Pod)를 마주치게 됩니다.
이 상태는 단순해 보이지만, 실제로는 다양한 복잡한 메커니즘과 잠재적 문제들을 내포하고 있습니다.

Kubernetes Pod 생성 워크플로우

1. Pod 생성 요청

Kubernetes 클러스터에 Pod 생성을 요청하면 다음과 같은 순차적인 프로세스가 시작됩니다:

  1. API Server 요청:
    • 사용자나 컨트롤러가 API Server에 Pod 생성 요청
    • YAML/JSON 매니페스트 파일을 통해 Pod 스펙 정의
  2. Scheduler 개입:
    • API Server는 스케줄러에게 Pod 배치 요청
    • 노드 선택 기준
      • 리소스 가용성
      • 노드 선택자(nodeSelector)
      • 어피니티/안티 어피니티 규칙
      • 테인트와 톨러레이션
  3. 노드 선택 및 바인딩:
    • 적절한 노드 결정
    • Pod를 특정 노드에 바인딩
    • kubelet에 컨테이너 생성 지시

2. ContainerCreating 상세 분석

이미지 다운로드 단계

  • Container Runtime Interface(CRI)를 통해 이미지 풀
  • 기본 이미지 풀 정책
    • Always: 항상 레지스트리에서 새 이미지 다운로드
    • IfNotPresent: 로컬에 없는 경우만 다운로드
    • Never: 로컬 이미지만 사용

잠재적 이미지 다운로드 문제

  1. 네트워크 연결 이슈
    • 외부 레지스트리 접근 실패
    • 프록시 설정 오류
    • 방화벽 제한
  2. 인증 메커니즘
    • 프라이빗 레지스트리 자격증명 문제
    • 토큰 만료
    • 잘못된 보안 설정

3. 리소스 제약 조건

CPU/Memory 할당

  • 노드의 가용 리소스 부족
  • ResourceQuota 및 LimitRange 설정
  • 컨테이너 리소스 요청/제한 값 검증

디스크 공간

  • 이미지 저장을 위한 충분한 디스크 공간 필요
  • 오래된/사용하지 않는 이미지 정리 중요

4. 볼륨 및 마운트 복잡성

볼륨 프로비저닝 단계

  • PersistentVolumeClaim(PVC) 바인딩
  • 스토리지 클래스 동적 프로비저닝
  • 호스트 볼륨 마운트

일반적인 볼륨 관련 장애

  • 스토리지 백엔드 연결 문제
  • 권한 및 fsGroup 설정 오류
  • 존재하지 않는 스토리지 클래스

문제 해결 전략

진단 도구 및 명령어

# 상세 Pod 정보 확인
kubectl describe pod <pod-name>

# 이벤트 로그 분석
kubectl get events

# 컨테이너 로그 확인
kubectl logs <pod-name>

# 노드 리소스 상태 점검
kubectl describe node <node-name>

모범 사례

  1. 이미지 관리
    • 경량 베이스 이미지 사용
    • 이미지 캐싱 전략
    • 레지스트리 미러링
  2. 리소스 최적화
    • 정확한 리소스 요청/제한 설정
    • 수직/수평 팟 오토스케일러 활용
    • 클러스터 오토스케일링
  3. 모니터링 및 로깅
    • Prometheus, Grafana 등 모니터링 도구 도입
    • ELK 스택을 통한 중앙집중식 로깅
    • 이상 징후 조기 탐지

결론

ContainerCreating 상태는 단순한 대기 상태가 아니라, Kubernetes의 복잡한 컨테이너 오케스트레이션 프로세스를 보여주는 창구입니다.
세부 메커니즘을 이해하고 체계적인 접근 방식을 통해 안정적이고 효율적인 클러스터 운영이 가능합니다.

728x90
반응형