kubernetes工作原理(二)-iptables

本文深入解析iptables的基本概念,包括其chain、table和rule的工作原理,以及在数据包处理流程中的关键作用。阐述了filter、nat、mangle和raw表的功能特点,以及PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING链的作用。同时,详细介绍了connectiontracking机制和数据包在iptables中的处理流程。

前言

虚拟化的网络可以自由的在本地进行基于单机的网络配置或者借助一些互联技术(underlay、overlay或者点对点技术)在虚拟网络内部空间实现跨节点和数据中心的网络互联,但是如果虚拟网络内部的服务要对外进行暴露,就不得不借助地址转换或者端口转换等数据包修改技术。而在现有的container管理框架中,iptables更是承担了服务暴露和服务后端负载均衡等功能,是诸如kubernetes、Openshift等平台上很重要的组成模块。

 

iptables基本概念

 

1)iptables的chain、table和rule

iptables基本概念包括五个链、四个表和若干规则。链由一些列规则组成、表则由一系列链组成。

五个链分别是PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING

四个表分别是filter、nat、mangle、raw

4个表的优先级由高到低的顺序为:raw > mangle > nat > filter

 

2)四个表的功能特点

filter表:匹配数据包以进行过滤

nat表:修改数据包进行地址或者端口的转换

mangle表:用于修改数据包IP头信息中TOS、TTL、或者对数据包进行Mark以实现QoS或者特定路由策略

raw表:不经过iptables的状态跟踪功能而进行快速处理(iptables是一个有状态的系统,会在raw表之后mangle表之前,对数据包进行connection tracking,而由于raw表是优先级最高的表,数据包如果满足raw表的内容匹配之后,便不会再经过后续connection tracking和地址端口转换等操作,可以提高特定类型包的处理效率)

 

3)五个链的功能特点

PREROUTING,作用在数据包进入内核网络模块之后,获得路由之前

INPUT,作用在数据包被决定路由到本机之后

FORWARD,作用在数据包被决定路由到其他主机之后

OUTPUT,作用在离开本机的数据包进入内核网络模块之后

POSTROUTING,作用在对于离开本机或者FORWARD的数据包,当数据包被发送到网络之后

 

4)链、表、路由和连接跟踪的组合关系

关于connection tracking

很多iptables的功能需要借助connection tracking实现,所以当数据包经过iptables在raw表处理之后mangle表处理之前,会进行connection tracking处理,从iptables的connection tracking机制可以得知当前数据包所对应的连接的状态:

  • NEW,该包请求一个新连接,现在没有对应该数据包的连接
  • ESTABLISHED,数据包已经属于某个连接
  • RELATED,数据包已经属于某个连接,但是又请求一个新连接
  • INVALID,数据包不属于任何连接

 

/proc/net/ip_conntrack里面保存了所有被跟踪的连接,单个纪录如下:

tcp 4 202713 ESTABLISHED src=192.168.166.103 dst=192.168.166.101 sport=3377 dport=11232 packets=22 bytes=17720 src=192.168.166.101 dst=192.168.166.103 sport=11232 dport=22 packets=92 bytes=4490 [ASSURED] mark=0 secmark=0 use=1

 

可以通过ip_conntrack_max和ip_conntrack timeout来调整系统connection tracking的能力:

net.ipv4.ip_conntrack_max =

net.ipv4.netfilter.ip_conntrack_max =

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established =

net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait =

net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait =

net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait =

可以在raw表里面设置-j NOTRACK跳过其它表和connection tracking处理,比如:

iptables -t raw -A PREROUTING -d A.B.C.D -p tcp --dport 80 -j NOTRACK

 

 

数据包流程

1)进入的数据包

在数据包由网卡进入协议栈之后,会依次经由raw、connectiong tracking、mangle、nat三个表的PREROUTING链进行处理,并进行路由选择。路由结果如果是给本机的,则经由mangle、filter两个表的INPUT链处理之后发给上层应用程序;如果是要转发给其它主机的,则会经过mangle、filter两个表的FORWAR链处理之后,再经由mangel、nat表的POSTROUTING链处理之后由网卡对外发送

 

2)出去的数据包

数据包由上层应用程序进入协议栈之后现进行路由选择,然后经由raw、connectiong tracking、mangle、nat、filter表的OUTPUT链的处理,再经由mangel、nat表的POSTROUTING链处理之后由网卡对外发

 

iptables包处理流程参考:

