현대 오토에버 클라우드 스쿨
K8S 프로젝트 중) 포트 개념 정리
Gom3rye
2025. 9. 17. 16:45
728x90
반응형
이름 정의 위치 의미 예시
| containerPort | Pod의 컨테이너 내부 | 애플리케이션이 리슨하는 실제 포트 | 9100 (Node Exporter가 여는 포트) |
| hostPort | Pod 사양 (spec) | 이 포트를 노드에 바인딩해서 외부에 노출 | 9100 (선택 사항) |
| port | Service 정의 | 클러스터 내부에서 사용하는 서비스 포트 | 9100 |
| targetPort | Service 정의 | 해당 Service가 Pod의 어떤 포트로 연결할지 | 9100 |
🔍 예시로 설명 (Node Exporter 기준)
🧱 Pod (DaemonSet) 내부:
containers:
- name: node-exporter
image: ...
ports:
- name: metrics
containerPort: 9100
hostPort: 9100
항목 설명
| containerPort: 9100 | Node Exporter는 컨테이너 내부에서 9100 포트를 열고 대기 중 |
| hostPort: 9100 | 이 포트를 노드의 9100 포트와 바인딩 → 외부에서 노드 IP로 접근 가능 |
즉, Node Exporter는:
✅ 컨테이너 내부: localhost:9100
✅ 호스트(노드) IP: <노드IP>:9100
✅ (외부에서 직접 접근 가능)
🧰 Service 정의:
spec:
clusterIP: None
ports:
- name: metrics
port: 9100
targetPort: 9100
항목 설명
| port: 9100 | 클러스터 내부에서 이 서비스로 접근할 때 사용하는 포트 |
| targetPort: 9100 | 실제 Pod 내부에서 노출된 포트 (containerPort)와 연결됨 |
💡 이 설정은:
- http://<서비스명>:9100/metrics 로 접근하면
- Service가 해당 요청을 targetPort: 9100 → Pod의 containerPort: 9100 으로 라우팅합니다.
🧠 질문으로 돌아가서:
http://<pod-ip>:9100/metrics
이 경로에서 9100은 port야? targetPort야?
✅ 정답: 이 9100은 containerPort, 즉 Pod 내부에서 실제로 열려 있는 포트입니다.
🔄 관련 개념 시각화
[ Prometheus ] --(http)--> [ Service:9100 ] --(forward to)--> [ Pod targetPort:9100 → containerPort:9100 ]
↘ (headless)
[ Pod IP:9100 ]
- 일반적으로는 Service의 port 를 통해 접근
http://<service-name>:9100/metrics - Headless Service일 경우엔 Pod IP로 직접 접근
http://<pod-ip>:9100/metrics
🎯 요약 다시 정리
용어 설명 Node Exporter 예시
| containerPort | 컨테이너 내부에서 서비스가 열어둔 포트 | ✅ 9100 |
| hostPort | 컨테이너의 포트를 노드의 포트에 바인딩 | 9100 (있을 수도, 없을 수도) |
| port (in Service) | 서비스가 노출하는 포트 | 9100 |
| targetPort (in Service) | 서비스가 실제로 트래픽을 전달할 포트 | 9100 |
| http://<pod-ip>:9100 | 실제로는 containerPort 를 직접 사용하는 것 | ✅ Yes |
Q: 꼭 hostPort가 있어야 하나요?
A: ❌ 아닙니다. Prometheus가 Pod IP로 직접 접속하거나, Service를 통해 접근하면 hostPort는 필요 없습니다.
하지만 노드의 IP로 직접 접근해야 하는 경우에는 hostPort 설정이 필요합니다.
✅ Pod > Container
Pod가 더 큰 개념이고,
Container는 Pod 안에 들어 있는 구성 요소 중 하나예요.
🧩 개념 비교
항목PodContainer
| 위치 | Kubernetes의 기본 배포 단위 | Pod 내부의 실행 단위 |
| 구성 | 하나 이상의 컨테이너 + 볼륨 + 네트워크 등 | 실제로 애플리케이션이 실행되는 단위 |
| 네트워크 | Pod 단위로 IP와 포트를 가짐 | 같은 Pod의 컨테이너끼리는 localhost 공유 |
| 스케줄링 | Kubernetes가 Pod 단위로 배치 | 컨테이너는 Pod 안에서 실행됨 |
| 공유 자원 | Pod 내 컨테이너끼리 네트워크, 볼륨 공유 | 독립된 프로세스 공간 사용 |
🎯 시각화로 보기
Kubernetes Node
├── Pod A (IP: 10.0.0.1)
│ ├── Container A1
│ └── Container A2
│
├── Pod B (IP: 10.0.0.2)
│ └── Container B1
│
└── Pod C (IP: 10.0.0.3)
└── Container C1
- 하나의 Pod는 보통 1개 컨테이너만 포함하지만,
- 필요할 경우 여러 개의 컨테이너를 함께 배포할 수도 있어요. (e.g. main + sidecar)
728x90
반응형