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

MrE*_*MrE 5 dns openvpn kubernetes

我有一个运行应用程序Kubernetes集群(目前在本地服务器上的一组 Vagrant CoreOS 虚拟机上)

我希望能够在我的笔记本电脑本地调试一个特定的应用程序,所以我的工作VPN建立到集群:一个客户机/服务器VPN基础上kylemanna/docker-openvpn,部署为一个普通波德

我创建了证书/密钥对、客户端证书等......我可以很好地连接到 VPN。

现在,如果我无法访问服务,连接到 VPN 服务器对我没有多大帮助。我有 DNS 插件在集群中运行 skyDNS。我可以nslookup从集群中的其他 pod 获取我的服务,所以一切正常,但我无法在 VPN 客户端上按名称解析服务。我可以从 VPN 客户端(在子网中10.2.0.0/16)通过 IP ping Pod,但我无法使用 DNS 解析

一个nslookup来自客户的回报:

nslookup myservice 10.3.0.10
Server:     10.3.0.10
Address:    10.3.0.10#53

** server can't find myservice: SERVFAIL
Run Code Online (Sandbox Code Playgroud)

故障排除的问题之一是,DNS IP(来自任何 pod)既不工作ping也不traceroute工作,但它解析服务,所以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
Run Code Online (Sandbox Code Playgroud)

所以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
Run Code Online (Sandbox Code Playgroud)

我可以通过 IP 访问我的应用程序(并获取数据),但在使用服务 IP(位于 10.3.0.0 子网上的代理 IP)时不能

我将路由添加route add -net 10.3.0.0/16 gw 10.8.0.2到 VPN 服务器,然后我可以使用服务 IP 来获取数据,但nslookup只是超时。

我猜流量可能不会从 DNS 返回。DNS 本身是 Kubernetes 中的代理服务,因此增加了一定程度的复杂性。不知道如何解决这个问题。

MrE*_*MrE 4

最后我的配置如下所示:

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"
Run Code Online (Sandbox Code Playgroud)

-uVPN 服务器地址和端口

-n供所有 DNS 服务器使用

-s定义 VPN 子网(默认为 10.2.0.0,Kubernetes 已使用该子网)

-d禁用 NAT

-p将选项推送给客户端

-N启用 NAT:对于 Kubernetes 上的此设置似乎至关重要

最后一部分,将搜索域推送给客户端,是让nslookup等等工作的关键。

请注意,curl 一开始不起作用,但似乎在几秒钟后开始起作用。所以它确实有效,但卷曲需要一些时间才能解决。