1 votes

Kubernetes, comment puis-je laisser Kubernetes utiliser le réseau interne pour la communication de nœud à nœud ?

Le contexte.

Je suis l'installation de base de Kubernetes. aquí (dans le nuage de Hetzner, si nécessaire). 1 contrôleur et 1 travailleur.

Tout va bien apparemment.

  • les serveurs ont une interface IP externe (Ipv4 publique) et une interface interne (normalement 10.0.0.2 ou 10.0.0.3).

  • Le contrôleur monte

  • J'installe la flanelle

  • J'ai défini des options avec kubeadm init et je change le kubectl config pour n'utiliser que l'ip interne (sinon il affiche l'ip externe comme "ip interne" des noeuds). A savoir

    private_ipaddr=$( ifconfig eth1 | grep -i inet | head -1 | awk '{print $2}' ) #eth0 is the public Ipv4 echo "KUBELET_EXTRA_ARGS='--node-ip ${private_ipaddr}'" > /etc/sysconfig/kubelet systemctl daemon-reload systemctl restart kubelet

    kubeadm init --apiserver-advertise-address=$private_ipaddr --pod-network-cidr=10.244.0.0/16

  • puis je rejoins le travailleur, et l'adresse annoncée pour l'api est bien interne (10.0.0.3 par exemple).

  • kubectl get nodes -o wide montre que deux noeuds sont prêts après quelques minutes.

  • puis je commence à déployer un pod. Le pod est un simple busybox ou alpine.

  • le pod est déployé sur le seul travailleur.

  • J'essaie d'atteindre depuis le pod déployé le fqdn du pod coredns. Il ne fonctionne pas .

  • Il n'y a pas de pare-feu sur le système à part les chaînes de kubernetes. Entre les systèmes, il n'y a pas de pare-feu si l'on utilise le réseau interne, tandis que le trafic sur l'ipv4 public est protégé par un pare-feu (sauf le port 22).

  • Ce que j'ai découvert est : si j'ouvre le pare-feu entre les deux ipv4 publiques des serveurs, alors la connexion entre le pod et le pod core-dns fonctionne. Sinon, elle ne fonctionne pas.

Cela m'amène à réaliser que malgré le fait que l'ip du nœud est défini sur l'ip interne, pour les communications kubernetes passe toujours par l'interface publique ipv4, plutôt que de communiquer via le réseau interne. .

D'où la question. Comment puis-je dire à kubernetes d'utiliser uniquement le réseau interne et non le réseau externe ?

1voto

moonkotte Points 270

Il y a une idée qui explique pourquoi cela peut se produire de cette façon. En se basant sur le doc de configuration de la flanelle il y a une option :

--iface="" : interface à utiliser (IP ou nom) pour la communication inter-hôtes. Par défaut, il s'agit de l'interface de l'itinéraire par défaut de la machine. Ceci peut être spécifié plusieurs fois pour vérifier chaque option dans dans l'ordre. Retourne la première correspondance trouvée.

Afin de passer cette option, vous devrez télécharger le manifeste flannel en yaml et ajouter cette partie à args en daemonSet - containers - kube-flannel un, donc ça devrait ressembler à ça :

  containers:
  - name: kube-flannel
    image: quay.io/coreos/flannel:v0.14.0
    command:
    - /opt/bin/flanneld
    args:
    - --ip-masq
    - --kube-subnet-mgr
    - --iface=interface_name

Et puis kubectl apply -f kube-flannel.yaml

Il peut être nécessaire de supprimer la flanelle et de recommencer à zéro.

Mise à jour :

Vous pouvez vérifier quelle interface est utilisée dans les journaux des pods de kube-flannel :

kubectl logs -n kube-system kube-flannel-ds-xxxxx -c kube-flannel | grep interface

Dans mon cas, il s'agissait d'une seule et unique interface réseau :

I0611 12:21:47.303175       1 main.go:520] Determining IP address of default interface
I0611 12:21:47.303636       1 main.go:533] Using interface with name ens4 and address 10.186.0.2
I0611 12:21:47.303668       1 main.go:550] Defaulting external address to interface address (10.186.0.2)

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