K8s 应用的网络可观测性: Cilium VS DeepFlow

DeepFlow开源
• 阅读 416

随着分布式服务架构的流行,特别是微服务等设计理念在现代应用普及开来,应用中的服务变得越来越分散,因此服务之间的通信变得越来越依赖网络,很有必要来谈谈实现微服务可观测性中越来越重要的一环——云原生网络的可观测。K8s 是微服务设计理念能落地的最重要的承载体,本文主要聚焦谈谈 K8s 的网络可观测性,以及其给基础设施/应用等团队能带来的价值。

谈 K8s 网络可观测性之前,先简单了解下 K8s 的网络通信是如何实现的,CNCF 定义了容器网络接口即 CNI,CNI 提供了一种应用容器的插件化网络解决方案,定义对网络容器进行操作和配置的规范,通过插件的形式对 CNI 接口进行实现。实现了 CNI 接口则成为 CNI 插件,常见的 CNI 插件包括 Calico、Cilium、Flannel、Kube-OVN、Terway、Weave Net 等,每种 CNI 插件都有自己的偏重性,使用者可用根据环境限制、功能需求和性能需求等各种方面选择自己所需的 CNI 插件。

但是目前针对这种类繁多的 CNI 插件并没有统一的网络可观测手段,对 K8s 网络问题的排障定位的前提是需要学习这众多 CNI 插件的原理,对于 K8s 运维或者微服务开发同学们来说学习成本高,而这么高的学习成本学成之后也只能用来回答「网络是不是瘫痪了」这类二极管问题,孤立的看网络只能看到一个个虚拟网口、虚拟网桥、网络策略,但看不到其中流动的每一个访问路径,每一次应用调用,因此也就无法回答关于访问路径、应用调用等这类细粒度的问题。

目前已经开始有一些 CNI 插件厂商在支持 K8s 网络可观测性了,例如 Cilium 单独起了一个子项目 Hubble 来做分布式网络和安全的可观测性,目前已知的如 Calico,Kube-OVN 等也开始推进网络可观测性能力了;也有纯第三方厂商在做 K8s 网络可观测性,DeepFlow 就实现了一种与 CNI 插件无关的网络可观测性能力。下面将重点介绍下 Hubble 和 DeepFlow 两个组件,看看目前 K8s 网络可观测性的能力。

01

Hubble

Hubble 是一个用于云原生工作负载分布式的 K8s 网络和安全观测平台,它构建在 Cilium 和 eBPF 之上,能观测服务的通信行为,也观测网络基础设施的通信行为。

Hubble 的组件架构图,包含 CLI/Server/Metrics/Relay/UI,其中 Server 负责采集网络可观测性数据;Relay 对外提供统一的 API 入口,提供集群可观测能力;CLI 是一个命令行工具;Metrics 负责将指标数据输出给 Prometheus,因此可以在 Grafana 构建 Hubble 指标数据的 Dashboard;UI 这是目前还在 Beta 中,主要展示服务依赖/通信拓扑

K8s 应用的网络可观测性: Cilium VS DeepFlow
架构图

在部署 Cilium 时,需要手动开启 Hubble,根据自身所需数据,按需设置 Hubble 配置

helm install cilium cilium/cilium \
--version 1.13.0    \
--namespace kube-system \   
--set prometheus.enabled=true \   
--set operator.prometheus.enabled=true \   
--set hubble.enabled=true  \
--set hubble.ui.enabled=true \
--set hubble.relay.enabled=true \  
--set hubble.metrics.enableOpenMetrics=true -f cilium.yaml

以下是 Hubble 提供的主要能力,结合 UI 页面与 Grafana 提供的 Dashboard 来展示

服务依赖/通信拓扑,以服务的维度查看通信拓扑

K8s 应用的网络可观测性: Cilium VS DeepFlow
服务依赖/通信拓扑

网络监控/告警,包含网络协议/端口/丢包等指标、流日志详情

K8s 应用的网络可观测性: Cilium VS DeepFlow
网络监控/告警

应用监控,包含 HTTP / DNS 的 RED 指标及调用日志详情

K8s 应用的网络可观测性: Cilium VS DeepFlow
应用监控

安全可观测性,结合网络安全策略与流量,观测流量通过情况

K8s 应用的网络可观测性: Cilium VS DeepFlow
安全可观测性

02

DeepFlow

DeepFlow 是一个高度自动化的可观测性平台,基于 AF_PACKET、BPF、eBPF、WASM 等技术,无需依赖 CNI 插件,既能观测 K8s 网络的通信行为进行观测、也能让构建在 K8s 上的云原生应用的无需埋点插码就能具备可观测性。

