我有一个 Kubernetes 部署,当将其部署到docker-desktop
Mac 版 Kubernetes 中时,可以正常工作,但 Azure Kubernetes 中完全相同的配置(配置文件、Docker 映像)却不行。
要求:Pod 必须连接到 VPN 连接,所有出站 Web 流量必须通过 VPN 连接路由,同时保持与“本地” Kubernetes 资源的连接。
在建立 VPN 连接之前,所有网络运行正常。
VPN连接建立前的路由表:
/app # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.244.1.1 0.0.0.0 UG 0 0 0 eth0
10.244.1.0 * 255.255.255.0 U 0 0 0 eth0
VPN连接建立后的路由表:
/app # route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.7.1.1 128.0.0.0 UG 0 0 0 tun0
default 10.7.1.1 0.0.0.0 UG 0 0 0 tun0
10.7.1.0 * 255.255.255.0 U 0 0 0 tun0
10.244.1.0 * 255.255.255.0 U 0 0 0 eth0
107.174.17.243 10.244.1.1 255.255.255.255 UGH 0 0 0 eth0
128.0.0.0 10.7.1.1 128.0.0.0 UG 0 0 0 tun0
基本上,“up”脚本会删除原始网络的默认网关,并用 VPN 网关替换它,“down”脚本会恢复原始默认网关。
主要问题是,一旦建立 VPN 连接,我就无法再获得任何域名解析。kube-dns
在两个地方运行,并且 pod 规范具有明确的 DNS 配置:
dnsConfig:
nameservers:
- 8.8.8.8
- 8.8.4.4
我再次重申在建立 VPN 连接之前,所有网络运行正常。
当我nslookup google.com
使用 VPN 连接运行时,它可以正常工作
/app # nslookup google.com
Server: 8.8.8.8
Address: 8.8.8.8:53
Non-authoritative answer:
Name: google.com
Address: 172.217.11.238
Non-authoritative answer:
Name: google.com
Address: 2607:f8b0:400f:800::200e
但是当我ping google.com
在 VPN 启动时运行时,它会失败
/app # ping google.com
ping: bad address 'google.com'
但是,如果我知道要与之通信的服务器的确切 IP 地址,我就可以让它给我一个响应。例如,针对 Google 先前解析的 IP 地址调用 CURL。
/app # curl "http://172.217.11.238" > output.txt
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 219 100 219 0 0 782 0 --:--:-- --:--:-- --:--:-- 782
/app # cat output.txt
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
/app #
因此,问题似乎仅仅是 VPN 连接启动时 DNS 解析,但我不确定如何解决它。
答案1
所以我设法解决了这个问题,但我并不是很喜欢。
在我的 OpenVPN--up
脚本中
ip route add {IP_OF_KUBE_DNS} via $network_net_gateway
这将为内部网络上的 DNS 服务器 IP 地址添加一条显式路由,告诉它通过原始网络网关