Я настроил рабочий кластер Kubernetes с помощью Rancher, который определяет две сети:
10.42.0.0/16
для IP-адресов подов 10.43.0.0./16
для конечных точек службыЯ хочу использовать свой существующий обратный прокси Caddy для доступа к этим конечным точкам службы, поэтому я определил маршрут (10.10.10.172
это один из моих узлов Kubernetes):
sudo route add -net 10.43.0.0 netmask 255.255.0.0 gw 10.10.10.172
Моя таблица маршрутизации на веб-сервере 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
Используя эту настройку, я могу получить доступ и использовать 10.43.0.1:443
без проблем (это основная конечная точка 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
Но доступ к любому другому IP-адресу в сети 10.43.0.0/16 не удается, и я не могу понять, почему:
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
Я могу получить доступ ко всему из самого узла kubernetes:
[rancher@rancherkube1 ~]$ wget -qO- 10.43.115.122
<!DOCTYPE html>
<html lang="en">...
который работает из-за правил iptable NAT:
[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
Я запутался, потому что записи для 10.43.0.1
который работает, выглядит идентично другим, которые не работают ... Я полагаю, мне нужно добавить правило iptables, чтобы разрешить доступ к 10.43.0.0/16
подсеть, но я не знаком с iptables.
Я новичок во всем бизнесе Kubernetes, это правильный способ доступа к конечным точкам ваших сервисов? Если да, может ли кто-нибудь помочь мне с правильной командой iptables?
вы можете получить доступ к вещам с хоста, на котором выполняется рабочая нагрузка kubernetes, потому что у него есть правила iptables и возможные правила таблицы маршрутов для маршрутизации трафика.
Если вы хотите получить доступ к сервисам Kubernetes извне вашего кластера, вы хотите использовать входной контроллер с входящей службой.
https://kubernetes.io/docs/concepts/services-networking/ingress/