Cilium+Hubble实现云原生网络可观测性
【摘要】 一、概述随着分布式服务架构的普及,尤其是微服务等涉及理念在现代应用中的广泛应用,应用内部的服务变得越来越去中心化。因此,服务之间的通信对网络的依赖性也日益增强。因此,讨论实现微服务可观测性中是一个日益重要的方面——云原生网络可观测性。Cilium 社区在 2019 年开源了 Hubble——一个基于 eBPF 的分布式网络与安全可观测性平台。 二、网络流量技术架构图 三、Hubble简介 ...
一、概述
随着分布式服务架构的普及,尤其是微服务等涉及理念在现代应用中的广泛应用,应用内部的服务变得越来越去中心化。因此,服务之间的通信对网络的依赖性也日益增强。因此,讨论实现微服务可观测性中是一个日益重要的方面——云原生网络可观测性。Cilium 社区在 2019 年开源了 Hubble——一个基于 eBPF 的分布式网络与安全可观测性平台。
二、网络流量技术架构图

三、Hubble简介
1. 3.1 Hubble 定位
- 基于 Cilium eBPF,0 侵入采集 L3-L7 流量;
- 实时生成「服务拓扑 + 网络指标 + DNS/Kafka/HTTP 详情」;
- 100% 覆盖 K8s 集群内东西向流量,单节点开销 < 2% CPU。
3.2 与现有方案对比
| 维度 | 常见传统方案 | Hubble |
|---|---|---|
| 侵入性 | 需插桩或改代码 | 0 侵入,eBPF 直接 hook 内核 |
| 覆盖度 | 只能覆盖已接入服务 | 全集群 Pod 100% 覆盖 |
| 深度 | IP+端口 | 支持 HTTP/2、gRPC、Kafka、DNS 语义 |
| 性能损耗 | 5-10% | <2% CPU,<100 MB 内存 |
| 可视化 | 无 | 自带拓扑 UI、Prometheus 指标、Grafana Dashboard |
三、环境准备
- Kubernetes ≥ 1.25,节点 Linux Kernel ≥ 5.10(eBPF 全量功能)
- Helm 3.x 已安装
四、核心配置
4.1 Cilium安装
# https://docs.cilium.io/en/stable/network/kubernetes/kubeproxy-free/
API_SERVER_IP=`kubectl get ep kubernetes -ojsonpath={.subsets..addresses..ip}`
API_SERVER_PORT=`kubectl get ep kubernetes -ojsonpath={.subsets..ports..port}`
kubectl create namespace cilium
# kubeProxyReplacement=true替代默认的kubeProxy
helm install cilium cilium/cilium \
--namespace kube-system \
--set kubeProxyReplacement=true \
--set k8sServiceHost=${API_SERVER_IP} \
--set k8sServicePort=${API_SERVER_PORT} \
--set hubble.enabled=true \
--set hubble.relay.enabled=true \
--set hubble.ui.enabled=true
4.2 prometheus+grafana安装
kubectl create ns monitoring
helm install kube-prometheus-stack kube-prometheus-stack/kube-prometheus-stack \
--namespace monitoring
# 将普罗的service修改为节点访问
kubectl get svc kube-prometheus-stack-prometheus -n monitoring -o yaml \
| sed 's/type: ClusterIP/type: NodePort/' \
| kubectl replace -f -
# 将grafana的service修改为节点访问
kubectl get svc kube-prometheus-stack-grafana -n monitoring -o yaml \
| sed 's/type: ClusterIP/type: NodePort/' \
| kubectl replace -f -
4.3 更新Cilium配置
# 安装普罗后才能生成serviceMonitor
helm upgrade cilium cilium/cilium \
--namespace kube-system \
--reuse-values \
--set hubble.metrics.enabled="{dns,drop,tcp,flow,icmp,http}" \
--set hubble.metrics.serviceMonitor.enabled=true \
--set hubble.metrics.serviceMonitor.labels.release=kube-prometheus-stack \
--set hubble.relay.prometheus.enabled=true \
--set hubble.relay.prometheus.serviceMonitor.enabled=true \
--set hubble.relay.prometheus.serviceMonitor.labels.release=kube-prometheus-stack
# 将Hubble的UI界面修改为节点访问
kubectl get svc hubble-ui -n kube-system -o yaml \
| sed 's/type: ClusterIP/type: NodePort/' \
| kubectl replace -f -
4.4 导入Hubble的dashboard
# https://raw.githubusercontent.com/cilium/cilium/refs/heads/main/examples/kubernetes/addons/prometheus/monitoring-example.yaml
# 从cilium官方案例提取hubble-dashboard.json,通过grafana的api导入。
# 也可以通过页面手动导入视图
wget -q https://raw.githubusercontent.com/cilium/cilium/refs/heads/main/examples/kubernetes/addons/prometheus/monitoring-example.yaml && \
awk '/^ hubble-dashboard.json:/{flag=1;next}/^---$/{flag=0}flag' monitoring-example.yaml | sed 's/^ //' > hubble-dashboard.json && \
sed -i '/"uid":/d;/"id":/d' hubble-dashboard.json && \
echo '{"dashboard": '$(cat hubble-dashboard.json)' ,"overwrite": true, "inputs": [], "folderId": 0}' > formatted-hubble-dashboard.json
GRAFANA_PASSWD=`kubectl get secret --namespace monitoring kube-prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo`
GRAFANA_PORT=`kubectl get svc kube-prometheus-stack-grafana -n monitoring -o jsonpath={.spec.ports..nodePort}`
GRAFANA_URL=`kubectl get nodes -ojsonpath={.items[0].status.addresses[0].address}`
curl -s -X POST -H "Content-Type: application/json" -u "admin:${GRAFANA_PASSWD}" http://${GRAFANA_URL}:${GRAFANA_PORT}/api/dashboards/db -d @formatted-hubble-dashboard.json
五、配置检查
5.1 查看服务安装的service

