
브리지 네트워크 – 같은 집 안의 내선전화
도커의 기본 네트워크 드라이버는 브리지(bridge)다. 사무실 내선전화에 비유하면 이해하기 쉽다. 같은 건물(호스트) 안에서는 내선번호(컨테이너 IP)로 바로 통화되지만, 외부에서 전화를 받으려면 대표 번호(호스트 IP)와 내선 연결(포트 매핑)이 필요하다. docker0 브리지 인터페이스가 가상 스위치 역할을 하고, 각 컨테이너는 veth 페어로 연결된다.
중요한 포인트가 하나 있다. 기본 브리지는 컨테이너 이름으로 통신이 안 된다. 반드시 사용자 정의 브리지 네트워크를 만들어야 이름 기반 DNS 통신이 가능하다. Docker Compose를 쓰면 자동으로 사용자 정의 네트워크가 만들어진다.
# 기본 브리지로 컨테이너 실행
docker run -d --name web nginx
docker run -d --name db mysql:8.0 -e MYSQL_ROOT_PASSWORD=secret
# 사용자 정의 브리지 생성 (DNS 이름 해결 가능)
docker network create --driver bridge mynet
docker run -d --name web --network mynet nginx
docker run -d --name db --network mynet mysql:8.0 \
-e MYSQL_ROOT_PASSWORD=secret
# 이름으로 통신 확인
docker exec web ping db
# 네트워크 상세 확인
docker network inspect mynet
# 포트 매핑으로 외부 접근
docker run -d -p 8080:80 --network mynet --name web2 nginx
호스트 네트워크 – 담장 없이 마당을 그냥 쓰는 방식
호스트 네트워크 모드는 컨테이너가 호스트의 네트워크 스택을 그대로 사용하는 방식이다. 단독주택에서 울타리를 치지 않고 마당을 공용으로 쓰는 것과 비슷하다. 컨테이너가 별도의 네트워크 공간을 갖지 않고 호스트 네트워크 공간을 공유하기 때문에, 포트 매핑 없이 바로 호스트 포트로 접근할 수 있다.
# 호스트 네트워크 모드로 실행
docker run -d --network host --name web nginx
# 호스트와 동일한 네트워크 인터페이스 확인
docker exec web ip addr
# 포트 매핑 없이 호스트 80번 포트로 직접 접근
curl http://localhost:80
쿠버네티스 파드 내부 통신 – 한 방에 룸메이트끼리 공유하는 구조
쿠버네티스 파드는 하나 이상의 컨테이너 묶음이다. 같은 파드 안의 컨테이너들은 네트워크 공간을 공유한다. 쉐어하우스 한 방을 여러 사람이 쓰는 것과 비슷하다. 방(파드) 안에서는 localhost로 서로 통신하고, 외부와는 방 IP(파드 IP)를 통해 대화한다. 이 구조 덕분에 사이드카 패턴이 가능하다.
사이드카 패턴이란 메인 앱 컨테이너 옆에 보조 역할의 컨테이너를 붙이는 방식이다. 로그 수집, 모니터링, 프록시 역할을 메인 앱을 건드리지 않고 추가할 수 있다. Istio나 Linkerd 같은 서비스 메시도 이 원리로 동작한다.
# 사이드카 패턴 파드 예시
apiVersion: v1
kind: Pod
metadata:
name: app-with-sidecar
spec:
containers:
- name: main-app
image: myapp:latest
ports:
- containerPort: 8080
- name: log-collector
image: fluentd:latest
env:
- name: APP_HOST
value: "localhost" # 같은 파드 = 같은 네트워크 공간
- name: APP_PORT
value: "8080"
# 파드 생성 및 IP 확인
kubectl apply -f pod.yaml
kubectl get pod app-with-sidecar -o wide
# 사이드카에서 메인앱으로 localhost 통신 확인
kubectl exec app-with-sidecar -c log-collector \
-- curl http://localhost:8080
쿠버네티스 서비스 – 전화번호부가 자동으로 업데이트되는 방식
파드는 IP가 계속 바뀐다. 스케일 인/아웃, 재시작마다 IP가 달라지는데, 어떻게 안정적으로 통신할까? 서비스(Service)가 그 해답이다. 직원(파드)이 바뀌어도 부서 대표 번호(서비스 ClusterIP)는 변하지 않는 자동 업데이트 전화번호부와 같다. kube-proxy가 iptables 또는 IPVS로 실제 파드로 트래픽을 분산한다.
# ClusterIP 서비스 (클러스터 내부 통신)
apiVersion: v1
kind: Service
metadata:
name: db-service
spec:
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
type: ClusterIP
---
# NodePort 서비스 (외부 접근, 개발/테스트용)
apiVersion: v1
kind: Service
metadata:
name: web-nodeport
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
nodePort: 30080
type: NodePort
---
# LoadBalancer 서비스 (클라우드 외부 접근)
apiVersion: v1
kind: Service
metadata:
name: web-lb
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
# 서비스 확인
kubectl apply -f service.yaml
kubectl get svc
kubectl get endpoints db-service
# DNS 이름으로 접근 테스트
kubectl run test-pod --image=busybox --rm -it \
-- wget -qO- http://db-service:3306
# 다른 네임스페이스에서 FQDN으로 접근
kubectl run test-pod --image=busybox --rm -it \
-- wget -qO- http://db-service.default.svc.cluster.local:3306
CNI 플러그인 – 다리를 어떻게 놓을지 선택하는 문제
쿠버네티스는 파드 간 네트워크 규격(CNI 인터페이스)만 정해두고, 실제 구현은 외부 플러그인에 맡긴다. 다리를 놔야 한다는 규격은 있는데, 현수교를 놓을지 아치교를 놓을지는 선택하는 것과 같다. 대표적인 CNI 플러그인으로는 Calico, Flannel, Cilium, Weave가 있다. 단순함이 필요하면 Flannel, 보안 정책이 중요하면 Calico, 고성능이 필요하면 Cilium을 고른다.
# Calico 설치
kubectl apply -f \
https://raw.githubusercontent.com/projectcalico/calico/v3.26.0/manifests/calico.yaml
# Calico 네트워크 정책: web 파드만 DB 접근 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: db-access-policy
namespace: default
spec:
podSelector:
matchLabels:
app: mysql
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: web
ports:
- protocol: TCP
port: 3306
# Cilium 설치 (Helm, eBPF 기반 고성능)
helm repo add cilium https://helm.cilium.io/
helm install cilium cilium/cilium \
--namespace kube-system \
--set kubeProxyReplacement=strict
# Cilium 상태 확인
cilium status
# Flannel 설치 (단순, 소규모 클러스터)
kubectl apply -f \
https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
마치며 – 컨테이너 네트워크는 모르면 블랙박스, 알면 정교한 시계
처음 쿠버네티스를 도입했을 때 네트워크 부분이 가장 무서웠다. 파드가 왜 통신이 안 되는지, 서비스가 왜 안 잡히는지 로그를 봐도 모르겠고 검색해도 내 상황에 맞는 답이 없었다. iptables 규칙을 직접 보고, veth 인터페이스를 따라가보고, CNI 로그를 뜯어보고 나서야 전체 그림이 보이기 시작했다.
지금은 브리지 문제인지, kube-proxy 문제인지, CNI 문제인지, DNS 문제인지 순서대로 좁혀가면 대부분 답이 나온다. 컨테이너 네트워크는 처음엔 블랙박스처럼 느껴지지만, 안을 들여다보면 정교하게 설계된 시계 부품 같다.
'IT적응기' 카테고리의 다른 글
| MTU(Maximum Transmission Unit) 최적화 패킷 크기 하나 바꿔서 네트워크 성능 올리는 4단계 (0) | 2026.04.18 |
|---|---|
| MTU 최적화 4단계– 현장 엔지니어의 패킷 크기 조정 가이드 (0) | 2026.04.18 |
| SDN 핵심 개념 4가지– 네트워크 자동화 현장 경험기 (0) | 2026.04.17 |
| SDN(소프트웨어 정의 네트워크)하드웨어 없이 네트워크를 바꾸는 기술 (0) | 2026.04.16 |
| VPC(Virtual Private Cloud)클라우드 안에 네트워크 만드는 법! (0) | 2026.04.16 |