写点什么

华为云 CCE Turbo:基于 eBPF 的用户自定义多粒度网络监控能力

  • 2024-01-26
    广东
  • 本文字数:3572 字

    阅读完需:约 12 分钟

华为云CCE Turbo:基于eBPF的用户自定义多粒度网络监控能力

本文分享自华为云社区《华为云CCE Turbo:基于eBPF的用户自定义多粒度网络监控能力》,作者: 云容器大未来。

基于 eBPF 的容器监控的兴起


容器具有极致弹性、标准运行时、易于部署等优点,越来越多的客户选择使用容器来部署自己的服务,随着容器规模越来越大,容器间网络交互也越来越复杂。我们需要一套完整的监控系统,让用户和运维团队可以更清晰的观测容器网络的运行情况。


基本的容器网络监控,和虚机的监控类似,只能监控每个 pod 的网络流量、丢包等基本信息,监控的方式就是通过 pod 内网卡上的统计信息获取监控结果。这种监控看到的信息有限,无法满足对容器网络深入观测的目标。



比如用户想看一下容器网络中都有哪些连接?哪些容器之间的访问比较频繁?他们的时延是多少?qps 大不大?网络质量怎么样?这些监控数据使用普通的监控手段无法获取。如果将用户的网络报文都镜像分析,会消耗大量的内存和 cpu 资源。eBPF 技术为我们提供了一种新的监控手段,让我们实现上述监控能力成为可能。


eBPF 是一种能够在内核运行沙箱程序的技术,可以通过在内核的不同位置注入监控代码,灵活的实现各种监控能力,安全、高性能,并且对内核和用户业务没有任何修改侵入,非常适合在容器监控领域使用。



当前已经有丰富的 eBPF 监控软件,比如 BCC、DeepFlow、Pixie 等,可以给用户提供多种维度的监控能力。



华为云云容器引擎 CCE Turbo 容器服务,提供了基于 eBPF 技术的 dolphin 插件(即"CCE 容器网络扩展指标"插件),实现多维度、多粒度的容器监控能力,大大增强了容器网络的可观测能力

dolphin 基于 eBPF 的监控能力构建


dolphin 插件使用 eBPF 技术并基于 K8s 框架设计,提供了容器网络多维度(pod、flow、自定义)监控和故障快速诊断能力,让客户可以更深入的观测 K8s 集群网络的运行情况,协助运维人员提前预防和快速定位故障。设计框架如下图所示:



dolphin 支持运行在 CCE Turbo 集群,通过 daemonset 部署在 K8s node 上,使用 CRD 管理监控任务,监控结果为 telemetry exporter 格式,支持普罗主动拉取监控结果。


CRD 定义如下:


apiVersion: crd.dolphin.io/v1kind: MonitorPolicymetadata:  name: example-task            #监控任务名  namespace: kube-system        #必填,namespace必须为kube-systemspec:  selector:                     #选填,配置dolphin插件监控的后端,形如labelSelector格式,默认将监控本节点所有容器    matchLabels:      app: nginx    matchExpressions:      - key: app        operator: In        values:          - nginx  podLabel: [app]               #选填,用户标签  healthCheck:                  #选填,本地节点 Pod 健康检查任务中最近一次健康检查是否健康、健康检查总健康&不健康次数这三个指标开关,默认不开    enable: true                # true false    failureThreshold: 3         #选填,健康检查不健康判定失败次数,默认1次健康检查失败即判定不健康    periodSeconds: 5            #选填,健康检查任务检查间隔时间,单位秒,默认60    command: ""                 #选填,健康检查任务检查命令,支持:ping、arping、curl,默认 ping    ipFamilies: [""]            #选填,健康检查IP地址族,支持:ipv4,默认ipv4    port: 80                    #选填,使用curl时必选,端口号    path: ""                    #选填,使用curl时必选,http api 路径     monitor:           ip:             ipReceive:                 aggregateType: flow       #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控             ipSend:                 aggregateType: flow       #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控           tcp:               tcpReceive:                    aggregateType: flow       #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控               tcpSend:                    aggregateType: flow       #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控               tcpRetrans:                    aggregateType: flow       #选填,支持填写"pod"或"flow",分别表示pod粒度监控或流粒度监控              tcpRtt:                    aggregateType: flow       #选填,支持填写"flow",表示流粒度监控,单位:微秒               tcpNewConnection:                    aggregateType: pod        #选填,支持填写"pod",表示pod粒度监控
复制代码


