1 votes

Comment autoriser le routage vers les adresses IP de Kubernetes uniquement accessibles via les règles iptables ?

J'ai mis en place un cluster Kubernetes fonctionnel à l'aide de Rancher qui définit deux réseaux :

  • 10.42.0.0/16 pour les adresses IP des pods
  • 10.43.0.0./16 pour les points de service

Je veux utiliser mon proxy inverse Caddy existant pour accéder à ces points d'extrémité de service, j'ai donc défini une route ( 10.10.10.172 est l'un de mes nœuds kubernetes) :

sudo route add -net 10.43.0.0 netmask 255.255.0.0 gw 10.10.10.172

Ma table de routage sur le serveur web du 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

En utilisant cette configuration, je peux accéder et utiliser 10.43.0.1:443 sans aucun problème (c'est le principal point d'accès à l'API de Kubernetes) :

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

Mais l'accès à toute autre adresse IP du réseau 10.43.0.0/16 échoue et je n'arrive pas à comprendre pourquoi :

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

Je peux accéder à tout depuis le nœud Kubernetes lui-même :

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

qui fonctionne grâce aux règles NAT d'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

Je suis confus parce que les entrées pour 10.43.0.1 qui fonctionne semble identique aux autres qui ne fonctionnent pas... Je me dis que je dois ajouter une règle iptables pour permettre l'accès à l'adresse 10.43.0.0/16 sous-réseau, mais je ne suis pas familier avec iptables.

Je suis assez nouveau dans le domaine de Kubernetes, est-ce la bonne façon de procéder pour accéder à vos points de terminaison de service ? Si oui, quelqu'un peut-il m'aider à trouver la bonne commande iptables ?

1voto

LeoHsiao Points 1

Je cherche un moyen plus facile de rendre K8S accessible aux hôtes externes sans utiliser loadBalance et NodePort.

J'ai également déployé K8S en utilisant Rancher, l'un des nœuds est 192.168.1.4 . Par défaut, seuls les nœuds K8S peuvent accéder aux IP virtuelles 10.42.0.0/16 et 10.43.0.0/16 .

Merci @arturh pour l'exemple, j'ai ajouté une règle de route sur un hôte non-K8S et cela a fonctionné :

[root@CentOS ~]# curl 10.43.1.15:27017

^C
[root@CentOS ~]# ip route add 10.43.0.0/16 via 192.168.1.4
[root@CentOS ~]# curl 10.43.1.15:27017
It looks like you are trying to access MongoDB over HTTP on the native driver port.

Erreurs possibles :

  • sysctl net.ipv4.ip_forward de l'hôte est désactivé.
  • Les hôtes non-k8s et les nœuds K8S sont sur des sous-réseaux différents, ils ne peuvent donc pas communiquer directement entre eux.

1voto

Ed Ball Points 1341

Vous pouvez accéder à des choses à partir d'un hôte qui exécute une charge de travail kubernetes parce qu'il dispose des règles iptables et des éventuelles règles de la table de route pour acheminer le trafic.

Si vous souhaitez accéder aux services Kubernetes depuis l'extérieur de votre cluster, vous devez utiliser un contrôleur ingress avec un service ingress.

https://kubernetes.io/docs/concepts/services-networking/ingress/

0 votes

Ok, merci cela a du sens dans la mesure où les autres choses que j'ai réussi à faire fonctionner avec kubernetes sont soit servies par mon contrôleur d'entrée, soit des NodePorts qui sont disponibles directement sur l'IP du noeud, mais je pensais qu'il devait y avoir un moyen d'accéder directement aux points de terminaison des services lorsque vous voulez par exemple exposer les ports MySQL qui ne sont pas http à d'autres hôtes.

0 votes

Vous pouvez utiliser comme haproxy en tant que contrôleur d'entrée et il sera le contrôleur de service d'entrée, vous pouvez dire que je veux que le port 33060 de ce nœud soit ouvert et il l'ouvrira sur tous les hôtes Ensuite, si vous êtes sur un fournisseur non-cloud, vous aurez comme un LB matériel pour mapper un nouveau VIP 3306->33060 et ensuite faire pointer tous vos services vers ce VIP. Sur AWS par exemple, le contrôleur de service créerait une ELB

0 votes

Oui bonne chance kubernetes est vraiment une excellente plateforme une fois que vous vous êtes familiarisé avec les concepts et que vous avez appris une nouvelle façon de faire des opérations.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X