《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——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月前
|
安全 Linux 网络虚拟化
关于容器云的三种网络设计
【2月更文挑战第9天】容器网络设计:隧道、路由、VLAN。
|
1月前
|
Cloud Native Linux 网络虚拟化
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
在Linux网络虚拟化领域,虚拟以太网设备(veth)扮演着至关重要的角色🌐。veth是一种特殊类型的网络设备,它在Linux内核中以成对的形式存在,允许两个网络命名空间之间的通信🔗。这篇文章将从多个维度深入分析veth的概念、作用、重要性,以及在容器和云原生环境中的应用📚。
深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性
|
2天前
|
运维 安全 Linux
深入理解Docker自定义网络:构建高效的容器网络环境
深入理解Docker自定义网络:构建高效的容器网络环境
|
16天前
|
Kubernetes Cloud Native 持续交付
构建高效云原生应用:容器化与微服务架构的融合
【4月更文挑战第24天】 随着云计算的不断演进,云原生技术已成为企业数字化转型的核心动力。本文深入探讨了如何通过容器化技术和微服务架构的融合,构建高效、可扩展且易于管理的云原生应用。我们分析了容器化带来的隔离性和可移植性优势,以及微服务架构在提升系统灵活性和促进团队协作方面的重要作用。文章还提供了实施策略,包括选择合适的容器平台、确保服务间通信的安全性以及持续集成/持续部署(CI/CD)的实践,以帮助企业实现敏捷开发和快速迭代。
|
2月前
|
运维 Kubernetes 网络协议
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(服务治理与网络访问)
总结归纳Kubernetes | 一站式速查知识,助您轻松驾驭容器编排技术(服务治理与网络访问)
35 0
|
2月前
|
Cloud Native Shell Linux
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
云原生专题 | 【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)
19 0
|
2月前
|
Cloud Native Linux 虚拟化
云原生专题 |【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(底层实现系列)
云原生专题 |【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(底层实现系列)
53 0
|
2月前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
56 1
|
2月前
|
移动开发 安全 小程序
mpaas常见问题之小程序容器,跑起来后一直提示 "网络不给力, 请稍后再试"如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
24 0
|
2月前
|
Kubernetes 监控 Linux
容器服务ACK常见问题之新增一台CentOS 5.4内核的节点失败如何解决
容器服务ACK(阿里云容器服务 Kubernetes 版)是阿里云提供的一种托管式Kubernetes服务,帮助用户轻松使用Kubernetes进行应用部署、管理和扩展。本汇总收集了容器服务ACK使用中的常见问题及答案,包括集群管理、应用部署、服务访问、网络配置、存储使用、安全保障等方面,旨在帮助用户快速解决使用过程中遇到的难题,提升容器管理和运维效率。