Go K8s eBPF網路監控實戰:Cilium可觀測性的5個核心模式

云原生

問題引入:K8s網路監控的四大痛點

凌晨2點,線上服務大面積超時,你開啟監控面板——Service級別的延遲曲線一片紅色,但到底是哪個Pod出了問題?DNS解析慢了還是網路策略誤殺了流量?傳統監控工具只能告訴你「有問題」,卻無法定位「哪裡有問題」。

K8s網路監控的四大核心痛點:

  • 監控粒度粗:傳統監控停留在Service級別,無法穿透到Pod/Container維度,微服務呼叫鏈路成了黑盒
  • Service級別無法定位Pod:一個Service背後可能有數十個Pod,哪個Pod的延遲異常?傳統工具無從得知
  • DNS解析延遲難追蹤:CoreDNS解析超時是K8s網路問題的頭號元凶,但傳統工具無法追蹤單次DNS查詢的完整生命週期
  • 網路策略效果不可見:CiliumNetworkPolicy生效後拒絕了哪些流量?策略是否過於嚴格?沒有視覺化手段驗證

eBPF在核心層採集網路事件的天然優勢,搭配Cilium和Hubble,讓K8s網路從「黑盒」變成「玻璃盒」。


核心概念速查

概念 說明 核心價值
eBPF Extended Berkeley Packet Filter,Linux核心可程式設計沙盒 無需修改核心即可在核心層採集網路事件
Cilium 基於eBPF的K8s CNI外掛 替代kube-proxy,提供高效能資料平面和可觀測性基礎
Hubble Cilium的網路可觀測性平台 即時視覺化服務依賴、流量拓撲和DNS解析
網路可觀測性 對網路流量的全鏈路感知能力 從L3到L7的完整流量可見性
流量拓撲 服務間呼叫關係的視覺化圖譜 一鍵發現異常呼叫鏈和瓶頸節點
DNS監控 對DNS查詢/回應的追蹤和度量 定位域名解析延遲和NXDOMAIN錯誤
L7/L4監控 應用層/傳輸層協定解析 HTTP方法/路徑/gRPC方法的細粒度可觀測
網路策略審計 記錄策略拒絕/放行的連線 驗證策略效果,輔助策略調優

問題分析:eBPF網路監控的5大挑戰

1. eBPF程式開發複雜:eBPF C程式需要手動管理記憶體、處理邊界檢查、遵守驗證器規則,開發門檻高,除錯困難。一個指標越界就導致程式無法載入。

2. 核心版本相容性:不同eBPF特性依賴不同核心版本——ringbuf需要5.8+,bpf_skb_ecn_set_ce需要5.1+,多叢集環境核心版本不一致導致功能碎片化。

3. 監控資料量爆炸:大規模叢集每秒產生數十萬條網路事件,Hubble Flow日誌儲存成本線性增長,如何在不遺失關鍵事件的前提下控制資料量?

4. 效能開銷控制:eBPF程式執行在核心熱路徑上,每個封包都經過eBPF處理,不當的實作會導致CPU開銷飆升,影響業務吞吐量。

5. 多叢集可觀測性:生產環境通常是多叢集架構,Hubble預設單叢集視角,跨叢集流量拓撲需要ClusterMesh + Hubble Relay級聯,設定複雜。


模式1:Cilium安裝與Hubble可觀測性配置

Hubble是Cilium內建的網路可觀測性元件,無需Sidecar即可採集L3-L7全鏈路流量。

helm repo add cilium https://helm.cilium.io/
helm repo update

helm install cilium cilium/cilium \
  --namespace kube-system \
  --set kubeProxyReplacement=strict \
  --set hubble.enabled=true \
  --set hubble.relay.enabled=true \
  --set hubble.ui.enabled=true \
  --set hubble.metrics.enabled="{dns,drop,tcp,flow,http,port-distribution,icmp,httpV2}" \
  --set operator.replicas=1 \
  --set ipv4NativeRoutingCIDR="10.0.0.0/8"

cilium status
cilium connectivity test

啟用Hubble UI並存取流量拓撲:

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

hubble observe --since 5m --namespace production
hubble observe --pod-name payment-service-7d9f8b6c4-x2k1j
hubble observe --protocol http --type trace --since 1m

