首页 > 其他分享 >华为云CCE Turbo:基于eBPF的用户自定义多粒度网络监控能力

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

时间:2024-01-26 11:16:19浏览次数:21  
标签:Turbo 自定义 eBPF 容器 dolphin flow 粒度 监控 pod

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

基于eBPF的容器监控的兴起

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

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

1.png

    比如用户想看一下容器网络中都有哪些连接?哪些容器之间的访问比较频繁?他们的时延是多少?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

 

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

 

标签:Turbo,自定义,eBPF,容器,dolphin,flow,粒度,监控,pod
From: https://www.cnblogs.com/huaweiyun/p/17988887

相关文章

  • SAP dialog 自定义搜索帮助 案例+源码
    同之前的blog一样,新建一个9000的屏幕,元素清单配好ok_code即可前置准备准备一个屏幕,具体步骤和之前一样,这边也按步骤做一下状态栏因为这个只是用于搜索帮助的演示,所以不需要应用应用程序工具栏,只需要设置功能键方便返回测试即可标题9000程序PROCESSBEFOREOUTPUT.......
  • 自定义模板中数据标签
    笔记数据标签(DataTag)只是一种辨识度比较高的文本字符串,样式完全由开发人员自己说了算。比如这样的数据标签“【##日期$$】”,编写代码openDataTag("【##日期$$】")即可返回数据标签对象,进而可以对此数据标签填充数据或设置样式等操作。在实际的Word文档开发中,经常需要自动填充......
  • 记windows自定义bat脚本自启动
    自定义Windows启动脚本简化版在本指南中,我们将使用一个简化的批处理文件(.bat)来演示如何创建自定义的Windows启动脚本。以下是一个基本的模板,您只需根据需要在:begin部分添加您的代码。@echooffif"%1"=="h"gotobeginrem获取脚本路径set"scriptPath=%~dp0"rem......
  • springBoot自定义参数注解
    springBoot自定义参数注解前置条件:新建一个springboot项目1.新建一个标记注解@Authimportjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;/***@authorwa......
  • SSAS 利用Adomd 编程实现Cube的自定义配置
    利用Adomd执行Cube数据库的配置。 需要下载:Microsoft.AnalysisServices.AdomdClient,安装,再搜索到DLL的位置,在程序里引用下载地址 环境:SqlServer2022表格模型脚本内容存放在:s01.json文件里AdomdConnectionconn=newAdomdConnection("DataSourc......
  • xrandr: error BadMatch (invalid parameter attributes) 无法设置自定义分辨率刷新率
    我的环境ManjaroKDENvidia显卡前言前几天在创建虚拟显示屏让iPad成为副屏时,我打算使用xrandr给虚拟显示屏自定义分辨率以及144hz的刷新率(为了与主屏幕同步)但是当进行了如下操作后发生了RT报错:❯cvt19201080144#1920x1080143.88Hz(CVT)hsync:169.35kH......
  • 6. 结构体和自定义类型
    结构体与自定义类型结构体:将相关的数据放置在一起可以通过点操作符(.)访问内部元素可以作为函数的输入参数或返回类型一个简单的代码示例://self-defineddatatype--struct#include<iostream>structPoint{intx;inty;};//PointvoidprintPoint(Poi......
  • 实现流程化办公,快看看自定义拖拽表单!
    一直以来,流程化办公是很多企业的梦想和追求,因为可以帮助企业提高办公效率,降低人工成本,高效利用企业内部数据,做好办公协作工作。自定义拖拽表单优势明显、操作简单、功能灵活、可视化设计,是理想的流程化办公助力利器。众所周知,随着办公流程管理的规范化和体系化发展,各部门之间的协......
  • js 自定义数据属性
    HTML5允许给元素指定非标准的属性,但要使用前缀data-以便告诉浏览器,这些属性既不包含与渲染有关的信息,也不包含元素的语义信息。除了前缀,自定义属性对命名是没有限制的,data-后面跟什么都可以。下面是一个例子:<divid="myDiv"data-appId="12345"data-myname="Nicholas"></div>......
  • Uniapp微信小程序:轻松实现自定义导航栏,提升用户体验
    1、引言当涉及微信小程序的界面设计时,我们常常会发现自带的导航栏功能相对简单,仅限于显示当前页面的标题。然而,在实际开发过程中,我们往往需要更多的自由度和个性化,以满足用户体验的需求。因此,自定义导航栏成为必然选择。通过自定义导航栏,我们可以赋予小程序更多的设计灵活性和交互......