从 CRD 的定义可以看到,dolphin 主要有如下能力:


  • 用户自定义监控项。用户通过 CR 自选监控项,dolphin 根据用户选择的监控项动态注入 eBPF 程序,不需要的内容不监控,最大程度减少对 CPU、memory 等资源的消耗。

  • 用户自定义监控粒度。用户根据不同的监控诉求,可以选择 pod 或 flow 的监控粒度,dolphin 根据不同的监控粒度注入不同的 eBPF 程序,既满足了用户的监控诉求,也尽量降低资源的销毁。pod 粒度监控会按 pod 粒度聚合监控数据,用户通过 pod 粒度监控可以观测容器层面的网络运行情况。flow 粒度监控会按 pod 内不同流聚合监控数据,用户通过 flow 粒度监控可以观测容器内不同流的网络运行情况,进一步感知不同 pod 之间的通信情况。

  • 多任务并发。每个 CR 对应一个监控任务,可以多个任务并发监控,互不影响。用户可以根据需要定义多个监控任务进行不同层次、不同服务的监控。

  • selector 选择监控范围。CR 中的 selector 为标准的 K8s pod label selector,用户可以通过 selector 选择需要监控的一组 pod,灵活的定义监控范围。dolphin 会根据用户定义的监控范围只监控选中的 pod,大大降低资源消耗和监控结果输出。监控结果携带用户指定 pod label。用户通过监控结果进行数据分析时,常常会用到 pod 上的 label 信息进行数据筛选、数据聚合、数据关联等动作,用户可以通过 podLabel 字段指定监控结果携带哪些 pod 上的 label,dolphin 输出监控结果时,会根据用户指定的 label key 获取 pod 的上的 label value,并将 label KV 随监控结果输出,满足用户数据处理的诉求。

  • 丰富的 IP 层和 TCP 层监控能力,vpc 网络的健康检查能力。


具体的监控能力和使用方式,请参考华为云 CCE 容器网络扩展指标:

https://support.huaweicloud.com/usermanual-cce/cce_10_0371.html

示 例


某应用是用户的重点应用,此应用通过 deployment app1 部署在华为云 CCE Turbo 上,用户想知道这个应用的 qps 情况,网络质量有没有问题,都有哪些 client 在访问这个服务,整体网络流量情况是怎样的?这时候用户可以安装 dolphin 插件来实现了。


在 CCE 集群 console 界面,点击"插件中心",搜索“CCE 容器网络扩展指标”找到 dolphin 插件,点击“安装”,就完成了插件安装。



编写如下配置,并保存成 app1.yaml


apiVersion: crd.dolphin.io/v1kind: MonitorPolicymetadata:  name: app1  namespace: kube-systemspec:  selector:    matchLabels:      app: app1       monitor:          ip:               ipReceive:                   aggregateType: pod               ipSend:                   aggregateType: pod             tcp:                  tcpRetrans:                       aggregateType: flow                  tcpRtt:                       aggregateType: flow                  tcpNewConnection:                       aggregateType: pod
复制代码


然后通过“kubectl apply -f app1.yaml”将配置使能,监控配置就完成了。通过 prometheus 可以轻松查看监控结果。


通过新建连接的统计信息轻松计算 qps 值。



通过流粒度的 RTT 和重传监控,感知应用的网络时延和丢包情况,还可以感知具体哪些 client 的访问网络质量较差。




pod 粒度的 ip 收发统计,可以看到应用整体的流量情况。



除了使用 Prometheus 直接查看 dolphin 的监控结果外,还可以基于 dolphin 监控进行二次开发。华为终端云和 CCE 云原生观测服务利用 dolphin flow 粒度的网络监控能力,正在构建容器流量拓扑功能,可以一目了然的看到容器间的网络运行情况,敬请期待。


后续演进


dolphin 崭露头角,还在快速的成长过程中,后续会在如下几个方面继续演进增强。


  • 更丰富的监控指标,比如支持错包计数、建链失败统计、丢包统计、udp 报文统计等指标。

  • 更强的用户自定义能力,用户可以定义监控的 IP 范围、端口范围、聚合方式等。

  • K8s service 监控能力,让用户能感知 client->service->endpoint 全链路的网络运行情况。

  • 更智能的诊断能力,帮助用户对网络问题的快速定位、定界。


道阻且长,行则将至,行而不辍,未来可期,希望通过 dolphin 持续的演进,为用户带来更丰富的功能,帮助用户更方便、更清晰的观测容器网络。

云容器引擎 CCE 服务体验请访问


https://www.huaweicloud.com/product/cce.html


点击关注,第一时间了解华为云新鲜技术~

发布于: 刚刚阅读数: 6
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
华为云CCE Turbo:基于eBPF的用户自定义多粒度网络监控能力_云原生_华为云开发者联盟_InfoQ写作社区