Hubble Flow匯出至Prometheus:

apiVersion: v1
kind: ConfigMap
metadata:
  name: hubble-metrics-config
  namespace: kube-system
data:
  hubble-metrics: |
    dns:
      enabled: true
    drop:
      enabled: true
    tcp:
      enabled: true
    flow:
      enabled: true
    http:
      enabled: true
    httpV2:
      enabled: true
      labels:
        source_pod: true
        destination_pod: true
    port-distribution:
      enabled: true

模式2:Go eBPF程式開發與網路事件採集

當Hubble內建指標無法滿足客製化需求時,用cilium/ebpf函式庫開發自訂網路事件採集器。

eBPF C程式 net_monitor.c

#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <bpf/bpf_helpers.h>

struct net_event {
    __u32 src_ip;
    __u32 dst_ip;
    __u16 src_port;
    __u16 dst_port;
    __u8 protocol;
    __u8 direction;
    __u64 timestamp_ns;
    __u32 pkt_len;
};

struct {
    __uint(type, BPF_MAP_TYPE_RINGBUF);
    __uint(max_entries, 1 << 24);
} net_events SEC(".maps");

struct {
    __uint(type, BPF_MAP_TYPE_HASH);
    __uint(max_entries, 1024);
    __type(key, __u32);
    __type(value, __u8);
} monitored_ns SEC(".maps");

SEC("tc")
int tc_monitor(struct __sk_buff *skb) {
    void *data_end = (void *)(long)skb->data_end;
    void *data = (void *)(long)skb->data;

    struct ethhdr *eth = data;
    if ((void *)(eth + 1) > data_end)
        return TC_ACT_OK;

    if (eth->h_proto != __builtin_bswap16(ETH_P_IP))
        return TC_ACT_OK;

    struct iphdr *ip = (void *)(eth + 1);
    if ((void *)(ip + 1) > data_end)
        return TC_ACT_OK;

    __u32 dst_ip = ip->daddr;
    __u8 *monitored = bpf_map_lookup_elem(&monitored_ns, &dst_ip);
    if (!monitored)
        return TC_ACT_OK;

    struct net_event *e = bpf_ringbuf_reserve(&net_events, sizeof(*e), 0);
    if (!e)
        return TC_ACT_OK;

    e->src_ip = ip->saddr;
    e->dst_ip = dst_ip;
    e->protocol = ip->protocol;
    e->timestamp_ns = bpf_ktime_get_ns();
    e->pkt_len = skb->len;
    e->direction = 0;

    if (ip->protocol == IPPROTO_TCP) {
        struct tcphdr *tcp = (void *)(ip + 1);
        if ((void *)(tcp + 1) <= data_end) {
            e->src_port = __builtin_bswap16(tcp->source);
            e->dst_port = __builtin_bswap16(tcp->dest);
        }
    } else if (ip->protocol == IPPROTO_UDP) {
        struct udphdr *udp = (void *)(ip + 1);
        if ((void *)(udp + 1) <= data_end) {
            e->src_port = __builtin_bswap16(udp->source);
            e->dst_port = __builtin_bswap16(udp->dest);
        }
    }

    bpf_ringbuf_submit(e, 0);
    return TC_ACT_OK;
}

char _license[] SEC("license") = "GPL";

Go使用者空間採集器:

package main

import (
	"bytes"
	"encoding/binary"
	"fmt"
	"log"
	"net"
	"os"
	"os/signal"
	"syscall"
	"time"

	"github.com/cilium/ebpf"
	"github.com/cilium/ebpf/link"
	"github.com/cilium/ebpf/ringbuf"
)

type netEvent struct {
	SrcIP       uint32
	DstIP       uint32
	SrcPort     uint16
	DstPort     uint16
	Protocol    uint8
	Direction   uint8
	TimestampNs uint64
	PktLen      uint32
}

//go:generate go run github.com/cilium/ebpf/cmd/bpf2go -type net_event bpf ./net_monitor.c

