Zum Inhalt

Cluster-Traffic beobachten

Cilium bietet eine Erweiterung namens Hubble.

Ähnlich wie das gleichnamige Weltraum-Teleskop ist Hubble auf Observability spezialisiert. Mit der Hubble UI kann der gesamte Datenverkehr im Cluster grafisch visualisiert werden. Alternativ kann auch die leistungsstarke hubble CLI genutzt werden, um Fehler schneller zu identifizieren.

Hubble Installation

In NETWAYS Managed Kubernetes Clustern, die Cilium als CNI nutzen, ist die Hubble UI bereits installiert.

Web-UI

Um Zugriff auf die Web-UI zu erhalten, muss man den Datenverkehr zum Hubble UI Service ins Cluster weiterleiten. Dies erfolgt mit folgendem Befehl:

kubectl port-forward -n kube-system svc/hubble-ui 8080:80

Im Anschluss kann man die Hubble UI im Browser lokal unter 127.0.0.1:8080 aufrufen.

Hubble UI

Oben links in der UI befindet sich eine Dropdown-Liste mit allen definierten Namespaces.

Nach Auswahl eines Namespaces wird eine Sitzung gestartet, die den gesamten Datenverkehr innerhalb dieses Namespaces beobachtet. Um einen bestimmten Pod genauer zu untersuchen, kann man diesen entweder direkt anklicken oder einen Filter in der Suchleiste setzen.

CLI

Für die Nutzung der hubble CLI muss man diese entweder lokal installieren oder aus dem Cilium Container im Cluster selbst arbeiten.

Lokale Installation der hubble CLI

HUBBLE_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/hubble/master/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}

Damit die lokale hubble CLI auf die Informationen aus dem Cluster zugreifen kann, muss man Zugriff auf die API gewähren:

kubectl port-forward -n kube-system svc/hubble-relay 4245:80 &
Forwarding from 0.0.0.0:4245 -> 4245
Forwarding from [::]:4245 -> 4245

Nutzung des Hubble Containers im Cluster

Alternativ zu einer lokalen Installation der hubble CLI kann man auch direkt im Cilium Container im Cluster arbeiten. Hierzu kann man einen alias einrichten:

alias hubble='kubectl exec -in kube-system ds/cilium -c cilium-agent -- hubble'
hubble status
    Healthcheck (via unix:///var/run/cilium/hubble.sock): Ok
    Current/Max Flows: 4,095/4,095 (100.00%)
    Flows/s: 4.07

Beobachtung von Datenverkehr

Um den gesamten Datenverkehr im Cluster (ähnlich wie tcpdump) zu überwachen, kann man den folgenden Befehl nutzen:

hubble observe --follow

Dieser zeigt in Echtzeit den gesamten Netzwerkverkehr im Cluster an.

Sep  4 07:28:18.255: 10.100.2.60:48428 (host) -> 10.100.2.77:4240 (health) to-endpoint FORWARDED (TCP Flags: ACK, PSH)
Sep  4 07:28:18.256: 10.100.2.60:48428 (host) <- 10.100.2.77:4240 (health) to-stack FORWARDED (TCP Flags: ACK, PSH)

Hubble kann den Datenverkehr basierend auf verschiedenen Kriterien wie Pod-Labels, Namespaces oder DNS-Anfragen filtern.

hubble observe --follow \
  --pod default/nginx-5f8f49fff4-m8m9h \
  --not --label k8s-app=kube-dns

Dieser Befehl überwacht z. B. den gesamten Datenverkehr des Pods nginx-5f8f49fff4-m8m9h im Namespace default, ignoriert jedoch DNS-Anfragen.

Ein weiteres häufiges Szenario ist die Filterung nach Zielport:

hubble observe --follow --pod nginx-5f8f49fff4-m8m9h --to-port 80 -o json | jq

Dieser Befehl gibt detaillierte Netzwerkdaten im JSON-Format aus, z.B.:

{
  "flow": {
    "time": "2023-09-04T08:25:35.610232081Z",
    "uuid": "c488a8f9-1301-4490-84f1-7ed96afd36f3",
    "verdict": "FORWARDED",
    "IP": {
      "source": "10.100.3.241",
      "destination": "142.250.184.238",
      "ipVersion": "IPv4"
    },
    "l4": {
      "TCP": {
        "source_port": 33610,
        "destination_port": 80,
        "flags": {
          "SYN": true
        }
      }
    },
    "source": {
      "namespace": "default",
      "pod_name": "nginx-5f8f49fff4-m8m9h"
    },
    "destination": {
      "identity": 2,
      "labels": ["reserved:world"]
    },
    "traffic_direction": "EGRESS"
  },
  "node_name": "cl-cilium-15-jibbo4pnpgn7-node-1",
  "time": "2023-09-04T08:25:35.610232081Z"
}