《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——3.tc子系统(下)

简介: 《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——3.tc子系统(下)

更多精彩内容,欢迎观看:

《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——3.tc子系统(上):https://developer.aliyun.com/article/1221715?spm=a2c6h.13148508.setting.17.15f94f0eJz5i4D


2) Linux Traffic Control 在云原生中的应用

基于Cgroup的网络数据包Qos

Cgroup子系统是容器技术的基础,通常我们对cgroup的理解都在于cgroup通过cgroupfs文件接口,让内核在为应用程序提供cpu时间片分配和内存分配的过程中遵循一定的配额限制,实际上cgroup在较早的版本中已经支持对某个cgroup中的网络流量进行优先级的调整,以实现单个节点内不同cgroup之间的Qos动作。

 

Cgroup子系统中提供网络流量优先级的功能为net_cls和net_prio,需要配合TC子系统一起生效,例如,我们给某一个容器所在的cgroup添加一个net_cls设置:

mkdir /sys/fs/cgroup/net_cls/0
echo 0x100001 >  /sys/fs/cgroup/net_cls/0/net_cls.classid

 

在这里,我们选取了设定的class为100001,然后,我们将eth0网卡的root根队列的class设置为10,类型修改为htb,用于进行限速:

tc qdisc add dev eth0 root handle 10: htb

 

我们在10:这个根队列下,针对我们配置的10:1这个class配置带宽限流配置:

tc class add dev eth0 parent 10: classid 10:1 htb rate 40mbit

 

最后配置一个filter,将cgroup流量引入到10:1的class中,完成对这个cgroup net_cls的配置:

tc filter add dev eth0 parent 10: protocol ip prio 10 handle 1: cgroup

 

而net_prio的原理则相对更加直观一点,通过在对应的cgroup路径中的ifpriomap种配置网卡和对应的优先级数值,使对应的cgroup中管理的进程创建出来的socket都具有priority属性,priority属性会成为sk_buff结构体的属性从而携带到进入qdisc,如果qdisc支持优先级调度,则会根据priority来完成流量的Qos,操作如下:

echo "eth0 5" > /cgroup/net_prio/iscsi/net_prio.ifpriomap

基于TC eBPF的高性能可编程数据面实现

从上文的介绍中,我们了解到,在eBPF的多个内核提供的可执行的触发点中,TC子系统是其中原生支持的一种,实际上,许多开源的解决方案也都选择TC子系统作为eBPF程序执行的触发点,包括cilium和terway。

 

我们通过一个简单的eBPF程序来对TC子系统支持eBPF的能力进行验证:

 

首先,我们需要按照规范,在TC子系统提供的上下文环境中开发一个简单的eBPF程序:

#include <linux/bpf.h>
#include <linux/pkt_cls.h>
#include <stdint.h>
#include <iproute2/bpf_elf.h>
#ifndef __section
# define __section(NAME)                  \
__attribute__((section(NAME), used))
#endif
#ifndef __inline
# define __inline                         \
        inline __attribute__((always_inline))
#endif
#ifndef lock_xadd
# define lock_xadd(ptr, val)              \
        ((void)__sync_fetch_and_add(ptr, val))
#endif
#ifndef BPF_FUNC
# define BPF_FUNC(NAME, ...)              \
        (*NAME)(__VA_ARGS__) = (void *)BPF_FUNC_##NAME
#endif
static void *BPF_FUNC(map_lookup_elem, void *map, const void *key);
struct bpf_elf_map acc_map __section("maps") = {
        .type           = BPF_MAP_TYPE_ARRAY,
        .size_key       = sizeof(uint32_t),
        .size_value     = sizeof(uint32_t),
        .pinning        = PIN_GLOBAL_NS,
        .max_elem       = 2,
};
static __inline int account_data(struct __sk_buff *skb, uint32_t dir)
{
        uint32_t *bytes;
        bytes = map_lookup_elem(&acc_map, &dir);
        if (bytes)
                lock_xadd(bytes, skb->len);
        return TC_ACT_OK;
}
__section("ingress")
int tc_ingress(struct __sk_buff *skb)
{
        return account_data(skb, 0);
}
__section("egress")
int tc_egress(struct __sk_buff *skb)
{
        return account_data(skb, 1);
}
char __license[] __section("license") = "GPL";

 

