Gom3rye
팀 프로젝트) Grafana, Prometheus를 웹으로 접근할 때 포트 붙이는 여부 본문
☁️ [EKS] Grafana 접속 시 :3000을 붙여야 하는 이유와 포트 매핑 구조 완전 정리
AWS EKS 환경에 Grafana를 배포하다 보면 이런 상황을 한 번쯤 겪는다.
“왜 URL 뒤에 :3000을 붙여야만 접속이 되지?”
“어떤 설정을 하면 그냥 IP만 입력해도 바로 Grafana에 접속할 수 있을까?”
이 글에서는 그 이유와 해결 방법을 Grafana Service 구조를 중심으로 자세히 정리했다.
🧩 1️⃣ Grafana의 기본 포트 구조
Grafana는 컨테이너 내부에서 기본적으로 3000 포트에서 HTTP 요청을 받는다.
containers:
- name: grafana
image: grafana/grafana:10.4.5
ports:
- name: http
containerPort: 3000
그래서 로컬 환경(Docker compose 등)에서는
보통 이렇게 실행하고, 이렇게 접속하지:
localhost:3000
하지만 Kubernetes 환경에서는 외부 접근을 위해 Service 리소스가 추가로 필요하다.
이 Service가 어떻게 정의되어 있느냐에 따라 “포트 3000을 붙여야 하는지”가 달라진다.
⚙️ 2️⃣ 왜 예전에는 :3000을 붙여야 했을까?
예전 설정에서는 이렇게 설정되어 있었다. 👇
spec:
type: LoadBalancer
ports:
- port: 3000
targetPort: 3000
이 경우 AWS LoadBalancer는 외부 포트(ELB) 도 3000으로 개방한다.
즉, EKS 외부에서 Grafana에 접근하려면 이렇게 URL을 입력해야 한다.
http://<ELB-DNS>:3000
요약하자면:
“ELB가 3000 포트를 그대로 노출하므로, 브라우저에서도 :3000을 붙여야 한다.”
🌐 3️⃣ 지금은 왜 :3000 없이 접속이 될까?
지금의 Service 설정을 보면 이렇게 되어 있다. 👇
spec:
type: LoadBalancer
ports:
- name: http
port: 80 # 외부 포트 (ELB 노출)
targetPort: 3000 # 내부 포트 (Grafana 컨테이너)
즉, ELB 외부에서는 80 포트를 열고,
Kubernetes Service가 그 요청을 Grafana의 내부 3000 포트로 포워딩한다.
그래서 외부에서는 단순히 이렇게 접속 가능하다:
http://<ELB-DNS>
즉, “80 → 3000”으로 자동 포워딩이 일어나기 때문에 브라우저에서 :3000을 붙이지 않아도 된다.
🔄 4️⃣ 동작 흐름 요약
아래 구조로 트래픽이 흘러간다 👇
[브라우저] http://ELB:80
↓
[AWS LoadBalancer] (port 80)
↓
[Kubernetes Service] port 80 → targetPort 3000
↓
[Grafana Pod] containerPort 3000
결국, Service의 port와 targetPort가 다르게 설정되어 있어서 외부 포트를 단순하게 80으로 숨겨준 것이다.
🚫 5️⃣ aws-load-balancer-scheme 설정은 관련이 없다.
혹시 이렇게 생각했을 수도 있다 👇
“service.beta.kubernetes.io/aws-load-balancer-scheme: "external" 설정이 없어서 그런 거 아닐까?”
하지만 이 옵션은 포트 매핑과 전혀 관계가 없다.
| 설정값 | 의미 |
| "external" | 퍼블릭 인터넷에서 접근 가능한 ELB 생성 |
| "internal" | VPC 내부에서만 접근 가능한 내부용 ELB 생성 |
즉, 이건 단순히 공개/비공개 접근 여부를 정하는 설정일 뿐,
port나 targetPort에는 영향을 주지 않는다.
EKS에서 type: LoadBalancer를 지정하면 기본적으로 external ELB가 생성된다.
💡 6️⃣ 정리 — :3000이 필요한 이유와 해결 요약
| 구분 | Service | 설정 외부 | URL 설명 |
| 예전 설정 | port: 3000, targetPort: 3000 | http://<ELB>:3000 | ELB가 3000 포트를 그대로 노출함 |
| 수정된 설정 | port: 80, targetPort: 3000 | http://<ELB> | 80 → 3000 자동 포워딩, 포트 생략 가능 |
🧠 7️⃣ 추가 팁 — HTTPS(443)로 Grafana 노출하기
만약 HTTPS(SSL)를 적용하고 싶다면, 아래처럼 port: 443과 SSL 인증서 ARN을 지정하면 된다 👇
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "<ACM_ARN>"
spec:
ports:
- port: 443
targetPort: 3000
이러면 https://<ELB-DNS>로 접속 가능하며 보안 연결(SSL/TLS)까지 자동으로 적용된다.
✅ 결론 요약
Grafana에 :3000을 붙여야 했던 이유는
Service의 외부 포트(port)를 3000으로 노출했기 때문이다.port: 80으로 변경하면 AWS LoadBalancer가 자동으로
외부 80 → 내부 3000으로 트래픽을 포워딩하기 때문에
이제는 포트를 붙이지 않아도 접속이 가능하다.
📘 핵심 문장 요약
“EKS에서 Grafana에 접속할 때 :3000을 붙여야 하는 이유는
외부 포트와 내부 포트를 동일하게 열었기 때문이다.
Service에서 port: 80으로 지정하면
ELB가 자동으로 포트 포워딩을 처리해주므로 포트를 생략할 수 있다.”
'현대 오토에버 클라우드 스쿨' 카테고리의 다른 글
| 팀 프로젝트) Kafka 구조 완벽 정리 (0) | 2025.10.29 |
|---|---|
| 팀 프로젝트) Kafka TCP 통신 vs. Prometheus HTTP 통신 (1) | 2025.10.29 |
| 팀 프로젝트) EBS 권한 문제 - Prometheus, Kafka, ElasticSearch 차이 (0) | 2025.10.29 |
| 팀 프로젝트) 모든 자원들을 삭제하는 shell script vs. argocd gui delete (0) | 2025.10.28 |
| 팀 프로젝트) EKS 기반 3클러스터 아키텍처 설계 (0) | 2025.10.28 |