Gom3rye

팀 프로젝트) Grafana, Prometheus를 웹으로 접근할 때 포트 붙이는 여부 본문

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

팀 프로젝트) Grafana, Prometheus를 웹으로 접근할 때 포트 붙이는 여부

Gom3rye 2025. 10. 29. 11:15
728x90
반응형

☁️ [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가 자동으로 포트 포워딩을 처리해주므로 포트를 생략할 수 있다.”

728x90
반응형