5.2 查看hubble的界面

5.3 普罗页面查看hubble指标是否已经能被收集


5.4 登录grafana查看Hubble查看视图
admin用户登录密码获取
kubectl get secret --namespace monitoring kube-prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo


六、流量测试
配置CiliumNetworkPolicy的规则,进行七层流量指标的暴露,例如http/dns等指标
步骤一: 创建两个服务模拟服务之间的http流量。
kubectl create deployment app001 --image=nginx:perl
kubectl create deployment app002 --image=nginx:perl
kubectl create svc clusterip app001 --tcp=80:80
kubectl create svc clusterip app002 --tcp=80:80

步骤二:创建CiliumNetworkPolicy规则
参考https://docs.cilium.io/en/stable/observability/visibility/创建DNS的CiliumNetworkPolicy规则
cat >cnp.yaml<<EOF
apiVersion: cilium.io/v2
kind: CiliumNetworkPolicy
metadata:
name: "app01-app02-visibility"
spec:
endpointSelector:
matchLabels:
app: app001
egress:
- toPorts:
- ports:
- port: "53"
protocol: ANY
rules:
dns:
- matchPattern: "*"
- toEndpoints:
- matchLabels:
app: app002
toPorts:
- ports:
- port: "80"
protocol: TCP
rules:
http: [{}]
EOF
kubectl apply -f cnp.yaml

步骤三: 访问服务
kubectl get pod -owide
kubectl exec -it app001-78d87ddd46-n8snf -- bash
while true;do curl http://app002.default.svc.cluster.local:80; sleep 1; done

步骤四:查看普罗DNS、http的指标


步骤五:查看hubble的DNS、http视图


七、小结
引入Hubble,就是把「容器网络」从「黑盒」变成「白盒」,让故障、安全、成本、合规都有据可依,用 2% 的性能损耗换取 100% 的网络可观测性。
推荐:
CCE部署Hubble实现DataPlane V2网络可观测性
https://support.huaweicloud.com/usermanual-cce/cce_10_1063.html
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)