func main() {
	spec, err := ebpf.LoadCollectionSpec("bpf.o")
	if err != nil {
		log.Fatalf("load spec: %v", err)
	}
	coll, err := ebpf.NewCollection(spec)
	if err != nil {
		log.Fatalf("new collection: %v", err)
	}
	defer coll.Close()

	iface, _ := net.InterfaceByName("eth0")
	l, err := link.AttachTC(link.TCAttach{
		Program:   coll.Programs["tc_monitor"],
		Interface: iface.Index,
	})
	if err != nil {
		log.Fatalf("attach tc: %v", err)
	}
	defer l.Close()

	rd, err := ringbuf.NewReader(coll.Maps["net_events"])
	if err != nil {
		log.Fatalf("ringbuf reader: %v", err)
	}
	defer rd.Close()

	sig := make(chan os.Signal, 1)
	signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)

	go func() {
		for {
			record, err := rd.Read()
			if err != nil {
				log.Printf("read error: %v", err)
				continue
			}
			var e netEvent
			if err := binary.Read(bytes.NewReader(record.RawSample), binary.LittleEndian, &e); err != nil {
				continue
			}
			srcIP := intToIP(e.SrcIP)
			dstIP := intToIP(e.DstIP)
			proto := protoName(e.Protocol)
			ts := time.Unix(0, int64(e.TimestampNs))
			fmt.Printf("[%s] %s:%d -> %s:%d proto=%s len=%d\n",
				ts.Format("15:04:05.000"), srcIP, e.SrcPort, dstIP, e.DstPort, proto, e.PktLen)
		}
	}()

	<-sig
	fmt.Println("shutting down...")
}

func intToIP(n uint32) net.IP {
	ip := make(net.IP, 4)
	binary.LittleEndian.PutUint32(ip, n)
	return ip
}

func protoName(p uint8) string {
	switch p {
	case 6:
		return "TCP"
	case 17:
		return "UDP"
	case 1:
		return "ICMP"
	default:
		return fmt.Sprintf("%d", p)
	}
}

模式3:DNS解析監控與延遲追蹤

DNS解析延遲是K8s網路問題的隱形殺手。Hubble內建DNS監控,可追蹤每次DNS查詢的完整生命週期。

hubble observe --protocol dns --since 5m
hubble observe --protocol dns --dns-response-code NXDomain
hubble observe --protocol dns --namespace kube-system --label k8s-app=kube-dns

Go程式透過Hubble gRPC API採集DNS指標:

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/cilium/hubble/api/v1/observer"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

type dnsMetric struct {
	queryName    string
	queryType    string
	latencyMs    float64
	responseCode string
	sourcePod    string
}

func monitorDNS(hubbleAddr string) error {
	conn, err := grpc.NewClient(hubbleAddr,
		grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		return fmt.Errorf("connect hubble: %w", err)
	}
	defer conn.Close()

	client := observer.NewObserverClient(conn)
	stream, err := client.GetFlows(context.Background(),
		&observer.GetFlowsRequest{
			Whitelist: []*observer.FlowFilter{
				{Protocol: []string{"dns"}},
			},
		})
	if err != nil {
		return fmt.Errorf("get flows: %w", err)
	}

	for {
		resp, err := stream.Recv()
		if err != nil {
			return fmt.Errorf("recv: %w", err)
		}
		flow := resp.GetFlow()
		if flow == nil || flow.GetDns() == nil {
			continue
		}
		dns := flow.GetDns()
		latency := float64(flow.GetTime().AsTime().Sub(
			flow.GetTime().AsTime())) / float64(time.Millisecond)
		m := dnsMetric{
			queryName:    dns.GetQuery(),
			queryType:    dns.GetQtypes()[0],
			latencyMs:    latency,
			responseCode: dns.GetRcode(),
			sourcePod:    flow.GetSource().GetPodName(),
		}
		if m.latencyMs > 100 {
			log.Printf("[DNS SLOW] pod=%s query=%s type=%s latency=%.1fms rcode=%s",
				m.sourcePod, m.queryName, m.queryType, m.latencyMs, m.responseCode)
		}
	}
}

CoreDNS延遲Prometheus告警規則:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: dns-latency-alerts
  namespace: kube-system
