Kubernetes 集群上的 OpenVPN 服务器/DNS 和服务解析

Kubernetes 集群上的 OpenVPN 服务器/DNS 和服务解析

我有一个库伯内斯集群运行应用(当前位于本地服务器上的一组 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

故障排除的问题之一是既不能pingtracerouteDNS 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"

-uVPN 服务器地址和端口

-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 镜像)

相关内容