현대 오토에버 클라우드 스쿨

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
반응형