3. Hubble 部署模式:Hubble Relay、Hubble UI、Hubble CLI 的部署与配置
Hubble 的观测能力由三个核心组件共同提供:Hubble Relay(数据聚合与 API 网关)、Hubble UI(可视化界面)和 Hubble CLI(命令行工具)。在生产环境中,这三个组件通常以独立或组合的方式部署在 Kubernetes 集群内,形成完整的可观测性数据面。
3.1 组件架构与职责划分
下表梳理了三个组件的定位、数据来源与典型部署位置:
| 组件 | 核心职责 | 数据来源 | 典型部署方式 |
|---|---|---|---|
| Hubble Relay | 聚合集群内所有 Hubble 节点的 gRPC 流,提供全局一致的网络流查询 API | 各节点上的 Hubble Agent(通过 Unix Socket 或 TCP) | Deployment + Service(ClusterIP) |
| Hubble UI | 基于 Relay API 提供 Web 可视化界面,展示服务依赖、流量拓扑与实时流 | Hubble Relay 的 gRPC 端点 | Deployment + Service(NodePort / Ingress) |
| Hubble CLI | 命令行交互式查询流日志、指标与事件,支持过滤、JSON 输出与实时观察 | Hubble Relay 或本地 Hubble Agent | 二进制 / 容器镜像 / kubectl 插件 |
关键设计原则:Hubble Relay 是 Hubble UI 和 Hubble CLI 的“唯一数据入口”。所有跨节点的流量查询都必须经过 Relay,避免每个客户端直接连接数百个 Agent。
3.2 Hubble Relay 部署与配置
Hubble Relay 是 Hubble 观测架构的“中枢神经”。它从每个节点上的 Hubble Agent 拉取 gRPC 流,合并后对外暴露统一的 hubble-relay gRPC 服务。
3.2.1 部署清单示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: hubble-relay
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
k8s-app: hubble-relay
template:
metadata:
labels:
k8s-app: hubble-relay
spec:
containers:
- name: hubble-relay
image: quay.io/cilium/hubble-relay:v1.16.0
args:
- "serve"
- "--peer-service=localhost:4244"
- "--listen-address=:4245"
ports:
- containerPort: 4245
name: grpc
env:
- name: HUBBLE_RELAY_PEER_SERVICE
value: "localhost:4244"
---
apiVersion: v1
kind: Service
metadata:
name: hubble-relay
namespace: kube-system
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 4245
name: grpc
selector:
k8s-app: hubble-relay
3.2.2 关键配置参数
- --peer-service:指定 Hubble Agent 的 Peer 服务地址,Relay 通过该地址发现集群内所有 Agent 节点。
- --listen-address:Relay 自身 gRPC 服务的监听地址,供 Hubble UI 和 Hubble CLI 连接。
- --dial-timeout:与 Agent 建立 gRPC 连接的超时时间,默认 5s,大集群建议调至 10-15s。
- --retry-interval:断连后重试间隔,默认 30s。
生产建议:如果集群规模超过 50 个节点,建议将 Relay 的副本数设置为 2-3 个,并配置
--peer-service 指向一个独立的 Headless Service,以实现负载均衡与高可用。
3.3 Hubble UI 部署与配置
Hubble UI 提供基于 Web 的流量可视化界面。它通过 gRPC 连接 Hubble Relay,将聚合后的流数据渲染为服务拓扑图、流量表格和实时日志。
3.3.1 部署清单示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: hubble-ui
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
k8s-app: hubble-ui
template:
metadata:
labels:
k8s-app: hubble-ui
spec:
containers:
- name: hubble-ui
image: quay.io/cilium/hubble-ui:v0.13.0
args:
- "--server"
- "--relay-endpoint=hubble-relay.kube-system.svc.cluster.local:80"
ports:
- containerPort: 8080
name: http
---
apiVersion: v1
kind: Service
metadata:
name: hubble-ui
namespace: kube-system
spec:
type: NodePort
ports:
- port: 80
targetPort: 8080
nodePort: 31234
selector:
k8s-app: hubble-ui
3.3.2 访问方式
- NodePort:通过任意节点 IP + 31234 端口访问,适合测试环境。
- Ingress:配置 TLS 与域名,适合生产环境。
- kubectl port-forward:
kubectl port-forward -n kube-system svc/hubble-ui 8080:80,适合临时调试。
3.4 Hubble CLI 部署与配置
Hubble CLI 是运维人员排查网络流量的“瑞士军刀”。它可以直接连接本地 Hubble Agent(单节点视角),也可以连接 Hubble Relay(全局视角)。
3.4.1 安装方式
| 方式 | 命令 | 适用场景 |
|---|---|---|
| 二进制下载 | curl -LO https://github.com/cilium/hubble/releases/.../hubble-linux-amd64.tar.gz |
本地开发机或跳板机 |
| kubectl 插件 | kubectl krew install hubble |
集群内快速使用 |
| 容器镜像 | kubectl run -it --rm hubble-cli --image=quay.io/cilium/hubble:v1.16.0 -- sh |
临时调试 Pod |
3.4.2 连接配置
# 连接本地 Hubble Agent(需在 Cilium 节点上执行)
export HUBBLE_SERVER=unix:///var/run/cilium/hubble.sock
# 连接 Hubble Relay(推荐)
export HUBBLE_SERVER=hubble-relay.kube-system.svc.cluster.local:80
# 验证连接
hubble status
3.5 组件交互流程(SVG 架构图)
下图展示了 Hubble 三个组件与底层 Cilium Agent 之间的数据流关系:
3.6 部署验证与常见问题
3.6.1 验证步骤
- 检查 Pod 状态:
kubectl get pods -n kube-system -l k8s-app=hubble-relay,确保 Running。 - 检查 Relay 连接:
hubble --server hubble-relay.kube-system.svc.cluster.local:80 status,输出应显示节点数量与流处理状态。 - 检查 UI 访问:通过 NodePort 或 port-forward 打开浏览器,确认服务拓扑图正常渲染。
- 检查 CLI 查询:
hubble observe --since 5m,应返回最近 5 分钟的流日志。
3.6.2 常见问题与排查
| 现象 | 可能原因 | 解决措施 |
|---|---|---|
| Relay 日志报 "no peers found" | Relay 无法发现 Hubble Agent 节点 | 检查 --peer-service 地址是否正确;确认 Cilium Agent 已启用 Hubble |
| UI 页面空白或报 502 | UI 无法连接 Relay | 检查 --relay-endpoint 的 DNS 解析;确认 Relay Service 端口正确 |
| CLI 查询超时 | Relay 负载过高或网络延迟 | 增加 Relay 副本数;调整 --dial-timeout 参数 |
| 流日志缺失部分节点 | 部分 Agent 与 Relay 断连 | 检查 Agent 日志;确认节点间网络连通性 |
注意:如果集群启用了 NetworkPolicy,请确保 Hubble Relay 的 Pod 能够访问所有节点上 Hubble Agent 的 4244 端口(gRPC)。建议在 kube-system 命名空间内放行相关流量。
3.7 部署模式选择建议
根据集群规模与观测需求,可以选择不同的部署组合:
- 最小化部署:仅部署 Hubble CLI,直接连接本地 Agent,适合单节点调试。
- 标准部署:Relay + CLI,适合运维团队通过命令行进行全局排查。
- 完整部署:Relay + UI + CLI,适合需要可视化拓扑与实时流监控的生产环境。