Como permitir o encaminhamento para endereços IP do Kubernetes acessíveis apenas através de regras iptables?

1

Eu configurei um cluster do Kubernetes usando o Rancher, que define duas redes:

  • 10.42.0.0/16 para endereços IP de pods
  • 10.43.0.0./16 para pontos de extremidade de serviço

Eu quero usar o meu proxy reverso Caddy existente para acessar esses pontos de extremidade de serviço, então eu defini uma rota ( 10.10.10.172 é um dos meus nós do kubernetes):

sudo route add -net 10.43.0.0 netmask 255.255.0.0 gw 10.10.10.172

Minha tabela de roteamento no servidor da Web do Caddy:

arturh@web:~$ sudo route
[sudo] password for arturh:
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         DD-WRT.local    0.0.0.0         UG    0      0        0 eth0
10.10.10.0      0.0.0.0         255.255.255.0   U     0      0        0 eth0
10.43.0.0       rancherkube1.lo 255.255.0.0     UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0

Usando essa configuração, posso acessar e usar 10.43.0.1:443 sem nenhum problema (é o endpoint principal da kubernetes api):

arturh@web:~$ nmap 10.43.0.1 -p 443 | grep 443
443/tcp open  https
arturh@web:~$ curl -k https://10.43.0.1
Unauthorized

Mas o acesso a qualquer outro endereço IP na rede 10.43.0.0/16 falha e não consigo entender por quê:

arturh@web:~$ kubectl get svc | grep prometheus-server
prometheus-prometheus-server               10.43.115.122   <none>         80/TCP              1d
arturh@web:~$ curl 10.43.115.122
curl: (7) Failed to connect to 10.43.115.122 port 80: No route to host
arturh@web:~$ traceroute 10.43.115.122
traceroute to 10.43.115.122 (10.43.115.122), 30 hops max, 60 byte packets
 1  rancherkube1.local (10.10.10.172)  0.348 ms  0.341 ms  0.332 ms
 2  rancherkube1.local (10.10.10.172)  3060.710 ms !H  3060.722 ms !H  3060.716 ms !H

Eu posso acessar tudo do próprio nó do kubernetes:

[rancher@rancherkube1 ~]$ wget -qO- 10.43.115.122
<!DOCTYPE html>
<html lang="en">...

que funciona devido às regras NAT de iptable:

[rancher@rancherkube1 ~]$ sudo iptables -t nat -L -n  | grep 10.43
KUBE-SVC-NGLRF5PTGH2R7LSO  tcp  --  0.0.0.0/0            10.43.115.122        /* default/prometheus-prometheus-server:http cluster IP */ tcp dpt:80
KUBE-SVC-NPX46M4PTMTKRN6Y  tcp  --  0.0.0.0/0            10.43.0.1            /* default/kubernetes:https cluster IP */ tcp dpt:443

Estou confuso porque as entradas para 10.43.0.1 que funciona parecem idênticas às outras que não ... Eu acho que preciso adicionar uma regra iptables para permitir acesso à sub-rede 10.43.0.0/16 , mas estou não está familiarizado com o iptables.

Sou bastante novo em todo o negócio de kubernetes, esta é a maneira correta de acessar seus terminais de serviço? Se assim for, alguém pode me ajudar com o comando iptables correto?

    
por arturh 27.09.2017 / 22:38

1 resposta

1

você pode acessar as coisas de um host que esteja executando uma carga de trabalho do kubernetes porque possui as regras iptables e as possíveis regras da tabela de rota para rotear o tráfego.

Se você deseja acessar os serviços do kubernetes de fora do seu cluster, então você quer usar um controlador de entrada com um serviço de ingresso.

link

    
por 27.09.2017 / 23:36