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

 



相关文章
|
1月前
|
负载均衡 容灾 Cloud Native
云原生应用网关进阶:阿里云网络ALB Ingress 全能增强
在过去半年,ALB Ingress Controller推出了多项高级特性,包括支持AScript自定义脚本、慢启动、连接优雅中断等功能,增强了产品的灵活性和用户体验。此外,还推出了ingress2Albconfig工具,方便用户从Nginx Ingress迁移到ALB Ingress,以及通过Webhook服务实现更智能的配置校验,减少错误配置带来的影响。在容灾部署方面,支持了多集群网关,提高了系统的高可用性和容灾能力。这些改进旨在为用户提供更强大、更安全的云原生网关解决方案。
580 19
|
1月前
|
人工智能 运维 监控
容器服务Kubernetes场景下可观测体系生产级最佳实践
阿里云容器服务团队在2024年继续蝉联Gartner亚洲唯一全球领导者象限,其可观测体系是运维的核心能力之一。该体系涵盖重保运维、大规模集群稳定性、业务异常诊断等场景,特别是在AI和GPU场景下提供了全面的观测解决方案。通过Tracing、Metric和Log等技术,阿里云增强了对容器网络、存储及多集群架构的监控能力,帮助客户实现高效运维和成本优化。未来,结合AI助手,将进一步提升问题定位和解决效率,缩短MTTR,助力构建智能运维体系。
|
1月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
100 15
|
2月前
|
Kubernetes 安全 数据安全/隐私保护
云卓越架构:容器安全最佳实践
本次分享由阿里云智能集团解决方案架构师张玉峰主讲,主题为“云卓越架构:容器安全最佳实践”。内容涵盖容器安全的挑战、云原生容器安全架构及典型场景。首先分析了容器安全面临的问题,如镜像漏洞和权限管理。接着介绍了容器安全架构的五个维度:身份权限管理、配置安全检查、运行时防护、镜像安全检测及发布的安全管控。最后通过具体场景展示了容器身份与权限管理、密钥管理、运行时防入侵等最佳实践,强调了安全左移的重要性,确保从开发到运行的全生命周期安全覆盖。
|
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 部署等内容。
140 5
|
3月前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
3月前
|
Kubernetes Cloud Native 持续交付
云原生架构下的微服务设计原则与最佳实践##
在数字化转型的浪潮中,云原生技术以其高效、灵活和可扩展的特性成为企业IT架构转型的首选。本文深入探讨了云原生架构的核心理念,聚焦于微服务设计的关键原则与实施策略,旨在为开发者提供一套系统性的方法论,以应对复杂多变的业务需求和技术挑战。通过分析真实案例,揭示了如何有效利用容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,构建高性能、易维护的云原生应用。文章还强调了文化与组织变革在云原生转型过程中的重要性,为企业顺利过渡到云原生时代提供了宝贵的见解。 ##
|
4月前
|
监控 Cloud Native 持续交付
云原生架构下微服务的最佳实践与挑战####
【10月更文挑战第20天】 本文深入探讨了云原生架构在现代软件开发中的应用,特别是针对微服务设计模式的最优实践与面临的主要挑战。通过分析容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,阐述了如何高效构建、部署及运维微服务系统。同时,文章也指出了在云原生转型过程中常见的难题,如服务间的复杂通信、安全性问题以及监控与可观测性的实现,为开发者和企业提供了宝贵的策略指导和解决方案建议。 ####
74 5
|
4月前
|
存储 运维 监控
云原生应用的可观察性:理解、实现与最佳实践
【10月更文挑战第10天】随着云原生技术的发展,可观察性成为确保应用性能和稳定性的重要因素。本文探讨了云原生应用可观察性的概念、实现方法及最佳实践,包括监控、日志记录和分布式追踪的核心组件,以及如何通过选择合适的工具和策略来提升应用的可观察性。
|
4月前
|
缓存 监控 测试技术
掌握容器化持续集成/持续部署(CI/CD)的最佳实践
【10月更文挑战第8天】本文介绍了容器化持续集成/持续部署(CI/CD)的最佳实践,涵盖容器化CI/CD的概念、优势和实施步骤。通过使用容器技术,可以实现环境一致性、快速迭代和易于扩展,提高软件开发的效率和可靠性。文章还详细讨论了编写高效的Dockerfile、自动化测试、安全性、监控和日志管理等方面的最佳实践。

热门文章

最新文章