

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 관리 도구
- https://docs.cilium.io/en/stable/gettingstarted/k8s-install-default/#install-the-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 설치

- 네트워크 트래픽 데이터를 텍스트 형태로 조회 가능한 도구
- https://docs.cilium.io/en/stable/observability/hubble/setup/#install-the-hubble-client
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을 즉시 식별하여 트러블슈팅 시간 단축
- 데이터 기반 운영: 단순히 "연결됨"을 넘어 응답 코드와 지연 시간 등 애플리케이션 성능 지표 수집 기반 마련
'SRE' 카테고리의 다른 글
| [SRE] Hubble-Prometheus-Grafana 연동하여 쿠버네티스 모니터링 하기 (1) | 2026.03.19 |
|---|