Ich habe einen virtuellen Kubernetes-Cluster mit Vagrant-Boxen erstellt. Alle meine Boxen haben 2 Netzwerkschnittstellen
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 02:1d:76:b3:3c:fe brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 fe80::1d:76ff:feb3:3cfe/64 scope link
valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:35:39:9f brd ff:ff:ff:ff:ff:ff
inet 192.168.70.11/24 brd 192.168.70.255 scope global enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe35:399f/64 scope link
valid_lft forever preferred_lft forever
enp0s3 wird standardmäßig erstellt und hat auf allen Boxen die gleiche IP-Adresse. Anscheinend ist das eine virtuelle Box-Sachehttps://github.com/hashicorp/vagrant/issues/6456. Ich habe die Schnittstelle enp0s8 als privates Netzwerk hinzugefügt, damit meine Boxen miteinander kommunizieren können. Da jede Box eine andere IP hat, möchte ich sie für Kubernetes verwenden.
Als ich meinen Cluster einrichtete, benutzte ich diesen Befehl, der es mir ermöglichte, den Cluster auf dem ersten Knoten zu erstellen und dem zweiten Knoten beizutreten
$ kubeadm init --apiserver-advertise-address=192.168.70.11 --pod-network-cidr=10.244.0.0/16
Das Problem ist, dass alle Kube-System-Pods immer noch die enp0s3-Schnittstelle verwenden
$ kubectl -n kube-system get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE
coredns-78fcdf6894-8tpnc 1/1 Running 0 11m 10.244.0.2 node-1
coredns-78fcdf6894-tbqxk 1/1 Running 0 11m 10.244.0.3 node-1
etcd-node-1 1/1 Running 0 10m 10.0.2.15 node-1
kube-apiserver-node-1 1/1 Running 0 10m 10.0.2.15 node-1
kube-controller-manager-node-1 1/1 Running 0 10m 10.0.2.15 node-1
kube-flannel-ds-5wm74 1/1 Running 0 11m 10.0.2.15 node-2
kube-flannel-ds-wx77l 1/1 Running 0 11m 10.0.2.15 node-1
kube-proxy-gmst8 1/1 Running 0 11m 10.0.2.15 node-2
kube-proxy-sbqqs 1/1 Running 0 11m 10.0.2.15 node-1
kube-scheduler-node-1 1/1 Running 0 10m 10.0.2.15 node-1
Ich möchte Kubernetes zwingen, ausschließlich enp0s8 zu verwenden. Gibt es eine Möglichkeit, dies zu tun, ohne die enp0s3-Schnittstelle zu entfernen?
So sehen die Knoten aus
$ kubectl get nodes -owide
NAME STATUS ROLES AGE VERSION EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node-1 Ready master 4m v1.11.2 <none> Ubuntu 16.04.5 LTS 4.4.0-134-generic docker://17.3.2
node-2 Ready <none> 3m v1.11.2 <none> Ubuntu 16.04.5 LTS 4.4.0-134-generic docker://17.3.2
Und das ist die Versionsinfo
$ sudo KUBECONFIG=/etc/kubernetes/admin.conf kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:17:28Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:08:19Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Antwort1
Auf GitHub gibt es ein Problem, das mit Ihrem Problem zusammenhängt:kubelet meldet falsche IP-Adresse #44702
Am Ende der DiskussionAbonnieren erklärtwarum das passiert:
kubelet verwendet dieVom Cloud-Anbieter gemeldete IP-Adressewenn es existiert, oder die erste Nicht-Loopback-IPv4-Adresse (Code hier), wenn kein Cloud-Anbieter vorhanden ist. Darüber hinaus könnte es durch Kubelet-Flags überschrieben werden.
Ich habe die Links im Zitat auf v1.11 aktualisiert. Hier ist, was imCodeKommentare zu v1.11:
// 1) Use nodeIP if set
// 2) If the user has specified an IP to HostnameOverride, use it
// 3) Lookup the IP from node name by DNS and use the first valid IPv4 address.
// If the node does not have a valid IPv4 address, use the first valid IPv6 address.
// 4) Try to get the IP from the network interface used as default gateway
Die in den Codekommentaren erwähnten Optionen von Kubelet werden kopiert vonKubelet-Dokumentation:
- --node-ip string - IP-Adresse des Knotens. Wenn gesetzt, verwendet Kubelet diese IP-Adresse für den Knoten
- --hostname-override string – Wenn nicht leer, wird dieser String anstelle des tatsächlichen Hostnamens zur Identifikation verwendet.
Wenn wir uns dieCode, werden wir sehen, dass eserwartet IPv4 oder IPv6Adresse hier:
if addr := net.ParseIP(kl.hostname); addr != nil
Die letzten beiden Optionen sind in Ihrem Fall nicht besonders praktisch und zuverlässig in der Anwendung, deshalb habe ich sie übersprungen.
Die erste Option wurde auch vorgeschlagen vondcbwimKommentarund bekam positives Feedback:
Wenn Sie keinen Cloud-Anbieter verwenden, versuchen Sie, die Befehlszeilenoptionen von Kubelet so zu ändern, dass „--node-ip=“ übergeben wird, oder legen Sie die NodeIP-Konfiguration in der YAML-Konfigurationsdatei von Kubelet fest.
Wie dem auch sei, es liegt an Ihnen, zu entscheiden, was Ihnen am besten passt.