随后我们创建一个clsact类型的qdisc,并且将流量全部定位到这个qdisc中:

clang -g -O2 -Wall -target bpf -I ~/iproute2/include/ -c tc-example.c -o tc-example.o
# 创建一个clsact类型的qdisc作为root根qdisc,然后加载ebpf程序到发送方向
tc qdisc add dev enp3s0 clsact
tc filter add dev enp3s0 egress bpf da obj tc-example.o sec egress
# 通过filter show可以查看到网卡在egress上家在的ebpf程序
tc filter show dev enp3s0 egress

 



相关文章
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
Docker 容器
Docker网关冲突导致容器启动网络异常解决方案
当执行`docker-compose up`命令时,服务器网络可能因Docker创建新网桥导致IP段冲突而中断。原因是Docker默认的docker0网卡(172.17.0.1/16)与宿主机网络地址段重叠,引发路由异常。解决方法为修改docker0地址段,通过配置`/etc/docker/daemon.json`调整为非冲突段(如192.168.200.1/24),并重启服务。同时,在`docker-compose.yml`中指定网络模式为`bridge`,最后通过检查docker0地址、网络接口列表及测试容器启动验证修复效果。
1930 39
|
存储 缓存 分布式计算
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术,详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划,为您提供全面的技术解读。 作者:杨关锁,北京镜舟科技研发工程师
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
|
网络协议 Docker 容器
使用网络--容器互联
使用网络--容器互联
283 18
|
人工智能 Cloud Native 安全
从云原生到 AI 原生,网关的发展趋势和最佳实践
本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三)在云栖大会的精彩分享。讲师深入浅出的分享了软件架构演进过程中,网关所扮演的各类角色,AI 应用的流量新特征对软件架构和网关所提出的新诉求,以及基于阿里自身实践所带来的开源贡献和商业能力。
1310 116
|
人工智能 运维 监控
阿里云携手神州灵云打造云内网络性能监测标杆 斩获中国信通院高质量数字化转型十大案例——金保信“云内网络可观测”方案树立云原生运维新范式
2025年,金保信社保卡有限公司联合阿里云与神州灵云申报的《云内网络性能可观测解决方案》入选高质量数字化转型典型案例。该方案基于阿里云飞天企业版,融合云原生引流技术和流量“染色”专利,解决云内运维难题,实现主动预警和精准观测,将故障排查时间从数小时缩短至15分钟,助力企业降本增效,形成可跨行业复制的数字化转型方法论。
820 6
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
969 15
|
容灾 网络协议 数据库
云卓越架构:云上网络稳定性建设和应用稳定性治理最佳实践
本文介绍了云上网络稳定性体系建设的关键内容,包括面向失败的架构设计、可观测性与应急恢复、客户案例及阿里巴巴的核心电商架构演进。首先强调了网络稳定性的挑战及其应对策略,如责任共担模型和冗余设计。接着详细探讨了多可用区部署、弹性架构规划及跨地域容灾设计的最佳实践,特别是阿里云的产品和技术如何助力实现高可用性和快速故障恢复。最后通过具体案例展示了秒级故障转移的效果,以及同城多活架构下的实际应用。这些措施共同确保了业务在面对网络故障时的持续稳定运行。
|
Kubernetes Cloud Native Ubuntu
庆祝 .NET 9 正式版发布与 Dapr 从 CNCF 毕业:构建高效云原生应用的最佳实践
2024年11月13日,.NET 9 正式版发布,Dapr 从 CNCF 毕业,标志着云原生技术的成熟。本文介绍如何使用 .NET 9 Aspire、Dapr 1.14.4、Kubernetes 1.31.0/Containerd 1.7.14、Ubuntu Server 24.04 LTS 和 Podman 5.3.0-rc3 构建高效、可靠的云原生应用。涵盖环境准备、应用开发、Dapr 集成、容器化和 Kubernetes 部署等内容。
977 6

热门文章

最新文章