《云原生网络数据面可观测性最佳实践》—— 一、容器网络内核原理——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应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
10天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
42 2
|
20天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
2天前
|
Kubernetes Cloud Native Docker
云原生之旅:从传统架构到容器化服务的演变
随着技术的快速发展,云计算已经从简单的虚拟化服务演进到了更加灵活和高效的云原生时代。本文将带你了解云原生的概念、优势以及如何通过容器化技术实现应用的快速部署和扩展。我们将以一个简单的Python Web应用为例,展示如何利用Docker容器进行打包和部署,进而探索Kubernetes如何管理这些容器,确保服务的高可用性和弹性伸缩。
|
12天前
|
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 部署等内容。
39 5
|
11天前
|
Kubernetes Cloud Native Docker
云原生技术探索:容器化与微服务的实践之道
【10月更文挑战第36天】在云计算的浪潮中,云原生技术以其高效、灵活和可靠的特性成为企业数字化转型的重要推手。本文将深入探讨云原生的两大核心概念——容器化与微服务架构,并通过实际代码示例,揭示如何通过Docker和Kubernetes实现服务的快速部署和管理。我们将从基础概念入手,逐步引导读者理解并实践云原生技术,最终掌握如何构建和维护一个高效、可扩展的云原生应用。
|
20天前
|
Kubernetes 负载均衡 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第27天】Kubernetes(简称K8s)是云原生应用的核心容器编排平台,提供自动化、扩展和管理容器化应用的能力。本文介绍Kubernetes的基本概念、安装配置、核心组件(如Pod和Deployment)、服务发现与负载均衡、网络配置及安全性挑战,帮助读者理解和实践Kubernetes在容器编排中的应用。
59 4
|
19天前
|
Cloud Native 持续交付 云计算
云原生入门指南:从容器到微服务
【10月更文挑战第28天】在数字化转型的浪潮中,云原生技术成为推动现代软件开发的关键力量。本篇文章将带你了解云原生的基本概念,探索它如何通过容器化、微服务架构以及持续集成和持续部署(CI/CD)的实践来提升应用的可伸缩性、灵活性和可靠性。你将学习到如何利用这些技术构建和部署在云端高效运行的应用,并理解它们对DevOps文化的贡献。
41 2
|
21天前
|
Kubernetes 监控 Cloud Native
云原生应用:Kubernetes在容器编排中的实践与挑战
【10月更文挑战第26天】随着云计算技术的发展,容器化成为现代应用部署的核心趋势。Kubernetes(K8s)作为容器编排领域的佼佼者,以其强大的可扩展性和自动化能力,为开发者提供了高效管理和部署容器化应用的平台。本文将详细介绍Kubernetes的基本概念、核心组件、实践过程及面临的挑战,帮助读者更好地理解和应用这一技术。
56 3
|
26天前
|
监控 Cloud Native 持续交付
云原生架构下微服务的最佳实践与挑战####
【10月更文挑战第20天】 本文深入探讨了云原生架构在现代软件开发中的应用,特别是针对微服务设计模式的最优实践与面临的主要挑战。通过分析容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,阐述了如何高效构建、部署及运维微服务系统。同时,文章也指出了在云原生转型过程中常见的难题,如服务间的复杂通信、安全性问题以及监控与可观测性的实现,为开发者和企业提供了宝贵的策略指导和解决方案建议。 ####
44 5
|
26天前
|
Kubernetes Cloud Native 持续交付
云原生架构下的微服务设计原则与最佳实践##
在数字化转型的浪潮中,云原生技术以其高效、灵活和可扩展的特性成为企业IT架构转型的首选。本文深入探讨了云原生架构的核心理念,聚焦于微服务设计的关键原则与实施策略,旨在为开发者提供一套系统性的方法论,以应对复杂多变的业务需求和技术挑战。通过分析真实案例,揭示了如何有效利用容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,构建高性能、易维护的云原生应用。文章还强调了文化与组织变革在云原生转型过程中的重要性,为企业顺利过渡到云原生时代提供了宝贵的见解。 ##