Docker Compose에서 Kubernetes 전환 시 Pod 통신 오류와 인그레스 설정 해결법
Docker Compose 환경에서 잘 돌아가던 앱을 서버 확장을 위해 Kubernetes로 옮겼다가 Pod 네트워크 연결이 끊기고 DB 연결 실패 오류가 발생해 당황하셨을 겁니다. 단순 컨테이너 실행 도구와 분산 오케스트레이터의 동작 방식 차이를 명확히 모르면, YAML 파일을 옮겨 적는 과정에서 서비스 디스커버리 failure나 IP 바인딩 꼬임 현상이 무조건 터집니다. 이것 때문에 저도 설정 파일만 수십 번 고쳐가며 밤을 새웠는데, 찾아보니 가장 헷갈리는 지점이 바로 네트워크 라우팅 레이어였습니다. 이 글에서는 Docker 단독 실행과 Kubernetes 환경의 실무적 차이를 명확히 정리하고, 마이그레이션 과정에서 자주 막히는 통신 오류 해결 절차와 2026년 최신 버전 스펙 기준을 한눈에 알기 쉽게 설명해 드립니다.
Docker와 Kubernetes의 역할 차이 및 최신 런타임 환경 (2026 기준)
처음 컨테이너 기술을 접할 때 가장 혼란스러운 점이 'Kubernetes를 쓰면 Docker는 버리는 것인가'하는 의문입니다. 결론부터 말씀드리면 Docker는 단일 호스트에서 애플리케이션을 격리하고 이미지로 패키징하는 '컨테이너 런타임 및 빌드 도구'이고, Kubernetes는 여러 대의 서버(노드)를 하나의 거대한 자원 풀로 묶어 컨테이너의 배치·배포·오토스케일링·복구를 자동 제어하는 '오케스트레이션 플랫폼'입니다. 두 기술은 대립 관계가 아니라 상호보완적 샌드위치 관계에 가깝습니다.
- Docker Engine v29.0(2026년, Docker 공식 발표): OCI 표준 Image Store를 기본 채택하여 이미지 빌드 및 단일 실행 성능 대폭 향상
- Kubernetes v1.36.4(2026년 8월, CNCF 공식 발표): Dockershim 완전 제거 이후 containerd 런타임을 통해 OCI 이미지 직접 오케스트레이션
- Docker Compose: 단일 호스트 내 멀티 컨테이너 데몬 실행 전용 (멀티 노드 분산 및 무중단 복구 불가)
- Kubernetes: 멀티 노드 클러스터 오토스케일링(HPA), self-healing(사망한 Pod 자동 재생성), 로드밸런싱 전용
Docker Compose에서 Kubernetes 전환 시 막히는 Pod 네트워크 통신 해결 단계
Docker Compose에서는 서비스 이름(예: `db:5432`)이 단순 브릿지 네트워크 DNS로 자동 해석되지만, Kubernetes는 Pod마다 고유 IP가 할당되고 Pod가 재시작될 때마다 IP가 바뀝니다. 따라서 Compose의 `depends_on`을 믿고 K8s Manifest를 그대로 배포하면 DB가 준비되기 전에 웹 앱이 먼저 실행되어 `CrashLoopBackOff` 오류에 빠집니다. 찾아보니 은근히 많은 분들이 이 가상 IP(ClusterIP) 디스커버리 매핑 단계에서 막히곤 합니다.
- 1단계: Docker Compose의 Service 네이밍을 Kubernetes ClusterIP 타입의 Service 객체로 수동 정의하여 고정 가상 IP를 할당합니다.
- 2단계: 앱 컨테이너의 환경 변수 DB Host 값을 단순 서비스명이 아닌 K8s 내부 DNS 풀네임(예: `my-db-service.default.svc.cluster.local`)으로 수정합니다.
- 3단계: DB 인스턴스의 준비 완료 상태를 확인하도록 앱 Pod Manifest에 `initContainers` 설정이나 `readinessProbe` 조항을 추가하여 시퀀스 꼬임 문제를 예방합니다.
- 4단계: 외부 트래픽을 Pod 내부 포트로 전달하기 위해 NGINX Ingress Controller 또는 Gateway API를 설치하고 80/443 라우팅 규칙을 바인딩합니다.
단일 Docker 서버 vs 관리형 Kubernetes 운영 인프라 예상 비용 비교
Kubernetes로 이전하면 인프라 안정성은 극대화되지만 제어판(Control Plane) 유지비와 복잡도 증가로 인한 기본 운영비가 상승합니다. 독자 여러분의 이해를 돕기 위해 AWS Cloud 환경에서 동일한 웹 서비스를 운영할 때 발생하는 1년 기준 운영 비용 예시를 직접 대입하여 비교표로 정리했습니다.
| 비교 항목 | 단일 Docker Compose (AWS EC2) | 관리형 Kubernetes (AWS EKS, 3노드) |
|---|---|---|
| 기본 제어판 비용 | 0원 (단일 VM 내 실행) | 월 $73 / 연 약 1,050,000원(2026년, AWS 공식 발표) |
| 노드 컴퓨팅 자원 (t3.medium 2개 기준) | 월 $60 / 연 약 864,000원(2026년, AWS 공식 발표) | 월 $90 / 연 약 1,296,000원(2026년, AWS 공식 발표) |
| 네트워크 / Ingress LB 비용 | 기존 ALB 1개 (월 약 25,000원) | EKS ALB Ingress Controller (월 약 35,000원) |
| 예상 연간 총 인프라 비용 | 약 1,164,000원(2026년, AWS 산정 기준) | 약 2,766,000원(2026년, AWS 산정 기준) |
프로젝트 규모별 Docker 단독 실행 vs Kubernetes 도입 판단 기준
모든 시스템에 Kubernetes가 정답은 아닙니다. 노드가 1~2개 수준인 초기 스타트업이나 내부 전산 도구에 Kubernetes를 무작정 적용했다가 오버헤드로 인해 인프라 관리에만 시간을 다 빼앗기는 사례가 비일비재합니다. 실제 시스템 상황에 따라 어느 플랫폼을 선택하는 것이 유리한지 가이드라인을 제공합니다.
- Docker Compose 추천 환경: 트래픽 변동폭이 적고 서버 1~2대로 충분한 경우, 개발 환경 로컬 테스트, 인프라 전담 엔지니어가 없는 중소규모 팀
- Kubernetes 추천 환경: 24시간 무중단 배포(Rolling Update, Canary)가 필수가 된 시스템, 동시 접속자가 급증하여 HPA 오토스케일링이 필요한 경우, 복수의 Microservice(MSA)가 복잡하게 얽혀있는 구조
Kubernetes v1.36+ 최신 변경 사항과 Static Pod 제약
이전 Kubernetes 구버전(v1.32 이하) 가이드북이나 옛날 블로그 글만 보고 마이그레이션을 진행하면 최신 클러스터 배포 시 빌드 오류를 겪게 됩니다. 2026년 최신 Kubernetes v1.36.4(2026년 8월, CNCF 공식 발표) 및 v1.37 패치에서는 보안 정책과 명령어 제약이 강화되었습니다.
- Static Pod API 참조 금지: Static Pod에서 `configMapRef`나 `secretRef`를 직접 참조하여 설정값을 불러오는 방식이 전면 금지(v1.37 공식 반영)되었습니다.
- kubectl run --filename/-f 매개변수 Deprecated: `kubectl run` 명령으로 YAML 파일을 지정해 Pod를 일회성으로 생성하던 방식이 폐지 예정 단계에 진입했으므로 `kubectl apply -f`를 표준으로 사용해야 합니다.
- CoreDNS 처리 성능 고도화: CNI 플러그인의 IPAM 할당 정책 표준화로 기존 구형 Flannel CNI 사용 시 Calico 또는 Cilium으로의 업그레이드가 강력 권장됩니다.
자주 막히는 지점
- Docker Compose의 depends_on 조건만 믿고 Kubernetes Pod를 배포했을 때, DB 컨테이너의 포트가 완전히 오픈되기 전 앱 Pod가 실행되어 발생되는 ErrImagePull 및 CrashLoopBackOff 연쇄 재시작 오류 문제
- Kubernetes v1.36+ 및 v1.37 최신 환경에서 Kubelet의 Static Pod 작성 시 ConfigMapRef 또는 SecretRef를 직접 참조하여 Pod 생성이 즉시 거부되는 Forbidden Static Pod API Reference 오류
체크리스트
- 현재 운영 중인 서비스 노드 수가 3개 이상이고 HPA 기반 자동 확장이 필수인지 확인
- Docker Engine v29.0 및 containerd 런타임 간 OCI 이미지 빌드 상호 호환성 확인
- Kubernetes v1.36.4 최신 패치 버전에 맞춘 Control Plane 및 CNI 네트워크 상태 검증
- Docker Compose의 단일 bridge 네트워크 환경을 K8s ClusterIP 및 Ingress 로드밸런서로 재설계 완료 여부
- 앱 Manifest 내 DB 접속 주소가 IP가 아닌 CoreDNS 서비스 풀네임으로 지정되어 있는지 점검
- Static Pod Manifest 작성 시 Secret/ConfigMap API 직접 참조 구문이 제거되었는지 확인
오해하기 쉬운 정보
- Kubernetes가 Docker를 완전 대체했으므로 Docker 기술은 필요 없다: Kubernetes는 OCI 표준 컨테이너를 관리하는 오케스트레이터이며, Docker는 컨테이너 빌드 및 OCI 이미지를 만드는 핵심 도구로 여전히 공존합니다.
- Docker Compose만으로도 Multi-Node 대규모 무중단 배포를 완벽 대체할 수 있다: Docker Compose는 단일 호스트 내 multi-container 제어용이며, 여러 물리 노드 간의 하드웨어 장애 대응 및 Self-healing은 Kubernetes의 고유 역할입니다.
- Kubernetes 클러스터를 도입하면 무조건 서버 운영비가 절감된다: 제어판(Control Plane) 가상 노드 비용과 Ingress 로드밸런서 추가로 인해 소규모 애플리케이션에서는 단일 Docker 서버 운영 대비 최소 2~3배 이상의 인프라 비용이 증가합니다.
Docker Compose에서 잘 작동하던 서비스가 Kubernetes로 넘어가면서 네트워크 통신 장애로 막혔을 때 밤을 새워가며 트러블슈팅했던 답답함이 떠오릅니다. 두 기술은 상충되는 라이벌이 아니라 시스템 규모와 성숙도에 따라 단계별로 도입하는 짝꿍 기술입니다. 오늘 소개해 드린 최신 스펙 및 CNI 네트워크 전환 가이드를 적용하여 시행착오 없이 안전하고 매끄러운 컨테이너 마이그레이션을 완성하시길 바랍니다.
핵심 요약
- Docker는 컨테이너 패키징 및 단일 실행 엔진이며, Kubernetes는 멀티 노드 컨테이너 분산 관리 플랫폼이다.
- 공식 스펙 기준 최신 버전은 Docker Engine v29.0(2026년, Docker 공식 발표) 및 Kubernetes v1.36.4(2026년 8월, CNCF 공식 발표)이다.
- Docker Compose에서 K8s로 마이그레이션 시 단순 서비스명이 아닌 ClusterIP 기반 K8s Service 및 CoreDNS 매핑이 필수적이다.
- 소규모 단일 서버는 Docker Compose가 가성비가 높으며, 3노드 이상 무중단 확장 서비스는 Kubernetes가 유리하다.
- Kubernetes v1.36+ 버전부터는 Static Pod 내 Secret/ConfigMap API 직접 참조가 금지되는 등 보안 정책이 강화되었다.
#Docker #Kubernetes #컨테이너오케스트레이션 #DockerVsKubernetes #DevOps #클라우드인프라 #Kubernetes136