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?