Cilium+Hubble实现云原生网络可观测性

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

一、概述

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

二、网络流量技术架构图

image.png

三、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

image.png

5.2 查看hubble的界面

image.png

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

image.png
image.png

5.4 登录grafana查看Hubble查看视图

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

image.png

image.png

六、流量测试

配置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

image.png

步骤二:创建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

image.png

步骤三: 访问服务

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

image.png

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

image.png

image.png

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

image.png

image.png

七、小结

引入Hubble,就是把「容器网络」从「黑盒」变成「白盒」,让故障、安全、成本、合规都有据可依,用 2% 的性能损耗换取 100% 的网络可观测性。

推荐:

CCE部署Hubble实现DataPlane V2网络可观测性
https://support.huaweicloud.com/usermanual-cce/cce_10_1063.html

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。