Troubleshooting 2026.08.09 4 min read

Cloudflare Tunnel 뒤의 Traefik·Hubble이 열리지 않았던 이유

Tunnel 원점을 Traefik으로 지정한 뒤에도 UI가 열리지 않았다. Hubble Ingress와 Dashboard IngressRoute를 나누고 Host 라우팅을 확인했다.

이슈 발생: 2026-08-08 · 발행 기준: 2026-08-09 10:17 KST
환경: RKE2, Traefik, Cilium Hubble, Cloudflare Tunnel

Cloudflare Tunnel의 원점을 http://rke2-traefik.kube-system.svc.cluster.local:80으로 지정했는데 Hubble UI와 Traefik Dashboard가 열리지 않았다. 확인해 보니 Tunnel 연결 뒤 Traefik에서 각 UI로 보내는 Ingress 규칙도 필요했다.

요청이 지나가는 실제 경로

브라우저
  → Cloudflare Edge
  → Cloudflare Tunnel
  → cloudflared Pod
  → rke2-traefik Service:80
  → Host/Path 규칙
      ├─ hubble.example.com  → Hubble Ingress → hubble-ui Service
      └─ traefik.example.com → IngressRoute → api@internal

*.svc.cluster.local은 Kubernetes 내부 Service DNS다. 이 주소는 클러스터 안에서 실행하는 cloudflared Pod가 해석한다. 외부 브라우저는 공개 hostname으로 접속하고 Tunnel이 내부 Service까지 연결한다.

처음에 헷갈린 지점

처음에는 Traefik Service 주소를 원점으로 지정하면 Dashboard까지 열릴 것으로 생각했다. Service 연결과 별개로 hubble.example.com과 traefik.example.com을 각각 어느 애플리케이션으로 보낼지 정해야 했다.

Traefik에서 HTTP Host와 Path를 기준으로 아래처럼 요청을 나눴다.

  • Hubble은 Kubernetes 표준 Ingress로 hubble-ui:80에 연결한다.
  • Traefik Dashboard는 일반 Service가 아니라 Traefik 내부 서비스인 api@internal에 연결하므로 IngressRoute CRD를 사용한다.
  • Dashboard는 /dashboard/와 /api 경로를 사용한다. 루트 /만 열면 404처럼 보일 수 있으므로 리다이렉트를 둔다.

Hubble UI 라우팅

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hubble-ui
  namespace: kube-system
spec:
  ingressClassName: traefik
  rules:
    - host: hubble.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: hubble-ui
                port:
                  number: 80

Ingress는 backend Service와 같은 namespace에 만들었다. 표준 Ingress backend는 이름만으로 다른 namespace의 Service를 가리킬 수 없기 때문이다.

Traefik Dashboard 라우팅

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: dashboard-root-redirect
  namespace: kube-system
spec:
  redirectRegex:
    regex: ^https?://([^/]+)/?$
    replacement: https://${1}/dashboard/
    permanent: true
---
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: traefik-dashboard
  namespace: kube-system
spec:
  entryPoints:
    - web
  routes:
    - match: Host(`traefik.example.com`) && (PathPrefix(`/dashboard`) || PathPrefix(`/api`))
      kind: Rule
      services:
        - name: api@internal
          kind: TraefikService
    - match: Host(`traefik.example.com`) && Path(`/`)
      kind: Rule
      middlewares:
        - name: dashboard-root-redirect
      services:
        - name: api@internal
          kind: TraefikService

traefik.io/v1alpha1은 Kubernetes 기본 API가 아니다. Traefik이 설치한 CRD이므로 먼저 다음을 확인한다.

kubectl get crd | grep -E 'ingressroutes|middlewares'
kubectl -n kube-system get ingress,ingressroute,middleware

바깥에서 안쪽으로 진단하기

Service와 EndpointSlice, 라우팅 객체를 차례로 확인한 뒤 내부 요청을 보냈다.

# 1. Traefik과 backend Service 존재 여부
kubectl -n kube-system get svc rke2-traefik hubble-ui

# 2. Service가 실제 endpoint를 갖는지
kubectl -n kube-system get endpointslice \
  -l kubernetes.io/service-name=rke2-traefik
kubectl -n kube-system get endpointslice \
  -l kubernetes.io/service-name=hubble-ui

# 3. 라우팅 객체와 이벤트
kubectl -n kube-system describe ingress hubble-ui
kubectl -n kube-system describe ingressroute traefik-dashboard

# 4. 클러스터 내부에서 Service DNS 및 Host 라우팅 시험
kubectl run curl-test --rm -it --restart=Never \
  --image=curlimages/curl -- \
  curl -sv -H 'Host: hubble.example.com' \
  http://rke2-traefik.kube-system.svc.cluster.local/

Service만 호출할 때는 Host가 내부 DNS 이름이 된다. Host 기반 규칙을 시험하려면 -H 'Host: ...'를 반드시 넣어야 한다.

해결과 검증

두 공개 hostname의 Tunnel 원점은 동일한 Traefik Service로 유지했다. 대신 Hubble에는 표준 Ingress, Dashboard에는 IngressRoute와 루트 리다이렉트를 적용했다. 이후 내부 curl에서 올바른 backend가 선택되는지 확인하고, 마지막으로 외부 HTTPS 주소를 확인했다.

Traefik Dashboard에는 관리 정보가 표시된다. 외부 연결을 확인한 뒤에도 Cloudflare Access나 SSO 같은 인증 계층이 적용돼 있는지 점검해야 한다.

기억할 점

  • Tunnel의 원점 설정과 Traefik의 backend 라우팅을 각각 확인한다.
  • Pod IP 대신 Service DNS를 사용한다.
  • 같은 원점도 Host 규칙에 따라 여러 서비스로 나눌 수 있다.
  • Service 존재와 Endpoint 존재는 별개다.
  • Dashboard의 /dashboard/, /api, 루트 리다이렉트를 함께 확인한다.
  • Dashboard를 인증 없이 인터넷에 공개하지 않는다.

참고 자료

SEARCH JOURNAL

기록 검색

글 제목, 요약, 태그에서 찾습니다.

검색을 준비하고 있어요.

검색어를 입력해 주세요.

    Ctrl/⌘ K 검색 Esc 닫기 ↑ ↓ 결과 이동