简介
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: v1data:config: |NonMasqueradeCIDRs:- 192.168.0.0/16NonMasqueradeSrcCIDRs:- 10.0.0.0/12MasqLinkLocal: trueMasqLinkLocalIPv6: falseResyncInterval: 1m0skind: ConfigMapmetadata:name: ip-masq-agent-confignamespace: 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/16NonMasqueradeSrcCIDRs:- 172.16.0.0/16- 10.16.0.0/16
按以上方法配置后,全局路由的 Pod 访问私有网段不做 IP 伪装,以 Pod IP 为源 IP 访问。而访问非私有网段则会做 IP 伪装,以节点 IP 为源 IP 访问。VPC-CNI 模式的 Pod(源地址为 VPC 网段)访问任何网段都不做 IP 伪装。