华为云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/v1
kind: MonitorPolicy
metadata:
  name: example-task            #监控任务名
  namespace: kube-system        #必填,namespace必须为kube-system
spec:
  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/v1
kind: MonitorPolicy
metadata:
  name: app1
  namespace: kube-system
spec:
  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

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

相关推荐
华为云开发者联盟2 个月前
最佳实践:解读GaussDB(DWS) 统计信息自动收集方案
大数据·华为云开发者联盟·gaussdb(dws)·gaussdb(dws)·实时查询·统计信息
华为云开发者联盟2 个月前
深度解读KubeEdge架构设计与边缘AI实践探索
ai·边缘计算·kubeedge·华为云开发者联盟·sedna
华为云开发者联盟2 个月前
仓颉编程语言技术指南:嵌套函数、Lambda 表达式、闭包
鸿蒙·编程语言·华为云开发者联盟·仓颉
华为云开发者联盟2 个月前
深度解读GaussDB(for MySQL)与MySQL的COUNT查询并行优化策略
mysql·华为云开发者联盟
华为云开发者联盟2 个月前
Kmesh v0.4发布!迈向大规模 Sidecarless 服务网格
容器·华为云开发者联盟
华为云开发者联盟3 个月前
解读GaussDB(for MySQL)灵活多维的二级分区表策略
mysql·华为云开发者联盟
华为云开发者联盟3 个月前
从基础到高级应用,详解用Python实现容器化和微服务架构
python·docker·微服务·容器·华为云开发者联盟
华为云开发者联盟3 个月前
基于MindSpore实现BERT对话情绪识别
昇腾·华为云开发者联盟
华为云开发者联盟3 个月前
解读MySQL 8.0数据字典缓存管理机制
mysql·缓存·数据字典·元数据·华为云开发者联盟
华为云开发者联盟3 个月前
深度解读昇腾CANN模型下沉技术,提升模型调度性能
大模型·昇腾·cann·华为云开发者联盟