Kubernetes 네트워크 및 스토리지

개요

동적으로 생성되고 소멸하는 Pod들에게 변하지 않는 네트워크 엔드포인트를 제공하고, 컨테이너가 삭제되어도 데이터베이스 등의 데이터를 안전하게 유지하기 위한 영구 스토리지 관리 방법을 다룹니다.

1. K8s 네트워크 (Service & Ingress)

Pod의 IP는 생성될 때마다 매번 바뀝니다. 따라서 애플리케이션 간 통신 시 Pod IP를 직접 하드코딩해서 접근할 수 없으며, ‘Service’라는 논리적 대상을 통해 접근해야 합니다.

1.1 네트워크 계층 관점 (OSI 7 Layer)

  • L3/L4 (네트워크/전송 계층) - CNI 및 Service:
    • ClusterIP: 클러스터 내부의 다른 Pod에서만 접근할 수 있는 기본 로드밸런싱 서비스입니다. (L4)
    • NodePort: 모든 워커 노드의 특정 포트(예: 30080)를 열어 클러스터 외부의 트래픽을 내부로 받습니다. (L4)
    • LoadBalancer: AWS, GCP 등 클라우드 환경의 로드밸런서(NLB 등)를 자동으로 프로비저닝하여 서비스와 연결합니다. (L4)
  • L7 (응용 계층) - Ingress:
    • HTTP/HTTPS URI 경로 분석, SSL/TLS 인증서 종료(Termination), 도메인 기반 가상 호스팅을 담당합니다.
    • 단일 클라우드 로드밸런서의 진입점을 통해 /api 요청은 백엔드 서비스로, /web 요청은 프론트엔드 서비스로 스마트하게 라우팅합니다.

1.2 구현 도구

구분주요 오픈소스 및 플러그인
CNI (컨테이너 간 네트워크 통신)Calico, Flannel, Cilium
Ingress ControllerNginx Ingress, Traefik, HAProxy

2. K8s 스토리지 (PV & PVC)

컨테이너 내부의 파일 시스템은 일시적입니다. Pod가 재시작되면 내부 데이터는 모두 삭제되므로, 데이터 보존이 필수적인 서비스는 K8s의 볼륨 시스템을 사용합니다.

2.1 스토리지 모델 분리

  • PV (PersistentVolume): 인프라 관리자가 클러스터에 프로비저닝한 물리적 스토리지의 논리적 조각입니다. (예: AWS EBS 볼륨, NFS 스토리지)
  • PVC (PersistentVolumeClaim): 사용자가 PV에 스토리지를 요청하는 문서입니다. 필요한 용량(예: 10GB)과 접근 모드(ReadWriteOnce 등)를 명시하여 요청하면 적합한 PV와 바인딩(Binding)됩니다.
  • StorageClass: 관리자가 일일이 PV를 만들지 않아도, 사용자가 PVC를 요청할 때 클라우드 API를 호출해 자동으로 PV(디스크)를 생성해주는 동적 프로비저닝 규칙입니다.

3. 실제 적용 예시

대고객 웹 서비스 외부 노출 아키텍처

  1. 인프라 엔지니어가 Nginx 컨테이너를 포함한 Deployment를 배포합니다.
  2. K8s 내부에 ClusterIP 타입의 Service를 생성하여 Nginx Pod들을 묶고 단일 내부 IP를 부여합니다.
  3. Ingress 오브젝트를 생성하여 www.myservice.com 도메인으로 들어오는 HTTP(L7) 트래픽을 앞서 만든 Nginx Service로 연결하도록 라우팅 규칙을 작성합니다.
  4. 사용자가 웹 브라우저로 해당 도메인에 접속하면, 트래픽은 Ingress Controller -> Service -> 안정적인 Pod 중 하나 순서로 라우팅되어 응답을 반환합니다.