《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——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

 



相关文章
|
3月前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
2月前
|
人工智能 弹性计算 运维
ACK Edge与IDC:高效容器网络通信新突破
本文介绍如何基于ACK Edge以及高效的容器网络插件管理IDC进行容器化。
|
1月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
95 15
|
1月前
|
容灾 网络协议 数据库
云卓越架构:云上网络稳定性建设和应用稳定性治理最佳实践
本文介绍了云上网络稳定性体系建设的关键内容,包括面向失败的架构设计、可观测性与应急恢复、客户案例及阿里巴巴的核心电商架构演进。首先强调了网络稳定性的挑战及其应对策略,如责任共担模型和冗余设计。接着详细探讨了多可用区部署、弹性架构规划及跨地域容灾设计的最佳实践,特别是阿里云的产品和技术如何助力实现高可用性和快速故障恢复。最后通过具体案例展示了秒级故障转移的效果,以及同城多活架构下的实际应用。这些措施共同确保了业务在面对网络故障时的持续稳定运行。
|
1月前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
2月前
|
Kubernetes 安全 数据安全/隐私保护
云卓越架构:容器安全最佳实践
本次分享由阿里云智能集团解决方案架构师张玉峰主讲,主题为“云卓越架构:容器安全最佳实践”。内容涵盖容器安全的挑战、云原生容器安全架构及典型场景。首先分析了容器安全面临的问题,如镜像漏洞和权限管理。接着介绍了容器安全架构的五个维度:身份权限管理、配置安全检查、运行时防护、镜像安全检测及发布的安全管控。最后通过具体场景展示了容器身份与权限管理、密钥管理、运行时防入侵等最佳实践,强调了安全左移的重要性,确保从开发到运行的全生命周期安全覆盖。
|
2月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
232 7
|
4月前
|
人工智能 Cloud Native 安全
从云原生到 AI 原生,网关的发展趋势和最佳实践
本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三)在云栖大会的精彩分享。讲师深入浅出的分享了软件架构演进过程中,网关所扮演的各类角色,AI 应用的流量新特征对软件架构和网关所提出的新诉求,以及基于阿里自身实践所带来的开源贡献和商业能力。
358 14
|
3月前
|
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 部署等内容。
133 5
|
4月前
|
监控 Cloud Native 持续交付
云原生架构下微服务的最佳实践与挑战####
【10月更文挑战第20天】 本文深入探讨了云原生架构在现代软件开发中的应用,特别是针对微服务设计模式的最优实践与面临的主要挑战。通过分析容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,阐述了如何高效构建、部署及运维微服务系统。同时,文章也指出了在云原生转型过程中常见的难题,如服务间的复杂通信、安全性问题以及监控与可观测性的实现,为开发者和企业提供了宝贵的策略指导和解决方案建议。 ####
71 5

热门文章

最新文章