ip-masq-agent 说明

最近更新时间:2025-07-15 17:59:42

我的收藏

简介

ip-masq-agent 是腾讯云容器服务 TKE 提供的网络组件,该组件以 DaemonSet 形式部署到 TKE 标准集群中的每个节点(除超级节点外),并下发 iptables 规则实现 Pod 出访数据包的 IP 伪装(IP Masquerade)。

IP 伪装简介

IP 伪装是源网络地址转换(SNAT)的一种形式。源地址转换是内网地址向外访问时,发起访问的内网 IP 地址转换为指定的 IP 地址,这可以使得内网多个地址转换成一个地址向外访问。
在 TKE 集群中,IP 伪装适用于所有 Pod 发出的数据包。ip-masq-agent 会下发 iptables 规则到每个节点,Pod 发出的数据包经过 IP 伪装后,源 IP 地址会从 Pod IP 地址转换成所在节点的 IP 地址。
如下图,假设 Pod 外访目标 IP 为 8.8.8.8,其完整的出访链路经过 IP 伪装为:


部署在集群内的 Kubernetes 对象

Kubernetes 对象名称
类型
默认占用资源
所属 Namespaces
ip-masq-agent-config
ConfigMap
-
kube-system
ip-masq-agent
DaemonSet
-
kube-system

使用场景

TKE 标准集群使用全局路由(Global Router)网络模式,Pod 访问非本 VPC 的网段(如外部互联网)需做源地址转换成节点 IP 地址,再利用节点 IP 所在的网络进行外访。由于全局路由网络模式的 Pod 无法绑定弹性公网 IP 和使用 NAT 网关,因此此网络模式的 Pod 外访必须使用 IP 伪装能力。
TKE 集群中,其他需要使用节点 IP 地址访问的场景,如鉴权,访问控制等。

使用方法

ip-masq-agent 配置项说明

ip-masq-agent 的配置项以 ConfigMap 形式保存在集群的 kube-system 命名空间中,配置会定期热加载到组件当中,热加载的时间间隔取决于配置中的 ResyncInterval。
其配置值必须使用 YAML 或 JSON 格式编写,如下为一个简单的样例:
apiVersion: v1
data:
config: |
NonMasqueradeCIDRs:
- 192.168.0.0/16
NonMasqueradeSrcCIDRs:
- 10.0.0.0/12
MasqLinkLocal: true
MasqLinkLocalIPv6: false
ResyncInterval: 1m0s
kind: ConfigMap
metadata:
name: ip-masq-agent-config
namespace: kube-system
NonMasqueradeCIDRs:字符串列表,可填写网段 CIDR,Pod 访问这些目的网段将不会做 IP 伪装。
NonMasqueradeSrcCIDRs(v2.6.2及以上版本支持):字符串列表,可填写网段 CIDR,集群内这些源网段的 Pod 发出的数据包将不会做 IP 伪装。
MasqLinkLocal:布尔值 (true / false),表示集群内的 Pod 访问本地链路 169.254.0.0/16 是否做 IP 伪装。
MasqLinkLocalIPv6: 布尔值 (true / false),表示集群内的 Pod 以 IPv6 协议访问本地链路 fe80::/10 是否做 IP 伪装。
ResyncInterval:重新热加载配置的时间间隔,默认为"1m0s",表示每 60 秒加载配置并下发对应的 IP 伪装规则。

修改配置使得 Pod 访问某网段(如 10.0.0.0/12)不做 IP 伪装

1. 集群中通过 Kubernetes API 修改 ip-masq-agent-config。
kubectl -nkube-system edit cm ip-masq-agent-config
2. 将10.0.0.0/12 加入到 NonMasqueradeCIDRs 当中:

3. 输入":wq" 保存退出。
4. 等待1分钟左右(取决于配置的 ResyncInterval)生效,可查看组件日志确认:


修改配置使得 Pod 访问所有网段不做 IP 伪装

集群为 VPC-CNI 网络模式下,可配置所有 Pod 外访不做 IP 伪装,只需在配置 NonMasqueradeCIDRs 中写入 0.0.0.0/0 即可,具体步骤参考同上。

最佳实践

由于 IP 伪装使用了系统的 iptables 能力,并加长了网络链路,因此对网络性能有一定损耗。所以,在非必要场景下,不推荐大量使用 IP 伪装的能力。以下针对 TKE 常见的网络模式场景给出一些最佳实践建议。

全局路由网络模式集群

由于全局路由网络模式的网段是 VPC 的虚拟网段,并不具有完整的 VPC 网络能力(如 NAT 网关),因此推荐在该模式集群中的非 IP 伪装目的网段(NonMasqueradeCIDRs)仅配置私有网段:
NonMasqueradeCIDRs:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
在该配置下,全局路由的 Pod 访问私有网段(通常为本 VPC 内网段或直接可达其他网段)不做 IP 伪装,以 Pod IP 为源 IP 访问。而访问非私有网段则会做 IP 伪装,以节点 IP 为源 IP 访问。

VPC-CNI 网络模式集群

由于 VPC-CNI 网络模式的 Pod 可使用 VPC 完整的网络能力,因此推荐在该模式下,Pod 尽量不使用 IP 伪装能力,新建 VPC-CNI 模式集群可不安装该组件,安装了之后也可将非 IP 伪装目的网段(NonMasqueradeCIDRs)配置为 0.0.0.0/0(此配置即所有网段都不做 IP 伪装)。

新增 VPC-CNI 容器子网时同步配置

由于 VPC-CNI 新增的容器子网可以在 VPC 的辅助网段中,而辅助网段在集群创建时可能不在 ip-masq-agent 的非 IP 伪装目的网段(NonMasqueradeCIDRs)中,因此大部分无需 IP 伪装功能的场景下,推荐新增 VPC-CNI 容器子网(操作入口:容器服务控制台 -> 点击集群ID进入具体的集群控制台 -> 节点和网络信息 -> 添加子网),同步配置 VPC 辅助网段到非 IP 伪装目的网段(NonMasqueradeCIDRs)中,若已配置 0.0.0.0/0 可忽略。
目前 TKE 支持添加容器子网时自动同步该配置,推荐在大部分无需 IP 伪装功能的场景下勾选(不勾选则保持原有配置):


全局路由+VPC-CNI 模式混用集群

混用模式下,全局路由网络模式的 Pod 访问非私有网段需要做 IP 伪装,而 VPC-CNI 模式的 Pod 访问任何网段都可不做 IP 伪装,因此推荐非 IP 伪装目的网段(NonMasqueradeCIDRs)配置私有网段,而非 IP 伪装源网段(NonMasqueradeSrcCIDRs)配置为 VPC 网段(不含全局路由网段),假设 VPC 网段为 172.16.0.0/16 和 10.16.0.0/16:
NonMasqueradeCIDRs:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
NonMasqueradeSrcCIDRs:
- 172.16.0.0/16
- 10.16.0.0/16
按以上方法配置后,全局路由的 Pod 访问私有网段不做 IP 伪装,以 Pod IP 为源 IP 访问。而访问非私有网段则会做 IP 伪装,以节点 IP 为源 IP 访问。VPC-CNI 模式的 Pod(源地址为 VPC 网段)访问任何网段都不做 IP 伪装。