https://en.wikipedia.org/wiki/File:Netfilter-packet-flow.svg

 

<think>我们正在处理用户关于kubeadm初始化时遇到的错误:/proc/sys/net/bridge/bridge-nf-call-iptables内容未设置为1。根据引用[1]和引用[2]中的信息,解决这个错误的方法是设置/proc/sys/net/bridge/bridge-nf-call-iptables的值为1。引用[2]中明确给出了解决方案:运行命令 `echo1 >/proc/sys/net/bridge/bridge-nf-call-iptables`此外,引用[1]还提到可以通过修改sysctl配置文件来永久设置,但用户当前可能只需要临时解决以继续初始化。同时,我们注意到引用[2]中还提到了其他可能的问题,比如docker服务未启用、主机名问题等,但用户当前只询问了关于bridge-nf-call-iptables的错误。因此,我们将针对这个错误提供解决方案,并建议用户检查其他可能的问题。另外,引用[3]提到了一个关于keadm join的错误,但似乎与当前问题无关,因此我们暂时忽略。步骤:1.临时解决方法:直接写入/proc文件系统(重启后失效)2.永久解决方法:修改sysctl配置文件,然后重新加载sysctl设置根据引用[1]中提到的配置文件位置(/etc/sysctl.d/k8s.conf),我们可以指导用户创建或修改该配置文件。注意:用户可能需要使用sudo权限执行命令。我们将按照以下结构回答:-解释错误原因-提供临时解决方案-提供永久解决方案-建议用户检查其他相关设置(如docker服务、主机名等,但仅作为提醒,因为用户当前只问了这个错误)同时,根据指令要求,我们需要生成相关问题。注意:所有行内数学表达式使用$...$,独立公式使用$$...$$(但本问题中可能没有数学公式,所以忽略),使用中文回答,并在引用末尾添加引用标识。</think>### Kubernetes 初始化错误解决方案:`bridge-nf-call-iptables`未设置 当执行 `kubeadm init` 时遇到错误 `/proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1`,这是由于 Linux 内核的网络桥接过滤规则未正确配置导致的。以下是详细解决方法: #### 🔧 解决方案步骤 1. **临时生效方案(重启失效)** 执行命令立即生效: ```bash sudo echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables sudo echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables ``` *验证命令*:`cat /proc/sys/net/bridge/bridge-nf-call-iptables` 应返回 `1`[^2]。 2. **永久生效方案(推荐)** 修改系统配置文件: ```bash sudo tee /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF ``` 加载配置并验证: ```bash sudo sysctl --system # 加载所有配置文件 sudo sysctl -p /etc/sysctl.d/k8s.conf # 单独加载k8s配置 ``` #### ⚠️ 注意事项 1. **依赖模块检查** 确保 `br_netfilter` 模块已加载: ```bash sudo modprobe br_netfilter # 立即加载 echo "br_netfilter" | sudo tee /etc/modules-load.d/br_netfilter.conf # 开机自动加载 ``` 2. **常见关联错误处理** - **Docker 未启用**:运行 `sudo systemctl enable docker.service`[^2] - **主机名解析问题**:使用 `hostnamectl set-hostname <新主机名>` 修改[^2] - **CA 证书错误**:检查 API Server 地址是否正确(避免使用内部 IP)[^3] #### 💻 操作示例 ```bash # 完整修复流程示例 sudo modprobe br_netfilter sudo tee /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sudo sysctl --system sudo systemctl enable docker.service hostnamectl set-hostname k8s-master # 替换实际主机名 ``` > **重要**:修复后需**重启节点**确保所有配置生效,再重新执行 `kubeadm init`。 --- ### 📚 相关问题 1. Kubernetes 初始化时如何解决 `[ERROR FileContent--proc-sys-net-ipv4-ip_forward]` 错误? 2. `kubeadm init` 失败后如何安全地重置集群环境? 3. 如何验证 Kubernetes 节点的网络配置是否符合要求? 4. 为什么 Kubernetes 需要启用 `br_netfilter` 模块?其工作原理是什么? [^1]: 错误提示明确要求设置 `/proc/sys/net/bridge/bridge-nf-call-iptables=1`,否则会阻断初始化流程 [^2]: 临时修改 `/proc` 文件可快速修复,但永久方案需通过 `sysctl` 配置,同时需处理 Docker 服务和主机名问题 [^3]: 网络配置错误可能导致衍生问题(如 CA 证书获取失败),需确保网络可达性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值