我有一个库伯内斯集群运行应用(当前位于本地服务器上的一组 Vagrant CoreOS VM 上)
我希望能够在我的笔记本电脑上本地调试特定的应用程序,因此我致力于在集群中设置 VPN:客户端/服务器VPN基于kylemanna/docker-openvpn
,作为常规部署荚
我创建了证书/密钥对、客户端证书等...我可以正常连接到 VPN。
现在,如果我无法访问服务,连接到 VPN 服务器对我来说并没有多大帮助。我在集群中运行 skyDNS 的 DNS 插件。我可以nslookup
从集群中的其他 Pod 获取服务,因此一切正常,但我无法在 VPN 客户端上按名称解析服务。我可以从 VPN 客户端(在子网中10.2.0.0/16
)通过 IP 对 Pod 执行 ping 操作,但无法使用 DNS 进行解析
anslookup
来自客户端的返回:
nslookup myservice 10.3.0.10
Server: 10.3.0.10
Address: 10.3.0.10#53
** server can't find myservice: SERVFAIL
故障排除的问题之一是既不能ping
在traceroute
DNS IP(来自任何 pod)上工作,但它可以解析服务,这也是nslookup
我知道的检查方式,但这并没有提供太多信息。
Pod 绑定到的 VPN 主机 IP 是192.168.10.152
Kubernetes 子网是10.2.0.0/16
SkyDNS 服务器位于10.3.0.10
VPN 服务器子网位于10.8.0.0/24
VPN 服务器上 ifconfig 给出:
eth0 Link encap:Ethernet HWaddr 02:42:0A:02:16:45
inet addr:10.2.22.69 Bcast:0.0.0.0 Mask:255.255.255.0
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255
10.2.22.69
也是如此荚IP和VPN服务器IP是我猜的10.8.0.1
网关10.8.0.2
。
在 VPN 服务器 Pod 上,路由表如下所示:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.2.22.1 0.0.0.0 UG 0 0 0 eth0
10.2.22.0 * 255.255.255.0 U 0 0 0 eth0
10.8.0.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
10.8.0.2 * 255.255.255.255 UH 0 0 0 tun0
192.168.254.0 10.8.0.2 255.255.255.0 UG 0 0 0 tun0
我可以通过 IP 访问我的应用程序(并获取数据),但在使用服务 IP(位于 10.3.0.0 子网上的代理 IP)时无法访问我的应用程序
我添加了到 VPN 服务器的路由route add -net 10.3.0.0/16 gw 10.8.0.2
,然后我可以使用服务 IP 来获取数据,但nslookup
只是超时。
我猜流量可能不会从 DNS 返回。 DNS 本身就是 Kubernetes 中的代理服务,因此增加了一定程度的复杂性。不知道如何解决这个问题。
答案1
最后我的配置如下所示:
docker run -v /etc/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig \
-u udp://192.168.10.152:1194 \
-n 10.3.0.10 \
-n 192.168.10.1 \
-n 8.8.8.8 \
-n 75.75.75.75 \
-n 75.75.75.76 \
-s 10.8.0.0/24 \
-N \
-p "route 10.2.0.0 255.255.0.0" \
-p "route 10.3.0.0 255.255.0.0" \
-p "dhcp-option DOMAIN-SEARCH cluster.local" \
-p "dhcp-option DOMAIN-SEARCH svc.cluster.local" \
-p "dhcp-option DOMAIN-SEARCH default.svc.cluster.local"
-u
VPN 服务器地址和端口
-n
供所有 DNS 服务器使用
-s
定义 VPN 子网(默认为 10.2.0.0,Kubernetes 已使用该子网)
-d
禁用 NAT
-p
将选项推送给客户端
-N
启用 NAT:对于 Kubernetes 上的此设置似乎至关重要
nslookup
最后一部分,将搜索域推送给客户端,是让等等工作的关键。
请注意,curl 一开始不起作用,但似乎在几秒钟后开始起作用。所以它确实有效,但卷曲需要一些时间才能解决。
答案2
一年前遇到了同样的问题,并决定为 kubernetes 做一些特定的事情:https://github.com/pieterlange/kube-openvpn
(基于 kylemanna 的 openvpn docker 镜像)