반응형
1. 컨테이너 네트워크 모델 (Container Network Model)
과거의 포트 매핑 문제
도커와 같은 단일 컨테이너 실행 환경에서는 컨테이너 내부의 애플리케이션에 접근하려면 호스트의 특정 포트를 컨테이너의 포트와 매핑해야 했습니다. 예:
- 애플리케이션 컨테이너가 내부적으로 8080 포트를 사용한다고 가정.
- 외부에서 접근하려면 호스트 포트(예: 30000)를 컨테이너 포트(예: 8080)에 매핑해야 합니다:
docker run -p 30000:8080 my-app
문제점:
- 복잡한 관리
- 여러 컨테이너에서 동일한 포트를 사용하면 충돌이 발생할 수 있어, 포트를 수동으로 관리해야 함.
- 수십 개 이상의 컨테이너를 다룰 경우 포트 매핑이 복잡해짐.
- 동적 스케일링의 제약
- 컨테이너를 동적으로 생성하고 스케일링하려면, 각각의 새로운 컨테이너에 대한 포트 매핑을 따로 설정해야 함.
2. Kubernetes의 플랫 네트워크 구조
Kubernetes는 플랫 네트워크 모델을 사용하여 위의 문제를 해결합니다. 여기서 플랫 네트워크란, 모든 Pod와 컨테이너가 동일한 네트워크 공간에서 서로 직접 통신할 수 있는 구조를 의미합니다.
핵심 개념:
- Pod마다 고유한 IP 제공
- Kubernetes는 각 Pod에 고유한 IP 주소를 부여합니다. 이를 통해 Pod 내부의 컨테이너들은 별도의 포트 매핑 없이 서로 통신할 수 있습니다.
- 모든 Pod는 클러스터 네트워크 내에서 동등한 수준(플랫)으로 배치됩니다.
- 네트워크 플러그인 (CNI) 사용
- Kubernetes는 CNI(Container Network Interface) 플러그인을 사용해 클러스터 내부에서 네트워크를 가상화합니다.
- 주요 플러그인: Calico, Flannel, Weave, Cilium 등.
- 서비스 디스커버리와 로드 밸런싱
- Kubernetes는 Pod를 직접 호출하지 않고, Service를 통해 DNS 이름으로 접근합니다.
- Service가 Pod에 트래픽을 자동으로 분산하므로, 수동으로 포트를 지정하거나 매핑할 필요가 없습니다.
3. 포트 매핑 제거로 인한 이점
3.1 포트 충돌 제거
- 각 Pod가 자체적으로 IP와 포트를 가지고 있으므로, 호스트 레벨에서 포트를 일일이 매핑할 필요가 없습니다.
- 동일한 포트를 사용하는 여러 Pod가 클러스터에서 동시에 동작 가능.
3.2 동적 스케일링 지원
- 새로운 Pod가 추가되더라도 Kubernetes가 자동으로 Pod에 IP를 부여하고 네트워크에 연결하므로, 별도의 수작업 포트 매핑이 필요 없습니다.
3.3 관리 용이성
- 호스트에서 포트를 일일이 관리할 필요 없이, Kubernetes가 Pod와 Service 간 통신을 관리하므로 유지보수 비용이 줄어듭니다.
4. 플랫 네트워크 구조의 동작 방식
4.1 Pod 간 통신
- Pod들은 모두 클러스터 내부의 동일한 네트워크 공간에 존재하므로, 직접 IP를 통해 통신할 수 있습니다.
- 예: Pod A(10.244.0.1)와 Pod B(10.244.0.2)는 동일한 네트워크 상에 있으므로 10.244.0.2로 바로 통신 가능.
4.2 외부 통신
외부에서 Pod로 접근하기 위해 Kubernetes는 추가적인 추상화 계층을 제공합니다:
- ClusterIP: 클러스터 내부에서만 접근 가능한 가상 IP 생성.
- NodePort: 호스트의 고정 포트를 통해 외부 접근 허용.
- LoadBalancer: 클라우드 제공자를 통해 외부 접근용 로드 밸런서를 생성.
- Ingress: HTTP/HTTPS 요청을 특정 Service로 라우팅.
5. 구체적인 예: 포트 매핑 없이 애플리케이션 실행
도커 방식:
docker run -p 30000:8080 my-app
- 호스트의 30000 포트를 컨테이너의 8080 포트에 매핑.
Kubernetes 방식:
- Pod 정의:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app-container
image: my-app:latest
ports:
- containerPort: 8080
- Service 정의:
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
- 클러스터 내부에서 my-app-service 이름으로 서비스에 접근 가능.
- 포트 매핑(호스트 포트 ↔ 컨테이너 포트)을 수동으로 지정할 필요 없음.
6. 요약
- Kubernetes는 플랫 네트워크 구조를 통해 Pod와 컨테이너 간 통신을 간소화합니다.
- Pod마다 고유한 IP를 부여하며, 네트워크 가상화를 통해 컨테이너 간 통신에서 호스트 포트 매핑을 제거.
- 결과적으로 포트 충돌 문제를 없애고, 관리 및 유지 비용을 줄이며, 스케일링과 동적 배포가 쉬워집니다.
반응형
'K8S' 카테고리의 다른 글
pause container가 먼저 실행되는 이유가 뭘까나? (0) | 2024.12.16 |
---|---|
[k8s] liveness probe, readiness probe, startup probe (0) | 2024.12.15 |
[kubernetes] ingress controller - nginx 업그레이드 (0) | 2024.12.09 |
[kubernetes] 에러 Incompatible platform detected If this is a gpu node, did you configure the nvidia container toolkit (0) | 2024.12.09 |
[kubernetes] Backoff pulling image에러 원인과 해결책 (1) | 2024.12.09 |
댓글