《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——2.netfilter框架(下)

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: 《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——2.netfilter框架(下)

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

《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——2.netfilter框架(上):https://developer.aliyun.com/article/1221730?groupCode=supportservice


2) netfilter的常见应用

conntrack连接跟踪

conntrack是netfilter提供的核心功能之一,通过对tcp,udp等协议的连接状态的记录,来实现连接的会话状态保持的功能,例如:

 

对于iptables或者ipvs进行NAT操作,可以记录单个已经建立连接NAT信息,对于相同tcp连接,可以减少NAT操作中分配五元组计算频率,保持连接状态存续

对于没有建立完成连接,也不是握手请求情况,可以在不到conntrack情况下避免其进入协议栈,从而减少非必要消耗

在Linux中,我们可以借助conntrack-tools工具提供conntrack命令来管理conntrack操作,常见使用方法如下:

# 输出当前netns中所有的conntrack条目信息
conntrack -L
# 通过netlink stream的方式实时观察conntrack的写入事件
conntrack -E
# 查看按照cpu进行统计的conntrack数据
conntrack -S

 

conntrack在内核中也是通过注册在netfilter上的hook函数进行工作的,此外,conntrack机制还依赖于按照cpu的数量来为每一个cpu分配一块用于存放conntrack信息的内存,以下是conntrack机制在Linux上的实现:

 

static const struct nf_hook_ops ipv4_conntrack_ops[] = {
  {
    .hook   = ipv4_conntrack_in,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_PRE_ROUTING,
    .priority = NF_IP_PRI_CONNTRACK,
  },
  {
    .hook   = ipv4_conntrack_local,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_LOCAL_OUT,
    .priority = NF_IP_PRI_CONNTRACK,
  },
  {
    .hook   = ipv4_helper,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_POST_ROUTING,
    .priority = NF_IP_PRI_CONNTRACK_HELPER,
  },
  {
    .hook   = ipv4_confirm,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_POST_ROUTING,
    .priority = NF_IP_PRI_CONNTRACK_CONFIRM,
  },
  {
    .hook   = ipv4_helper,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_LOCAL_IN,
    .priority = NF_IP_PRI_CONNTRACK_HELPER,
  },
  {
    .hook   = ipv4_confirm,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_LOCAL_IN,
    .priority = NF_IP_PRI_CONNTRACK_CONFIRM,
  },
};

网络地址转换

NAT网络地址转换是netfilter框架提供的核心功能之一,NAT作为网络中非常重要的概念,在云原生场景下提供很多功能,包括:

在多种cni插件数据面设计中,依赖nat实现跨节点pod之间通信

通过nat实现service与pod之间负载均衡

 

iptables和ipvs都可以实现NAT功能,其中ipvs通常都是用于对目的地址进行NAT操作,也就是DNAT,iptables则具有包括masquerade在内的多种NAT组合而来的复杂功能,例如,在默认的docker容器访问公网的场景中,为了能够让节点内的,只有内网地址的docker容器可以正常访问公网,就需要添加如下的一条规则:

# 对于从eth0出节点的流量,访问目的为123.12.23.43的,自动将源地址切换为节点的出公网地址
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 123.12.23.43

 

iptables的NAT有多个实现,目前版本较新并且被广泛采用的是基于nft的iptables,对于IPv4协议,nft实现的NAT功能在netfilter中注册的hook方法有如下几个:

static const struct nf_hook_ops nf_nat_ipv4_ops[] = {
  /* Before packet filtering, change destination */
  {
    .hook   = nf_nat_ipv4_in,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_PRE_ROUTING,
    .priority = NF_IP_PRI_NAT_DST,
  },
  /* After packet filtering, change source */
  {
    .hook   = nf_nat_ipv4_out,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_POST_ROUTING,
    .priority = NF_IP_PRI_NAT_SRC,
  },
  /* Before packet filtering, change destination */
  {
    .hook   = nf_nat_ipv4_local_fn,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_LOCAL_OUT,
    .priority = NF_IP_PRI_NAT_DST,
  },
  /* After packet filtering, change source */
  {
    .hook   = nf_nat_ipv4_fn,
    .pf   = NFPROTO_IPV4,
    .hooknum  = NF_INET_LOCAL_IN,
    .priority = NF_IP_PRI_NAT_SRC,
  },
};

 2) netfilter在云原生中的应用

基于ipvs实现Service

ipvs是基于netfilter框架实现的Linux内核态负载均衡器,通过DNAT方式来实现负载均衡,在云原生场景下,由于性能上的优势,ipvs是实现Service功能的首选,我们可以通过以下命令来简单的查看Service真正产生在网络数据面的ipvs规则:

