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