CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 3기
✅Hubble
Cilium 프로젝트의 일부로, Kubernetes 클러스터 내의 네트워크와 애플리케이션에 대한 가시성을 제공하는 도구입니다
https://cilium.io/blog/2019/11/19/announcing-hubble/
Hubble의 주요 기능
- 네트워크 가시성:
- Hubble은 Cilium이 관리하는 네트워크 트래픽을 모니터링하고 시각화합니다. 이를 통해 어떤 서비스가 서로 통신하고 있는지를 실시간으로 볼 수 있습니다.
- eBPF 기반:
- Hubble은 eBPF(Extended Berkeley Packet Filter)를 활용하여 패킷의 흐름을 추적합니다. eBPF는 커널 레벨에서 직접 패킷을 필터링하고 수집할 수 있는 기능을 제공하므로, Hubble은 매우 세밀한 데이터 수집이 가능합니다.
- 트래픽 통계:
- Hubble은 서비스 간의 트래픽 통계(예: 요청 수, 응답 시간 등)를 수집하여 대시보드에 표시합니다. 이를 통해 사용자는 시스템의 성능을 평가하고, 병목 현상을 쉽게 찾아낼 수 있습니다.
- 실시간 모니터링:
- Hubble은 실시간으로 네트워크 상태를 모니터링하고, 변화가 있을 때마다 이를 즉시 반영합니다. 사용자는 대시보드를 통해 현재 네트워크 상태를 항상 확인할 수 있습니다.
- 보안 및 감사:
- Hubble은 네트워크 트래픽을 감시하여 보안 정책이 제대로 적용되고 있는지를 확인합니다. 또한, 잠재적인 보안 위협이나 이상 징후를 탐지할 수 있는 기능을 제공합니다.
Hubble의 아키텍처
- Hubble Relay:
- Hubble Relay는 Hubble의 데이터 수집과 전송을 담당합니다. Hubble Relay는 eBPF 프로그램에서 수집한 데이터를 수신하고, 이를 Hubble UI나 API에 전달합니다.
- Hubble UI:
- Hubble은 시각화 도구인 Hubble UI를 제공합니다. 이 대시보드를 통해 사용자는 수집된 데이터를 쉽게 볼 수 있고, 다양한 통계를 그래픽 형태로 확인할 수 있습니다.
- API:
- Hubble은 API를 통해 외부 애플리케이션이나 도구와 통합할 수 있습니다. 이를 통해 다른 시스템과의 연동이나 데이터 자동화가 가능합니다.
🧿 Cilium 상태 정보
- Cilium: 네트워크 정책과 보안을 담당하는 Cilium이 정상적으로 작동하고 있음을 나타냅니다.
- Operator: Cilium을 관리하는 Operator가 정상입니다.
- Envoy DaemonSet: Envoy 프록시가 정상적으로 작동하고 있습니다.
- Hubble Relay: Hubble Relay가 정상 작동 중입니다.
- ClusterMesh: 클러스터 간 연결을 위한 ClusterMesh가 비활성화 상태입니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# cilium status
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Envoy DaemonSet: OK
\__/¯¯\__/ Hubble Relay: OK
\__/ ClusterMesh: disabled
DaemonSet cilium Desired: 3, Ready: 3/3, Available: 3/3
DaemonSet cilium-envoy Desired: 3, Ready: 3/3, Available: 3/3
Deployment cilium-operator Desired: 1, Ready: 1/1, Available: 1/1
Deployment hubble-relay Desired: 1, Ready: 1/1, Available: 1/1
Deployment hubble-ui Desired: 1, Ready: 1/1, Available: 1/1
Containers: cilium Running: 3
cilium-envoy Running: 3
cilium-operator Running: 1
hubble-relay Running: 1
hubble-ui Running: 1
Cluster Pods: 4/4 managed by Cilium
Helm chart version: 1.16.3
Image versions cilium quay.io/cilium/cilium:v1.16.3@sha256:62d2a09bbef840a46099ac4c69421c90f84f28d018d479749049011329aa7f28: 3
cilium-envoy quay.io/cilium/cilium-envoy:v1.29.9-1728346947-0d05e48bfbb8c4737ec40d5781d970a550ed2bbd@sha256:42614a44e508f70d03a04470df5f61e3cffd22462471a0be0544cf116f2c50ba: 3
cilium-operator quay.io/cilium/operator-generic:v1.16.3@sha256:6e2925ef47a1c76e183c48f95d4ce0d34a1e5e848252f910476c3e11ce1ec94b: 1
hubble-relay quay.io/cilium/hubble-relay:v1.16.3@sha256:feb60efd767e0e7863a94689f4a8db56a0acc7c1d2b307dee66422e3dc25a089: 1
hubble-ui quay.io/cilium/hubble-ui-backend:v0.13.1@sha256:0e0eed917653441fded4e7cdb096b7be6a3bddded5a2dd10812a27b1fc6ed95b: 1
hubble-ui quay.io/cilium/hubble-ui:v0.13.1@sha256:e2e9313eb7caf64b0061d9da0efbdad59c6c461f6ca1752768942bfeda0796c6: 1
🧿 Kubernetes 클러스터의 kube-system 네임스페이스에서 Hubble UI 관련 파드의 상태
- Hubble UI 파드는 정상적으로 실행되고 있으며, k8s-w1 노드에서 실행되고 있습니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl get pod -n kube-system -l k8s-app=hubble-ui -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
hubble-ui-59bb4cb67b-vr67b 2/2 Running 0 47m 172.16.1.79 k8s-w1 <none> <none>
🧿 Hubble UI 서비스의 타입을 변경하고, 해당 서비스를 통해 접근할 수 있는 URL을 생성
(⎈|CiliumLab:N/A) root@k8s-s:~# kubectl patch -n kube-system svc hubble-ui -p '{"spec": {"type": "NodePort"}}'
service/hubble-ui patched (no change)
(⎈|CiliumLab:N/A) root@k8s-s:~# HubbleUiNodePort=$(kubectl get svc -n kube-system hubble-ui -o jsonpath={.spec.ports[0].nodePort})
(⎈|CiliumLab:N/A) root@k8s-s:~# echo -e "Hubble UI URL = http://$(curl -s ipinfo.io/ip):$HubbleUiNodePort"
Hubble UI URL = http://3.35.54.219:31274
🧿 현재 시스템의 NAT(Network Address Translation) 테이블에 대한 규칙
- 기본 정책: PREROUTING, INPUT, OUTPUT, POSTROUTING 체인의 기본 정책이 모두 ACCEPT로 설정되어 있어, 기본적으로 모든 트래픽을 허용하고 있습니다.
- 사용자 정의 체인: Cilium과 관련된 여러 사용자 정의 NAT 체인이 생성되어 있으며, 패킷이 적절한 처리 체인으로 흐를 수 있도록 규칙이 설정되어 있습니다.
- 규칙 추가: PREROUTING, OUTPUT, POSTROUTING 체인에 Cilium의 NAT 처리 체인으로 패킷을 넘기는 규칙이 추가되어 있습니다.
(⎈|CiliumLab:N/A) root@k8s-s:~# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N CILIUM_OUTPUT_nat
-N CILIUM_POST_nat
-N CILIUM_PRE_nat
-N KUBE-KUBELET-CANARY
-A PREROUTING -m comment --comment "cilium-feeder: CILIUM_PRE_nat" -j CILIUM_PRE_nat
-A OUTPUT -m comment --comment "cilium-feeder: CILIUM_OUTPUT_nat" -j CILIUM_OUTPUT_nat
-A POSTROUTING -m comment --comment "cilium-feeder: CILIUM_POST_nat" -j CILIUM_POST_nat
🧿 Hubble의 최신 버전을 다운로드하고 설치
Hubble 버전 확인 |
HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt) |
Hubble의 최신 안정 버전을 GitHub에서 가져와 HUBBLE_VERSION 변수에 저장. |
아키텍처 설정 |
HUBBLE_ARCH=amd64 if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi |
기본 아키텍처를 amd64로 설정하고, 시스템 아키텍처가 aarch64인 경우 HUBBLE_ARCH를 arm64로 변경. |
Hubble 다운로드 |
curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} |
Hubble 바이너리와 체크섬 파일을 다운로드. |
SHA256 체크섬 확인 |
sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum |
다운로드한 tar.gz 파일의 체크섬을 확인하여 파일이 올바르게 다운로드되었는지 검증. |
Hubble 설치 |
sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin |
Hubble 바이너리를 /usr/local/bin 디렉터리에 압축 해제하여 설치. |
다운로드 파일 정리 |
rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum} |
다운로드한 tar.gz 파일과 체크섬 파일을 삭제하여 시스템 정리. |
(⎈|CiliumLab:N/A) root@k8s-s:~# HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/stable.txt)
(⎈|CiliumLab:N/A) root@k8s-s:~# HUBBLE_ARCH=amd64
(⎈|CiliumLab:N/A) root@k8s-s:~# if [ "$(uname -m)" = "aarch64" ]; then HUBBLE_ARCH=arm64; fi
(⎈|CiliumLab:N/A) root@k8s-s:~# curl -L --fail --remote-name-all https://github.com/cilium/hubble/releases/download/$HUBBLE_VERSION/hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 7015k 100 7015k 0 0 4295k 0 0:00:01 0:00:01 --:--:-- 30.8M
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 92 100 92 0 0 75 0 0:00:01 0:00:01 --:--:-- 0
(⎈|CiliumLab:N/A) root@k8s-s:~# sha256sum --check hubble-linux-${HUBBLE_ARCH}.tar.gz.sha256sum
hubble-linux-amd64.tar.gz: OK
(⎈|CiliumLab:N/A) root@k8s-s:~# sudo tar xzvfC hubble-linux-${HUBBLE_ARCH}.tar.gz /usr/local/bin
hubble
(⎈|CiliumLab:N/A) root@k8s-s:~# rm hubble-linux-${HUBBLE_ARCH}.tar.gz{,.sha256sum}
🧿 Cilium Hubble의 포트 포워딩과 Hubble의 현재 상태 확인
- 포트 포워딩을 통해 Hubble API에 접근할 수 있게 설정
(⎈|CiliumLab:N/A) root@k8s-s:~# cilium hubble port-forward &
[1] 15947
(⎈|CiliumLab:N/A) root@k8s-s:~# hubble status
Healthcheck (via localhost:4245): Ok
Current/Max Flows: 9,849/12,285 (80.17%)
Flows/s: 41.98
Connected Nodes: 3/3
🧿 Cilium Hubble의 observe 명령어를 통해 출력된 네트워크 흐름
Oct 21 11:03:02.334 |
192.168.10.10:54868 (호스트) |
192.168.10.101:10250 (원격 노드) |
to-network |
FORWARDED |
TCP |
ACK, PSH |
Oct 21 11:03:08.198 |
192.168.10.10:54868 (호스트) |
192.168.10.101:10250 (원격 노드) |
to-network |
FORWARDED |
TCP |
ACK |
Oct 21 11:03:09.027 |
192.168.10.10:44166 (호스트) |
169.254.169.123:123 (외부) |
to-network |
FORWARDED |
UDP |
- |
Oct 21 11:03:09.203 |
192.168.10.101:34562 (원격 노드) |
172.16.0.236:4240 (헬스 체크) |
to-network |
FORWARDED |
TCP |
ACK |
Oct 21 11:03:09.203 |
192.168.10.101:34562 (원격 노드) |
172.16.0.236:4240 (헬스 체크) |
to-endpoint |
FORWARDED |
TCP |
ACK |
(⎈|CiliumLab:N/A) root@k8s-s:~# hubble observe
Oct 21 11:03:02.334: 192.168.10.10:54868 (host) -> 192.168.10.101:10250 (remote-node) to-network FORWARDED (TCP Flags: ACK, PSH)
Oct 21 11:03:08.198: 192.168.10.10:54868 (host) -> 192.168.10.101:10250 (remote-node) to-network FORWARDED (TCP Flags: ACK)
Oct 21 11:03:09.027: 192.168.10.10:44166 (host) -> 169.254.169.123:123 (world) to-network FORWARDED (UDP)
Oct 21 11:03:09.203: 192.168.10.101:34562 (remote-node) <- 172.16.0.236:4240 (health) to-network FORWARDED (TCP Flags: ACK)
Oct 21 11:03:09.203: 192.168.10.101:34562 (remote-node) -> 172.16.0.236:4240 (health) to-endpoint FORWARDED (TCP Flags: ACK)
...