본문 바로가기
클라우드/Cilium

Hubble에서 'Unknown/L3'만 보이시나요? 🕵️‍♂️ 단 한 줄로 L7 트래픽 파싱 완벽 정복!

by gasbugs 2025. 12. 5.

쿠버네티스(Kubernetes) 환경에서 Cilium과 Hubble을 도입하고 멋진 서비스 맵이 그려지는 것을 보며 감탄하셨나요? 🤩 그런데 막상 트래픽을 자세히 들여다보니 L3/L4, TCP, Unknown 같은 정보만 보이고, 우리가 정말 보고 싶었던 HTTP GET /api/users, Kafka Produce message 같은 상세한 L7(애플리케이션 레이어) 정보가 보이지 않아 답답했던 경험, 다들 있으실 겁니다.

"분명 L7 가시성이 Cilium의 핵심 기능이라고 했는데, 왜 나한테만 안 보이는 거지?" 라고 생각하셨다면, 오늘 이 글을 통해 그 궁금증을 완벽하게 해결해 드리겠습니다. 사실 이건 버그도 아니고 설정이 잘못된 것도 아닙니다. Cilium의 아주 중요한 '철학'과 관련된 문제입니다.


🤔 왜 기본적으로 L7 트래픽이 보이지 않을까? 성능, 그리고 선택과 집중!

가장 먼저 알아야 할 점은 Cilium은 기본적으로 모든 트래픽에 대해 L7 파싱을 수행하지 않는다는 것입니다.

생각해보세요. 클러스터 내에서 오가는 모든 네트워크 패킷을 하나하나 열어서 이게 HTTP인지, Kafka인지, gRPC인지 분석하는 작업은 상당한 CPU와 메모리 자원을 소모합니다. 🤯 만약 모든 트래픽에 이 작업을 적용한다면, 네트워크 성능에 큰 영향을 미칠 수 있겠죠.

Cilium은 eBPF를 통해 커널 레벨에서 매우 효율적으로 동작하는 것이 장점인데, 무분별한 L7 파싱은 이런 장점을 상쇄시킬 수 있습니다.

그래서 Cilium은 "성능을 위해 기본은 L3/L4로, L7 분석은 사용자가 명시적으로 요청한 것에 대해서만 수행한다!" 라는 'Opt-in' 방식을 채택했습니다. 즉, 우리가 "이 서비스로 들어오는 트래픽은 HTTP니까 자세히 들여다봐 줘!" 라고 알려줘야만 Cilium이 비로소 L7 프록시(Envoy)를 투입해 트래픽을 상세히 분석하기 시작합니다.

이것이 바로 전체적인 맥락입니다. 우리는 이제 Cilium에게 "어떤 트래픽을 분석해야 하는지" 알려주는 방법을 배우기만 하면 됩니다.


✨ 마법의 한 줄: Annotation으로 L7 가시성 활성화하기

Cilium에게 특정 서비스의 트래픽을 분석하라고 지시하는 가장 간편하고 명확한 방법은 바로 쿠버네티스 서비스(Service)에 특정 어노테이션(Annotation)을 추가하는 것입니다.

어노테이션은 쿠버네티스 오브젝트에 추가적인 메타데이터를 부여하는 기능으로, 다양한 툴이나 컨트롤러가 이 값을 읽어 특정 동작을 수행하도록 만들 수 있습니다. Cilium도 바로 이 어노테이션을 활용합니다.

자, 실제 예시를 통해 어떻게 적용하는지 살펴보겠습니다.

여기 my-app이라는 파드를 바라보는 평범한 서비스가 하나 있습니다.

# 💻 Raw Data: 적용 전 Service YAML
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
  - name: http
    port: 80
    targetPort: 8080
    protocol: TCP

지금 상태에서는 my-app-service:80으로 들어오는 트래픽은 Hubble에서 그냥 TCP 트래픽으로만 보일 겁니다. 이제 여기에 마법의 어노테이션 한 줄을 추가해 보겠습니다.

# 💻 Raw Data: L7 파싱을 위한 Annotation 적용 후 Service YAML
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
  annotations:
    # ✨ 바로 이 부분입니다! 80번 포트로 들어오는 HTTP 트래픽을 파싱하라고 지시합니다.
    io.cilium/proxy-visibility: "<80/HTTP>"
spec:
  type: ClusterIP
  selector:
    app: my-app
  ports:
  - name: http
    port: 80
    targetPort: 8080
    protocol: TCP

