SRE

[SRE] K3d에 Cilium & Hubble 구축: 실시간 트래픽 캡처부터 L7 분석까지

sooondubu 2026. 3. 18. 17:57

K3d에 Cilium & Hubble 구축: 실시간 트래픽 캡처부터 L7 분석까지 


목차 

  • 개념 
  • 환경 
  • 클러스터 구축 및 설정 
  • Cilium CLI 설치 
  • Hubble CLI 설치 
  • 테스트 1. Hubble UI/CLI를 통한 네트워크 트래픽 분석 
  • 테스트 2. 네트워크 차단 테스트 
  • 테스트 3. L7(HTTP) 가시성 확보 

개념

  • eBPF: 리눅스 커널 레벨의 고성능 패킷 제어 기술
  • Cilium: eBPF 기반의 차세대 K8s CNI (빠른 라우팅 및 강력한 보안 정책)
  • Hubble
    • 통신 흐름을 실시간으로 시각화하는 네트워크 현미경 (L4 TCP ~ L7 HTTP 캡처)
    • 패킷의 흐름을 Prometheus가 읽을 수 있는 Metrics 으로 변환

환경

  • WSL2 Ubuntu 24.04
  • K3d, kubectl, helm

클러스터 구축 및 설정

k3d cluster create sre-study \
  --agents 2 \
  -p "8080:80@loadbalancer" \
  -p "3000:3000@loadbalancer" \
  --k3s-arg "--flannel-backend=none@server:*" \
  --k3s-arg "--disable-network-policy@server:*"

k get no

  • K3s 기본 네트워크인 Flannel을 비활성화 하여 클러스터 생성
  • 네트워크가 존재하지 않기 때문에 노드가 NotReady 상태

# Cilium 헬름 레포지토리 추가
helm repo add cilium https://helm.cilium.io/
helm repo update

  • Cilium 설치를 위한 helm 레포 추가

#  Cilium 설치 (Hubble과 Prometheus 메트릭 활성화 포함)
helm install cilium cilium/cilium --version 1.14.0 \
  --namespace kube-system \
  --set nodeinit.enabled=false \
  --set kubeProxyReplacement=strict \
  --set k8sServiceHost=k3d-sre-study-server-0 \
  --set k8sServicePort=6443 \
  --set hubble.enabled=true \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true \
  --set prometheus.enabled=true \
  --set operator.prometheus.enabled=true \
  --set ipam.mode=kubernetes

  • cilium 설치
  • nodeinit.enabled=false: nodeinit 파드 생성을 비활성화, node init 파드는 노드의 os 설정을 변경하는 도구인데, k3d 환경에서는 불필요하다

  • 노드 Ready 상태 확인

Cilium CLI 설치


CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

  • Cilium CLI설치 및 버전 확인

cilium hubble ui


  • kube-system 네임스페이스 선택하여 트래픽 확인

Hubble CLI 설치


HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/main/stable.txt)
HUBBLE_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum
sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin
rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}

  • Hubble CLI 설치 및 버전 확인

cilium hubble port-forward

# 다른 터미널
hubble status

  • 클러스터 내의 Hubble에 접근하기 위해 포트포워딩 후, Hubble CLI를 통해 연결 상태 확인

hubble observe --namespace kube-system -f

  • kube-system 네임스페이스 트래픽 확인

테스트 1. Hubble UI/CLI를 통한 네트워크 트래픽 분석

  • 서비스 식별 및 L4 계층의 TCP 핸드셰이크 실시간 캡처

# 네임스페이스 생성
k create ns hubble-test

# Web 서버 (Nginx) 배포
k create deployment web --image=nginx -n hubble-test
k expose deployment web --port=80 -n hubble-test

# Client 파드 배포 
k run client --image=curlimages/curl -n hubble-test --labels="app=client" -- sleep 3600

  • 테스트를 위한 web, client pod 생성

# Client -> Web
k exec -it client -n hubble-test -- sh -c "
while true; do 
  curl -s -w 'HTTP Status: %{http_code}\n' -o /dev/null http://web; 
  sleep 2; 
done"

  • client → web 트래픽 발생

  • client → web 으로 이어지는 화살표 확인
  • 하단 콘솔의 forwarded 확인

hubble observe --namespace hubble-test -f

  • hubble observe 명령어로 CLI 환경에서 트래픽 확인
  • DNS 질의 (UDP): hubble-test/client -> kube-system/kube-dns:53. web 서비스의 IP를 찾는 과정
    • TCP 3-Way Handshake:
    • SYN: 연결 요청 (client -> web)
    • SYN, ACK: 연결 수락 (web -> client)
    • ACK: 연결 확정 (client -> web)
  • 데이터 전송 (PSH): TCP Flags: ACK, PSH가 찍히는 부분이 실제 HTTP 요청과 응답 데이터가 전달
  • 연결 종료 (FIN): TCP Flags: ACK, FIN을 통해 curl 요청이 끝나고 세션 종료

테스트 2. 네트워크 차단 테스트

  • Cilium Network Policy를 적용하여 특정 파드 간의 통신을 임의로 차단

cat <<EOF | k apply -f -
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "deny-client-to-web"
  namespace: hubble-test
spec:
  endpointSelector:
    matchLabels:
      app: web
  ingress:
  - fromEndpoints:
    - matchLabels:
        app: not-client  # app=client 라벨이 아닌 것만 허용하므로 client는 차단됨
EOF

  • 정책 변경하여 트래픽을 임의로 차단

  • Hubble UI 에서 확인
  • 하단의 dropped 로 차단된 것을 볼 수 있다

  • Drop reason: Policy denied 인 것을 확인할 수 있다.

  • hubble CLI 에서 확인 - Policy denied DROPPED

# 차단 정책 삭제
k delete cnp deny-client-to-web -n hubble-test

  • 차단 정책 삭제

테스트 3. L7(HTTP) 가시성 확보

  • Cilium Network Policy를 통해 특정 포트(80)의 L7 가시성 활성화

cat <<EOF | k apply -f -
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
  name: "l7-visibility"
  namespace: hubble-test
spec:
  endpointSelector:
    matchLabels:
      app: web
  ingress:
  - toPorts:
    - ports:
      - port: "80"
        protocol: TCP
      rules:
        http:
        - {}
EOF

  • L7 캡쳐 정책 적용

  • Hubble UI 에서 확인
  • web 파드에 HTTP 표시 확인
  • L7 info 열에 GET인 행 확인

# protocol 옵션 http 
hubble observe --namespace hubble-test -f --protocol http

  • HTTP 트래픽 캡쳐 확인

결론

  • 가시성 확보: hubble observe를 통해 L4(TCP)부터 L7(HTTP)까지의 실시간 통신 흐름을 완벽히 파악
  • 장애 원인 특정: 네트워크 차단 시 Policy denied와 같은 Drop Reason을 즉시 식별하여 트러블슈팅 시간 단축
  • 데이터 기반 운영: 단순히 "연결됨"을 넘어 응답 코드와 지연 시간 등 애플리케이션 성능 지표 수집 기반 마련