# 查看ipvs connection信息,在出节点是,ipvs connection是独立并且优先于conntrack机制的选择,即流量会优先匹配到ipvs的规则,如果没有命中,才会进入conntrack的匹配逻辑
ipvsadm -Lnc
# 添加一个service 192.168.1.100:80,将192.168.1.123作为他的一个real server后端
ipvsadm -A -t 192.168.1.100:80 -s rr
ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 2
# 查看不同的ipvs service的数据统计
ipvsadm -Ln --stats

基于iptables实现NetworkPolicy

NetworkPolicy是云原生网络中非常重要的网络功能,其核心在于如何对流量进行权限管理,通常cni插件会采用iptables队policy未放行的流量进行屏蔽操作,实现NetworkPolicy的功能。

 

ipables实现NetworkPolicy功能的数据面原理非常简单,通过白名单放行的方式,默认丢弃所有流量,只允许白名单中的流量,即可实现简单的NetworkPolicy功能,我们可以通过以下几个命令简单模拟iptables实现的NetworkPolicy:

# 默认丢弃所有流量
iptables -A INPUT -j DROP
# 将192.168.1.100的80端口进行放行
iptables -A INPUT -s 192.168.1.100 -p tcp -m tcp --dport 80 -j ACCEPT

 

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
3天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
3天前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
25 6
|
11天前
|
机器学习/深度学习 人工智能
类人神经网络再进一步!DeepMind最新50页论文提出AligNet框架:用层次化视觉概念对齐人类
【10月更文挑战第18天】这篇论文提出了一种名为AligNet的框架,旨在通过将人类知识注入神经网络来解决其与人类认知的不匹配问题。AligNet通过训练教师模型模仿人类判断,并将人类化的结构和知识转移至预训练的视觉模型中,从而提高模型在多种任务上的泛化能力和稳健性。实验结果表明,人类对齐的模型在相似性任务和出分布情况下表现更佳。
25 3
|
3天前
|
Kubernetes 负载均衡 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第27天】Kubernetes(简称K8s)是云原生应用的核心容器编排平台,提供自动化、扩展和管理容器化应用的能力。本文介绍Kubernetes的基本概念、安装配置、核心组件(如Pod和Deployment)、服务发现与负载均衡、网络配置及安全性挑战,帮助读者理解和实践Kubernetes在容器编排中的应用。
18 4
|
2天前
|
Cloud Native 持续交付 云计算
云原生入门指南:从容器到微服务
【10月更文挑战第28天】在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本篇文章将带你了解云原生的基本概念,探索它如何通过容器化、微服务架构以及持续集成和持续部署(CI/CD)的实践来提升应用的可伸缩性、灵活性和可靠性。你将学习到如何利用这些技术构建和部署在云端高效运行的应用,并理解它们对DevOps文化的贡献。
12 2
|
4天前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
21 4
|
4天前
|
Kubernetes 监控 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第26天】随着云计算技术的发展,容器化成为现代应用部署的核心趋势。Kubernetes(K8s)作为容器编排领域的佼佼者,以其强大的可扩展性和自动化能力,为开发者提供了高效管理和部署容器化应用的平台。本文将详细介绍Kubernetes的基本概念、核心组件、实践过程及面临的挑战,帮助读者更好地理解和应用这一技术。
21 3
|
4天前
|
网络协议 物联网 API
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
20 1
|
7天前
|
运维 Kubernetes Cloud Native
云原生入门:Kubernetes和容器化的未来
【10月更文挑战第23天】本文将带你走进云原生的世界,探索Kubernetes如何成为现代软件部署的心脏。我们将一起揭开容器化技术的神秘面纱,了解它如何改变软件开发和运维的方式。通过实际的代码示例,你将看到理论与实践的结合,感受到云原生技术带来的革命性影响。无论你是初学者还是有经验的开发者,这篇文章都将为你开启一段新的旅程。让我们一起踏上这段探索之旅,解锁云原生技术的力量吧!
|
22天前
|
缓存 监控 测试技术
掌握容器化持续集成/持续部署(CI/CD)的最佳实践
【10月更文挑战第8天】本文介绍了容器化持续集成/持续部署(CI/CD)的最佳实践,涵盖容器化CI/CD的概念、优势和实施步骤。通过使用容器技术,可以实现环境一致性、快速迭代和易于扩展,提高软件开发的效率和可靠性。文章还详细讨论了编写高效的Dockerfile、自动化测试、安全性、监控和日志管理等方面的最佳实践。

热门文章

最新文章