metadata.annotations 필드에 io.cilium/proxy-visibility: "<80/HTTP>"를 추가했습니다. 이 어노테이션의 의미는 다음과 같습니다.

  • io.cilium/proxy-visibility: Cilium 프록시의 가시성 설정을 하겠다는 의미의 Key입니다.
  • <80/HTTP>: 이 서비스의 80번 포트로 들어오는 트래픽을 HTTP 프로토콜로 해석하여 파싱하라는 Value입니다.

이 YAML을 kubectl apply로 클러스터에 적용하는 순간, Cilium은 이 서비스로 향하는 트래픽을 감지하고 L7 프록시(Envoy)를 동적으로 투입하여 HTTP 요청을 상세히 분석하기 시작합니다.

이제 Hubble UI를 다시 확인해보세요. Unknown이나 TCP 대신, 아래와 같이 아름다운 L7 정보들이 펼쳐질 겁니다.

  • GET /api/v1/users
  • POST /api/v1/login
  • Response: 200 OK
  • Response: 404 Not Found

정말 간단하죠? 이처럼 어노테이션을 사용하는 방법은 특정 워크로드에 대한 가시성을 쉽고 명시적으로 켤 수 있는 강력한 방법입니다.

💡 Tip: 만약 여러 포트를 사용하거나 다른 프로토콜(예: Kafka)을 파싱하고 싶다면? io.cilium/proxy-visibility: "<80/HTTP>,<9092/Kafka>" 와 같이 쉼표로 구분하여 여러 규칙을 정의할 수 있습니다.


❌ 흔한 오해와 잘못된 접근법들

이 문제를 해결하려 할 때 빠지기 쉬운 함정들이 있습니다. 왜 다른 방법들은 정답이 아닌지 알아두면 Cilium을 더 깊이 이해할 수 있습니다.

1. "Hubble만 설치하면 다 되는 것 아닌가요?" (

배경: Hubble은 Cilium이 수집한 데이터를 시각화해주는 '관측소' 🔭 역할입니다. 데이터 수집은 전적으로 Cilium의 역할이죠. Cilium이 L7 데이터를 수집(파싱)하지 않으면 Hubble은 보여줄 데이터 자체가 없습니다. 따라서 Hubble 설치만으로는 L7 가시성이 활성화되지 않습니다.

2. "Pod에 Label을 붙이면 되지 않나요?"

배경: 쿠버네티스에서 Label과 Annotation은 역할이 다릅니다. Label은 주로 오브젝트를 식별하고 그룹화하여 selector 등으로 '선택'하기 위해 사용됩니다 (예: app=my-app). 반면, Annotation은 도구나 시스템에게 어떤 '동작'을 지시하거나 추가적인 정보를 제공하기 위한 비-식별 메타데이터입니다. L7 파싱 활성화는 Cilium 에이전트에게 특정 동작을 지시하는 것이므로, Annotation을 사용하는 것이 의미상, 기능상 올바른 방법입니다. ⚙️

3. "Cilium Network Policy(CNP)를 적용해야만 하나요?"

배경: L7 가시성을 켜는 방법은 크게 두 가지입니다. 첫째는 오늘 설명한 Annotation을 이용하는 방법이고, 둘째는 L7 규칙이 포함된 CiliumNetworkPolicy를 적용하는 방법입니다. 정책을 통해 GET /public 경로는 허용하고 나머지는 차단하는 등의 L7 보안 규칙을 적용하면, Cilium은 해당 정책을 시행하기 위해 자연스럽게 L7 파싱을 시작합니다. 즉, CNP 적용도 L7 가시성을 켜는 '방법 중 하나'이지만, '유일한 방법'은 아닙니다. 단순히 트래픽을 관찰만 하고 싶다면 어노테이션 방식이 훨씬 간단합니다.


맺음말

Cilium과 Hubble의 L7 가시성은 단순한 '기능'을 넘어, 왜 eBPF 기반 네트워킹이 강력한지에 대한 증거입니다. 성능을 해치지 않으면서도, 필요할 때 원하는 워크로드의 트래픽만 콕 집어 깊이 있게 들여다볼 수 있는 유연성은 클라우드 네이티브 환경에서 필수적인 역량입니다.

이제 여러분의 Hubble 서비스 맵에서 답답했던 Unknown 대신, 애플리케이션의 속살을 훤히 보여주는 L7 데이터를 직접 확인해보세요! 단 한 줄의 어노테이션으로 여러분의 쿠버네티스 클러스터 관리가 한 차원 더 스마트해질 겁니다. ✨