CCE 集群内容器访问集群外服务
在 VPC Route 网络模式下, Pod 的 IP 地址网段通常与节点 IP 地址网段不同。
在集群默认配置下,当非 HostNetwork 网络模式的 Pod 访问私有 IP 地址段内的 IP (10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16)时,数据包的源 IP 是 Pod IP。这导致当访问目的地址是集群外的虚机或服务时,会出现网络不通的情况。
对于这些情况,我们需要配置 ip-masq-agent
以满足网络访问需求。
关键术语
- NAT (网络地址解析) 是一种通过修改 IP 地址头中的源和/或目标地址信息将一个 IP 地址重新映射到另一个 IP 地址的方法。通常由执行 IP 路由的设备执行。
- Masquerade NAT 的一种形式,通常用于执行多对一地址转换,其中多个源 IP 地址被隐藏在单个地址后面,该地址通常是执行 IP 路由的设备。在 Kubernetes 中,这是节点的 IP 地址。
- CIDR (无类别域间路由) 基于可变长度子网掩码,允许指定任意长度的前缀。CIDR 引入了一种新的 IP 地址表示方法,现在通常称为CIDR表示法,其中地址或路由前缀后添加一个后缀,用来表示前缀的位数,例如 192.168.2.0/24。
原理介绍
ip-masq-agent
以 daemonset 形式部署,在每个节点上启动一个代理程序。代理程序通过配置 iptables 规则,在将容器流量发送到集群节点的 IP 和集群 IP 范围之外的目标时, 可以选择以容器自己的 IP 地址或伪装成节点的 IP 地址作为出向流量的源地址。代理程序为每隔 60 秒从 /etc/config/ip-masq-agent 重新加载其配置,更新 iptables 规则。
代理程序配置的的 iptables 规则是在 POSTROUTING 链上添加自定义链 IP-MASQ-AGENT, 通过判断 IP-MASQ-AGENT 链中每一条规则是否匹配,来决定出向流量是否需要进行伪装。
CCE 集群默认部署 ip-masq-agent
组件。默认情况下,代理配置为将 RFC 1918 指定的三个私有 IP 范围视为非伪装 CIDR。 这些范围是 10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16。 默认情况下,代理程序还将链路本地地址(169.254.0.0/16)视为非伪装 CIDR。
高级配置
ip-masq-agent
的配置来自于 configMap,可以通过 kubectl edit cm cce-ip-masq-agent -n kube-system
来查看或修改配置。修改完配置后,过一段时间后(默认配置下约 60s)配置生效,代理程序会自动更新 iptables 规则。
常用的配置选项如下:
- masqueradeCIDRs []string: 用于指定伪装范围
- nonMasqueradeCIDRs []string: 用于指定非伪装范围
- masqOutBound bool: 排除 IPv4 nonMasqueradeCIDRs,是否伪装其他所有范围
- masqOutBoundIPv6 bool: 排除 IPv6 nonMasqueradeCIDRs,是否伪装其他所有范围
- masqLinkLocal bool: 是否伪装到的流量 169.254.0.0/16
- masqLinkLocalIPv6 bool: 是否伪装到的流量 fe80::/10
- resyncInterval string: 代理重新加载配置的时间间隔
需要说明的是,IP-MASQ-AGENT 链中,masqueradeCIDRs 生成的规则总是在 nonMasqueradeCIDRs 生成的规则之前,配置 masqueradeCIDRs 通常是为了针对 nonMasqueradeCIDRs 中某个 IP 地址或者网段进行伪装。也就是说,masqueradeCIDRs 配置优先于 nonMasqueradeCIDRs 配置,而 nonMasqueradeCIDRs 配置优先于 masqOutBound 配置。
常见场景
Pod 访问同 VPC 内集群外的 IP 地址
在一个 VPC 内,除了 CCE 集群节点,还有很多不在集群内的虚机或服务。
这些虚机或服务的安全组有时仅允许源 IP 在 VPC 地址段内的数据包通过。
而当 Pod 访问这些虚机或服务时,数据包以 Pod IP 作为源 IP,而 Pod IP 地址段一般与 VPC 地址段不同,这导致数据包被目的虚机或服务的安全组丢弃。
因此,我们需要对 ip-masq-agent
的 masqueradeCIDRs
字段进行配置,使 Pod 访问这些虚机时 SNAT 成所在节点的 IP 进行访问。
例如网络拓扑中, 10.10.10.10
是某个 BCC 的地址。配置参考:
Pod 访问对等连接 VPC 内的 IP 地址
在 2 个 VPC 建立对等连接之后,在默认集群网络配置下,当 VPC-1 中的 Pod 访问对端 VPC-2 内的地址时,源 IP 为 Pod IP。当目的机器收到数据包并发出回包时,目的 IP 是 Pod IP,由于 Pod IP 地址段与 VPC-1 的地址段并不一致,此时可能因为缺少该 Pod 地址段的对等连接路由,而导致回包丢失。
因此,我们需要对 ip-masq-agent
进行配置,使 Pod 访问这些虚机时 SNAT 成所在节点的 IP 进行访问,让数据包可以顺利通过对等连接网关。
例如网络拓扑中, 10.10.10.10
是对等连接中集群所在 VPC 的对端 VPC 中的某个 BCC 的地址。我们需要设置 ip-masq-agent
的 masqueradeCIDRs
字段,配置参考:
Pod 访问公网地址
容器以节点的 IP 访问公网
当我们为节点配置公网 IP 之后,该节点上的 Pod 就可以 SNAT 成节点的 IP 地址来访问公网。
在这种情况下,我们需要配置 ip-masq-agent
的 masqOutBound
属性为 true
,示例参考:
容器配合 NAT 网关以网关 IP 访问公网
除了为单个节点配置公网 IP 之外,我们还可以通过 NAT 网关与 VPC 路由牵引的方式让 Pod 访问公网。
在这种情况下,示例配置参考: