Servidor OpenVPN no cluster do Kubernetes / DNS e resolução de serviço

4

Eu tenho um cluster Kubernetes executando aplicativos (atualmente em um conjunto de VMs do Vagrant CoreOS em um servidor local)

Eu quero poder depurar um aplicativo específico localmente no meu laptop, então trabalhei na configuração da VPN no cluster: uma VPN cliente / servidor baseada em kylemanna/docker-openvpn , implantada como um pod de regular

Eu criei os pares cert / key, certs clientes etc ... Posso me conectar à VPN bem.

Agora, conectar-se ao servidor VPN não me ajuda muito se não conseguir acessar os Serviços. Eu tenho o addon DNS executando o skyDNS no cluster. Eu posso nslookup meus serviços de outros pods no cluster, então tudo isso funciona bem, mas não consigo resolver os Serviços por nome no cliente VPN. Eu posso pingar Pods por IP do cliente VPN (na sub-rede 10.2.0.0/16 ) mas não consigo resolver com DNS

um nslookup do cliente retorna:

nslookup myservice 10.3.0.10
Server:     10.3.0.10
Address:    10.3.0.10#53

** server can't find myservice: SERVFAIL

Um dos problemas da solução de problemas é que nem ping nem traceroute funcionam no IP do DNS (de qualquer pod), mas também resolvem serviços, portanto nslookup é a maneira que eu sei verificar, mas isso é não é muito informativo.

O IP do host da VPN ao qual o pod é vinculado é 192.168.10.152 A sub-rede do Kubernetes é 10.2.0.0/16 O servidor do SkyDNS está em 10.3.0.10

A sub-rede do servidor VPN é 10.8.0.0/24 No servidor VPN, o ifconfig fornece:

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

Portanto, 10.2.22.69 é o Pod IP e o IP do servidor VPN é 10.8.0.1 , com o gateway sendo 10.8.0.2 i.

No pod do servidor VPN, a tabela de roteamento é semelhante a:

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

Eu posso alcançar meus aplicativos por IP (e obter dados), mas não consegui ao usar o IP de serviço (o IP do proxy que está na sub-rede 10.3.0.0)

Eu adicionei a rota route add -net 10.3.0.0/16 gw 10.8.0.2 ao servidor VPN e posso usar o IP de serviço para obter dados, mas o nslookup apenas expira.

Acho que o tráfego pode não estar voltando do DNS. O DNS é em si um serviço com proxy no Kubernetes, o que adiciona um nível de complexidade. Não sei como consertar isso.

    
por MrE 19.01.2016 / 07:18

2 respostas

2

finalmente minha configuração é assim:

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 para o endereço e a porta do servidor VPN

-n para todos os servidores DNS usarem

-s para definir a sub-rede da VPN (já que o padrão é 10.2.0.0, que já é usado pelo Kubernetes)

-d para desativar o NAT

-p para enviar opções ao cliente

-N para ativar o NAT: parece crítico para essa configuração no Kubernetes

a última parte, empurrando os domínios de busca para o cliente, foi a chave para fazer com que nslookup etc. funcionasse.

observe que o curl não funcionou no começo, mas parece começar a funcionar depois de alguns segundos. Então funciona, mas demora um pouco para que o curl seja resolvido.

    
por 20.01.2016 / 08:04
1

Corri para o mesmo problema há um ano e decidi fazer algo específico para os kubernetes: link

(baseado na imagem docker openvpn de kylemanna)

    
por 05.03.2017 / 14:28