DeepFlow 由 Agent 和 Server 两个进程组成。每个 K8s 容器节点、虚拟机或物理裸机中运行一个 Agent,负责该服务器上所有应用进程的 AutoMetrics 和 AutoTracing 数据采集。Server 运行在一个 K8s 集群中,提供 Agent 管理、数据标签注入、数据写入、数据查询服务。

K8s 应用的网络可观测性: Cilium VS DeepFlow
架构图

DeepFlow 可以做到 CNI 插件和应用都无感知情况下,一条命令五分钟就能让 K8s 网络和云原生应用的具备可观测性

helm upgrade deepflow-agent -n deepflow deepflow/deepflow-agent -f values-custom.yaml


DeepFlow 产品可视化,有 UI 界面 和 Grafana Dashboard 两种形式,以下产品功能主要基于 UI 界面形式

全景调用拓扑,包含服务依赖拓扑以及覆盖网络各个节点的网络路径拓扑

K8s 应用的网络可观测性: Cilium VS DeepFlow
服务拓扑
K8s 应用的网络可观测性: Cilium VS DeepFlow
网络路径拓扑

全链路分布式拓扑,面向用户请求的零侵扰分布式追踪,可从代码追踪到系统进程并进一步追踪到网络节点

K8s 应用的网络可观测性: Cilium VS DeepFlow
调用链追踪

网络监控,包含覆盖三四层负载、时延、异常、性能等网络指标、分钟粒度的流日志及包粒度的时序图

K8s 应用的网络可观测性: Cilium VS DeepFlow
网络指标
K8s 应用的网络可观测性: Cilium VS DeepFlow
流日志
K8s 应用的网络可观测性: Cilium VS DeepFlow
时序图

应用监控,包含HTTP(S)、Dubbo、gRPC、ProtobufRPC、SOFARPC、MySQL、PostgreSQL、Redis、Kafka、MQTT、DNS等协议的 RED 指标及调用日志

K8s 应用的网络可观测性: Cilium VS DeepFlow
应用指标
K8s 应用的网络可观测性: Cilium VS DeepFlow
调用日志

03

总结

通过分析 Hubble 和 DeepFlow 两款产品,虽然是不同厂商在做,但是对于 K8s 网络可观测性的功能点上其实是有一样的认知,笔者基于两个产品能力以及业界对可观测性数据的定义,总结了 K8s 网络可观测性应该具备的能力如下:

  • 全景展示:服务依赖拓扑
  • 指标数据:应用指标/网络指标
  • 日志数据:应用调用日志/网络流日志/网络时序图
  • 追踪数据:应用调用链追踪/网络路径追踪

为了方便大家更好的了解在 K8s 网络可观测性上 Hubble 和 DeepFlow 平台的差异,总结表格如下:

软件架构 Hubble DeepFlow
CNI依赖 完全依赖 Cilium
eBPF依赖 完全依赖 eBPF 仅 AutoTracing、SSL 解密依赖
后端存储 使用 Prometheus 存储指标数据,不存储拓扑和日志数据 基于 ClickHouse 有完整的存储解决方案
数据标签 不支持自定义标签、开销大 支持 K8s 资源/K8s label 标签、开销低
产品能力 Hubble DeepFlow 说明
服务拓扑 Hubble 仅支持 service 维度;DeepFlow 可支持按任意 Tag 聚合为拓扑
应用指标 Hubble 支持 HTTP/DNS/Kafka协议;DeepFlow 支持十余种协议,且正在支持 WASM 插件解析私有协议
应用调用日志 查看详细的调用信息
应用调用链追踪 有(仅企业版) 更好的和应用结合,快速确定问题发生在应用、系统还是网络
网络指标 Hubble 只有流量/包量统计;DeepFlow 指标量更丰富,还涉及时延、异常、性能的指标
网络路径拓扑 可快速知道问题发生的网络位置
网络流日志 Hubble 可根据网络安全策略标记流是否丢弃;DeepFlow 可给流增加更多的标签和指标
网络时序图 有(仅企业版) 可更加深入分析包的交互
网络安全 Hubble 可根据网络安全策略标记流是否丢弃

04

参考文档

  • https://github.com/cilium/hubble
  • https://docs.cilium.io/en/stable/overview/intro/
  • https://github.com/deepflowio/deepflow
  • https://deepflow.io/docs/zh/about/overview/
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
3年前
Python+Selenium自动化篇
本篇文字主要学习selenium定位页面元素的集中方法,以百度首页为例子。0.元素定位方法主要有:id定位:find\_element\_by\_id('')name定位:find\_element\_by\_name('')class定位:find\_element\_by\_class\_name(''
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
DeepFlow开源
DeepFlow开源
Lv1
技术创造价值
文章
3
粉丝
3
获赞
3