Kubernetes:VPN 服务器和 DNS 问题
Kubernetes: VPN server and DNS issues
我在我的(本地)Kubernetes 集群中旋转了一个 docker-openvpn
容器以安全地访问我的服务并调试 依赖服务本地。
我可以通过openVPN服务器连接到集群。但是我无法通过 DNS.
解析我的 Services
在 VPN 服务器上设置路由后,我设法做到了这一点:
- 我可以通过 IP (
subnet 10.2.0.0/16
) ping Pod
- 我可以通过 IP
ping 服务 (subnet 10.3.0.0/16
就像在 10.3.0.10
的 DNS)
- 我可以
curl
通过 IP 服务并获取我需要的数据。
但是当我nslookup kubernetes
或任何服务时,我得到:
nslookup kubernetes
;; Got recursion not available from 10.3.0.10, trying next server
;; Got SERVFAIL reply from 10.3.0.10, trying next server
我仍然缺少从 DNS 服务器到 return 的数据,但不知道我需要做什么。
如何在 Kubernetes DNS 中调试此 SERVFAIL
问题?
编辑:
我注意到并希望了解的事情:
nslookup
用于解析除 openvpn Pod 之外的任何 pod 中的服务名称
- 虽然
nslookup
在其他 Pods 中有效,但 ping
无效。
- 类似地
traceroute
在其他 Pods 中通向法兰绒层 10.0.2.2
然后停在那里。
由此我猜测 ICMP 必须在 flannel 层被阻止,这并不能帮助我找出 DNS 被阻止的位置。
EDIT2:
我终于想出了如何让 nslookup 工作:我必须使用
将 DNS 搜索域推送到客户端
push "dhcp-option DOMAIN-SEARCH cluster.local"
push "dhcp-option DOMAIN-SEARCH svc.cluster.local"
push "dhcp-option DOMAIN-SEARCH default.svc.cluster.local"
在 docker-openvpn
图片中添加 -p
选项
所以我最终得到
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 \
-d \
-p "route 10.2.0.0 255.255.0.0" \
-p "route 10.3.0.0 255.255.0.0" \
-p "dhcp-option DOMAIN cluster.local" \
-p "dhcp-option DOMAIN-SEARCH svc.cluster.local" \
-p "dhcp-option DOMAIN-SEARCH default.svc.cluster.local"
现在,nslookup
有效,但 curl
仍然无效
试试 curl -4。也许即使 A 存在,它也会解析为 AAAA。
最后我的配置如下所示:
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 起初不起作用,但似乎在几秒钟后开始起作用。所以它确实有效,但 curl 需要一些时间才能解决。
我在我的(本地)Kubernetes 集群中旋转了一个 docker-openvpn
容器以安全地访问我的服务并调试 依赖服务本地。
我可以通过openVPN服务器连接到集群。但是我无法通过 DNS.
解析我的 Services在 VPN 服务器上设置路由后,我设法做到了这一点:
- 我可以通过 IP (
subnet 10.2.0.0/16
) ping Pod
- 我可以通过 IP ping 服务 (
- 我可以
curl
通过 IP 服务并获取我需要的数据。
subnet 10.3.0.0/16
就像在 10.3.0.10
的 DNS)
但是当我nslookup kubernetes
或任何服务时,我得到:
nslookup kubernetes
;; Got recursion not available from 10.3.0.10, trying next server
;; Got SERVFAIL reply from 10.3.0.10, trying next server
我仍然缺少从 DNS 服务器到 return 的数据,但不知道我需要做什么。
如何在 Kubernetes DNS 中调试此 SERVFAIL
问题?
编辑:
我注意到并希望了解的事情:
nslookup
用于解析除 openvpn Pod 之外的任何 pod 中的服务名称- 虽然
nslookup
在其他 Pods 中有效,但ping
无效。 - 类似地
traceroute
在其他 Pods 中通向法兰绒层10.0.2.2
然后停在那里。
由此我猜测 ICMP 必须在 flannel 层被阻止,这并不能帮助我找出 DNS 被阻止的位置。
EDIT2:
我终于想出了如何让 nslookup 工作:我必须使用
将 DNS 搜索域推送到客户端push "dhcp-option DOMAIN-SEARCH cluster.local"
push "dhcp-option DOMAIN-SEARCH svc.cluster.local"
push "dhcp-option DOMAIN-SEARCH default.svc.cluster.local"
在 docker-openvpn
图片中添加 -p
选项
所以我最终得到
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 \
-d \
-p "route 10.2.0.0 255.255.0.0" \
-p "route 10.3.0.0 255.255.0.0" \
-p "dhcp-option DOMAIN cluster.local" \
-p "dhcp-option DOMAIN-SEARCH svc.cluster.local" \
-p "dhcp-option DOMAIN-SEARCH default.svc.cluster.local"
现在,nslookup
有效,但 curl
仍然无效
试试 curl -4。也许即使 A 存在,它也会解析为 AAAA。
最后我的配置如下所示:
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 起初不起作用,但似乎在几秒钟后开始起作用。所以它确实有效,但 curl 需要一些时间才能解决。