Ssoon

[8주차] Cilium CNI : Hubble UI & CLI 본문

쿠버네티스 네트워크 스터디 3기

[8주차] Cilium CNI : Hubble UI & CLI

구구달스 2024. 10. 21. 20:04
CloudNet@ 가시다님이 진행하는 쿠버네티스 네트워크 스터디 3기

Hubble 

Cilium 프로젝트의 일부로, Kubernetes 클러스터 내의 네트워크와 애플리케이션에 대한 가시성을 제공하는 도구입니다

https://cilium.io/blog/2019/11/19/announcing-hubble/

Hubble의 주요 기능

  1. 네트워크 가시성:
    • Hubble은 Cilium이 관리하는 네트워크 트래픽을 모니터링하고 시각화합니다. 이를 통해 어떤 서비스가 서로 통신하고 있는지를 실시간으로 볼 수 있습니다.
  2. eBPF 기반:
    • Hubble은 eBPF(Extended Berkeley Packet Filter)를 활용하여 패킷의 흐름을 추적합니다. eBPF는 커널 레벨에서 직접 패킷을 필터링하고 수집할 수 있는 기능을 제공하므로, Hubble은 매우 세밀한 데이터 수집이 가능합니다.
  3. 트래픽 통계:
    • Hubble은 서비스 간의 트래픽 통계(예: 요청 수, 응답 시간 등)를 수집하여 대시보드에 표시합니다. 이를 통해 사용자는 시스템의 성능을 평가하고, 병목 현상을 쉽게 찾아낼 수 있습니다.
  4. 실시간 모니터링:
    • Hubble은 실시간으로 네트워크 상태를 모니터링하고, 변화가 있을 때마다 이를 즉시 반영합니다. 사용자는 대시보드를 통해 현재 네트워크 상태를 항상 확인할 수 있습니다.
  5. 보안 및 감사:
    • 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)
...

Comments