spec:
  groups:
    - name: dns.rules
      rules:
        - alert: DNSResolutionSlow
          expr: histogram_quantile(0.99, sum(rate(hubble_dns_response_latency_seconds_bucket[5m])) by (le, source_pod)) > 0.1
          for: 3m
          labels:
            severity: warning
          annotations:
            summary: "DNS解析緩慢,Pod {{ $labels.source_pod }}"
            description: "DNS P99延遲超過100ms"
        - alert: DNSNXDomainSpike
          expr: sum(rate(hubble_dns_response_total{rcode="NXDomain"}[5m])) / sum(rate(hubble_dns_response_total[5m])) > 0.05
          for: 5m
          labels:
            severity: warning
          annotations:
            summary: "NXDomain回應比例超過5%"

模式4:L7流量監控與HTTP/gRPC可觀測性

Hubble透過eBPF解析應用層協定,無需Sidecar即可取得HTTP方法、路徑、狀態碼和gRPC方法。

hubble observe --protocol http --since 5m
hubble observe --protocol http --http-status 5xx
hubble observe --protocol grpc --since 5m
hubble observe --protocol http --namespace production --label app=api-gateway

Go程式採集HTTP流量指標並輸出結構化日誌:

package main

import (
	"context"
	"encoding/json"
	"log"
	"os"

	"github.com/cilium/hubble/api/v1/observer"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

type httpFlowRecord struct {
	Timestamp  string `json:"timestamp"`
	SourcePod  string `json:"sourcePod"`
	DestPod    string `json:"destPod"`
	Method     string `json:"method"`
	Path       string `json:"path"`
	StatusCode uint32 `json:"statusCode"`
	LatencyNs  uint64 `json:"latencyNs"`
	Namespace  string `json:"namespace"`
}

func monitorHTTP(hubbleAddr string) error {
	conn, err := grpc.NewClient(hubbleAddr,
		grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		return err
	}
	defer conn.Close()

	client := observer.NewObserverClient(conn)
	stream, err := client.GetFlows(context.Background(),
		&observer.GetFlowsRequest{
			Whitelist: []*observer.FlowFilter{
				{Protocol: []string{"http"}},
			},
		})
	if err != nil {
		return err
	}

	encoder := json.NewEncoder(os.Stdout)
	for {
		resp, err := stream.Recv()
		if err != nil {
			return err
		}
		flow := resp.GetFlow()
		if flow == nil || flow.GetL7() == nil {
			continue
		}
		l7 := flow.GetL7()
		http := l7.GetHttp()
		if http == nil {
			continue
		}
		record := httpFlowRecord{
			Timestamp:  flow.GetTime().AsTime().Format("2006-01-02T15:04:05.000Z07:00"),
			SourcePod:  flow.GetSource().GetPodName(),
			DestPod:    flow.GetDestination().GetPodName(),
			Method:     http.GetMethod(),
			Path:       http.GetUrl(),
			StatusCode: http.GetStatusCode(),
			LatencyNs:  l7.GetLatencyNs(),
			Namespace:  flow.GetSource().GetNamespace(),
		}
		if record.StatusCode >= 400 {
			encoder.Encode(record)
		}
	}
}

gRPC方法級別監控的Hubble指標配置:

apiVersion: v1
kind: ConfigMap
metadata:
  name: hubble-l7-config
  namespace: kube-system
data:
  hubble-metrics: |
    httpV2:
      enabled: true
      labels:
        source_pod: true
        destination_pod: true
        source_namespace: true
        destination_namespace: true
    dns:
      enabled: true
    drop:
      enabled: true
    flow:
      enabled: true

模式5:網路策略審計與視覺化

網路策略生效後的流量審計是K8s網路安全的關鍵環節。Hubble記錄被策略拒絕的連線,幫助驗證策略效果。

hubble observe --type trace --verdict DROPPED --since 10m
hubble observe --type trace --verdict DROPPED --namespace production
hubble observe --type trace --drop-reason POLICY_DENIED

Go程式採集策略審計事件:

package main

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/cilium/hubble/api/v1/observer"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

type policyAuditEvent struct {
	timestamp  time.Time
	sourcePod  string
	destPod    string
	destPort   uint32
	protocol   string
	policyName string
	action     string
	namespace  string
}

func auditNetworkPolicy(hubbleAddr string) error {
	conn, err := grpc.NewClient(hubbleAddr,
		grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		return err
	}
	defer conn.Close()

	client := observer.NewObserverClient(conn)
	stream, err := client.GetFlows(context.Background(),
		&observer.GetFlowsRequest{
			Whitelist: []*observer.FlowFilter{
				{Verdict: []observer.Verdict{observer.Verdict_DROPPED}},
			},
		})
	if err != nil {
		return err
	}

	for {
		resp, err := stream.Recv()
		if err != nil {
			return err
		}
		flow := resp.GetFlow()
		if flow == nil {
			continue
		}
		evt := policyAuditEvent{
			timestamp: flow.GetTime().AsTime(),
			sourcePod: flow.GetSource().GetPodName(),
			destPod:   flow.GetDestination().GetPodName(),
			destPort:  flow.GetDestination().GetPort(),
			protocol:  flow.GetType().String(),
			action:    flow.GetVerdict().String(),
			namespace: flow.GetSource().GetNamespace(),
		}
		if flow.GetDropReason() != observer.DropReason_DROP_REASON_UNKNOWN {
			evt.policyName = flow.GetDropReason().String()
		}
		log.Printf("[AUDIT] %s %s -> %s:%d proto=%s action=%s reason=%s ns=%s",
			evt.timestamp.Format("15:04:05"),
			evt.sourcePod, evt.destPod, evt.destPort,
			evt.protocol, evt.action, evt.policyName, evt.namespace)
	}
}

策略審計Grafana看板關鍵PromQL:

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: policy-audit-alerts
  namespace: kube-system
spec:
  groups:
    - name: policy.audit
      rules:
        - alert: ExcessivePolicyDrops
          expr: sum(rate(hubble_drop_total{reason="policy_denied"}[5m])) by (source_pod, destination_pod) > 10
          for: 2m
          labels:
            severity: warning
          annotations:
            summary: "過多策略丟包從 {{ $labels.source_pod }} 到 {{ $labels.destination_pod }}"
        - alert: LegitimateTrafficDropped
          expr: sum(rate(hubble_drop_total{reason="policy_denied"}[5m])) by (namespace) / sum(rate(hubble_flow_total[5m])) by (namespace) > 0.01
          for: 5m
          labels:
            severity: critical
          annotations:
            summary: "命名空間 {{ $labels.namespace }} 超過1%流量被策略丟棄"

避坑指南:5大常見陷阱

1. ❌ Hubble預設不啟用 → ✅ 安裝時必須明確設定hubble.enabled=truehubble.relay.enabled=true,否則無法使用hubble observe命令和UI。

2. ❌ 監控所有命名空間流量 → ✅ 大規模叢集中全量採集Flow日誌會導致儲存爆炸,應透過--namespace--label過濾器只監控關鍵命名空間。

3. ❌ 忽略eBPF程式指令數限制 → ✅ 核心驗證器限制單eBPF程式最多100萬條指令(5.2+),複雜邏輯應使用bpf_tail_call拆分。

4. ❌ RingBuffer讀取阻塞主協程 → ✅ RingBuffer.Read()是阻塞呼叫,必須在獨立goroutine中執行,否則會阻塞程式退出。

5. ❌ Hubble Relay連線超時不重試 → ✅ Hubble Relay啟動依賴Cilium Agent就緒,應實作指數退避重試機制,避免Pod啟動順序導致的連線失敗。


報錯排查:10大常見錯誤

錯誤訊息 原因 解決方案
hubble observe: unable to connect to Hubble Relay Relay未啟用或Service未就緒 確認hubble.relay.enabled=true,檢查kubectl get pods -n kube-system -l k8s-app=hubble-relay
ringbuf: failed to read: ring buffer not available 核心版本低於5.8,不支援BPF_MAP_TYPE_RINGBUF 升級核心至5.8+或改用BPF_MAP_TYPE_PERF_EVENT_ARRAY
tc attach failed: cannot attach program to interface 介面已有tc eBPF程式 先卸載:tc filter del dev eth0 ingress,再重新掛載
bpf verifier: unreachable instruction eBPF程式存在不可達程式碼 檢查死程式碼和條件分支,確保所有路徑可達
hubble flow: DNS query not visible Hubble DNS監控未啟用 設定--set hubble.metrics.enabled="{dns}",確認CoreDNS配置
cilium/ebpf: collection load: invalid argument eBPF位元組碼與核心版本不相容 使用bpf2go重新編譯,確保目標核心版本匹配
Hubble UI: no service map data L7協定解析未啟用 啟用httpV2指標:--set hubble.metrics.enabled="{httpV2}"
grpc dial: connection refused to hubble-relay Relay連接埠未暴露或網路策略阻止 檢查hubble-relay Service和NetworkPolicy放行規則
eBPF program too large: 1M instruction limit exceeded 單程式指令數超限 使用bpf_tail_call拆分為多個子程式
hubble observe: context deadline exceeded Flow資料量過大,Relay處理超時 新增過濾條件縮小範圍,或增大Relay的--buffer-size

進階最佳化技巧

1. Hubble Flow取樣:大規模叢集中啟用Flow取樣,只記錄1/N的流量事件,關鍵事件(DROPPED/ERROR)全量保留:--set hubble.eventBufferCapacity=16384 --set hubble.eventQueueSize=8192

2. eBPF程式Tail Call鏈:使用bpf_tail_call將網路監控拆分為L3解析、L4解析、L7解析三個子程式,突破指令數限制的同時實現協定棧的模組化。

3. Hubble Metrics與Grafana聯動:將Hubble匯出的Prometheus指標接入Grafana,構建網路SLO看板——DNS P99延遲、HTTP 5xx率、策略拒絕率一目了然。

4. 多叢集Hubble Relay級聯:透過ClusterMesh將多個叢集的Hubble Relay級聯到中心Relay,實現跨叢集流量拓撲視覺化,配置hubble.relay.enabled=trueclustermesh.enabled=true

5. 自訂eBPF Map聚合:在eBPF程式核心側使用Per-CPU Hash Map聚合流量統計,只將聚合結果傳遞到使用者空間,減少RingBuffer資料量10倍以上。


對比分析:Cilium Hubble vs Istio Kiali vs Pixie vs DeepFlow

特性 Cilium Hubble Istio Kiali Pixie DeepFlow
資料平面 eBPF核心層 Sidecar代理 eBPF核心層 eBPF核心層
Sidecar ❌ 無需 ✅ Envoy ❌ 無需 ❌ 無需
L3/L4可觀測
L7協定解析 HTTP/gRPC/Kafka HTTP/gRPC HTTP/gRPC/MySQL/Redis 3000+協定
DNS監控 ✅ 原生
流量拓撲 ✅ 服務+Pod級 ✅ 服務級 ✅ 服務+Pod級 ✅ 服務+Pod級
網路策略審計 ✅ 原生
效能開銷 <2% 5-15% <2% <3%
多叢集 ✅ ClusterMesh
開源 ✅ 社群版
學習曲線

總結與展望

eBPF正在重新定義K8s網路可觀測性的邊界。從Cilium Hubble的零Sidecar全鏈路監控,到Go eBPF程式的客製化採集,從DNS延遲追蹤到L7流量細粒度可觀測,從網路策略審計到跨叢集流量拓撲——5個核心模式構建了生產級K8s網路監控的完整體系。2026年,隨著eBPF進入Linux核心主線和Hubble多叢集能力的成熟,eBPF網路監控將成為K8s可觀測性的事實標準。現在掌握這些模式,就是為未來的雲原生網路架構打下堅實基礎。


線上工具推薦

  1. JSON格式化工具 - 格式化和驗證Hubble Flow JSON輸出,快速定位異常流量事件。

  2. 雜湊編碼工具 - 為eBPF Map生成鍵值雜湊,或計算網路策略Header匹配規則的雜湊值。

  3. cURL轉程式碼工具 - 將Hubble gRPC API的cURL請求轉換為Go/Python程式碼,方便整合到自動化監控指令碼。

本站提供瀏覽器本地工具,免註冊即可試用 →

#eBPF网络监控#K8s网络#Cilium#网络可观测性#2026#云原生