在 GKE 上使用 NAT + IP Masquerade 时 Cloud SQL 和其他外部服务超时

在 GKE 上使用 NAT + IP Masquerade 时 Cloud SQL 和其他外部服务超时

我必须在我的一个 POD 中配置一个静态 IP,因为远程服务(在我的集群之外)需要受信任的 IP 白名单。

我按照Google提供的文档进行操作:

https://cloud.google.com/nat/docs/overview?hl=es-419

https://cloud.google.com/kubernetes-engine/docs/how-to/ip-masquerade-agent

但是,当我尝试在我的 GKE 集群中使用 Google 云 NAT 服务配置出站流量并使用伪装时,ip-masq-agent在访问集群外的远程服务时我开始遇到超时和问题。

我的集群是版本1.19.10-gke.1600

我尝试了这些配置文件,结果如下:

resyncInterval: 60s

结果:

Chain IP-MASQ (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
MASQUERADE  all  --  anywhere             anywhere             /* ip-masq-agent: outbound traffic is sub
ject to MASQUERADE (must be last in chain) */

服务持续使用错误的 IP。


resyncInterval: 60s
masqLinkLocal: true

Chain IP-MASQ (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             169.254.0.0/16       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
MASQUERADE  all  --  anywhere             anywhere             /* ip-masq-agent: outbound traffic is sub
ject to MASQUERADE (must be last in the chain) */

同样的效果,我的外部服务获取了错误的IP。


nonMasqueradeCIDRs:
  - 0.0.0.0/0
resyncInterval: 60s
masqLinkLocal: true

Chain IP-MASQ (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere             /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
MASQUERADE  all  --  anywhere             anywhere             /* ip-masq-agent: outbound traffic is sub
ject to MASQUERADE (must be last in the chain) */

看起来效果更好,因为外部服务接收了正确的 IP,但我遇到了连接问题和超时。


这是我的 NAT 配置:

NAT mapping
- High availability: Yes
- Source subnets & IP ranges: All subnets' primary and secondary IP ranges
- NAT IP addresses: static-egress-ip XXX.XXX.XXX.XXX

我没有主意了,有人可以给我一些建议吗?


收到回复后,我更新了配置文件,按照谷歌云文档添加了 ips,文件内容如下:

nonMasqueradeCIDRs:
  - 10.0.0.0/8
  - 172.16.0.0/12
  - 192.168.0.0/16
  - 100.64.0.0/10
  - 192.0.0.0/24
  - 192.0.2.0/24
  - 192.88.99.0/24
  - 198.18.0.0/15
  - 198.51.100.0/24
  - 203.0.113.0/24
  - 240.0.0.0/4
resyncInterval: 60s
masqLinkLocal: true

在 iptables 中执行的结果如下:

Chain IP-MASQ (2 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             10.0.0.0/8           /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             172.16.0.0/12        /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.168.0.0/16       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             100.64.0.0/10        /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.0.0.0/24         /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.0.2.0/24         /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             192.88.99.0/24       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             198.18.0.0/15        /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             198.51.100.0/24      /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             203.0.113.0/24       /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
RETURN     all  --  anywhere             240.0.0.0/4          /* ip-masq-agent: local traffic is not sub
ject to MASQUERADE */
MASQUERADE  all  --  anywhere             anywhere             /* ip-masq-agent: outbound traffic is sub
ject to MASQUERADE (must be last in chain) */

但是如果我运行 curlcheckip.amazonaws.com来查看节点正在使用的 IP,我会得到一个与我的 NAT Cloud 配置中定义的 IP 不同的 IP,并且外部服务会拒绝我的集群的请求,因为它不可信。

答案1

似乎您已将其设置nonMasqueradeCIDRs:为 0.0.0.0/0,从而阻止了所有 CIDR 流量的伪装,因此要解决此问题,请在配置文件中用默认非伪装目的地段落 [1] 中提到的 IP 更新 nonMasqueradeCIDRs:键,如下所示。

非伪装CIDR:

  • 172.16.0.0/12
  • 192.168.0.0/16
  • 100.64.0.0/10
  • 192.0.0.0/24
  • 192.0.2.0/24
  • 192.88.99.0/24
  • 198.18.0.0/15
  • 198.51.100.0/24
  • 203.0.113.0/24
  • 240.0.0.0/4
  • 10.0.0.0/8

另请注意,屏幕截图中引用的 IP 并不是错误的 IP,而是 RFC 1918/link-local 保留的范围,即 IP 10.0.0.0/8、172.16.0.0/12 192.168.0.0/16 为 RFC 1918 保留,IP 范围 169.254.0.0/16 为 link-local 保留,并且这些 IP 是不可伪装的,因此显示这些 IP 时会显示“ip-masq-agent:本地流量不受伪装”的描述[2]。

[1]https://cloud.google.com/kubernetes-engine/docs/how-to/ip-masquerade-agent#default-non-masq-dests

[2] https://kubernetes.io/docs/tasks/administer-cluster/ip-masq-agent/#ip-masquerade-agent-user-guide

此致敬礼,安布。

答案2

最后我们终于能够诊断出问题了。我们的集群是在 GCP 不支持私有集群时创建的,因此我们的集群是公开的。

每个节点都有一个公共的临时 IP,因此 NAT 规则被忽略。

解决方案是设置一个具有静态 IP 而非临时 IP 的节点,并配置需要受信任身份验证的工作负载以始终部署在该特定节点上。这不是一个完美的解决方案,但这是我们可以快速解决问题的方法。

真正的解决方案是迁移到私有集群并配置 NAT,但遗憾的是 GCP 不支持从公共集群迁移到私有集群。唯一的选择是创建一个新集群并将工作负载迁移到新集群,这是我们需要在短期内执行的过程。

也许这是一个测试不支持自动迁移的自动驾驶仪的好时机。

相关内容