我必须在我的一个 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 不支持从公共集群迁移到私有集群。唯一的选择是创建一个新集群并将工作负载迁移到新集群,这是我们需要在短期内执行的过程。
也许这是一个测试不支持自动迁移的自动驾驶仪的好时机。