Creé un clúster virtual de Kubernetes usando cajas vagabundas. Todas mis cajas tienen 2 interfaces de red.
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 se crea de forma predeterminada y tiene la misma dirección IP en todos los cuadros. Aparentemente esto es una cosa de caja virtual.https://github.com/hashicorp/vagrant/issues/6456. Agregué la interfaz enp0s8 como red privada para permitir que mis cajas se comuniquen entre sí, esta tiene una IP diferente en cada caja, así que quiero usarla para kubernetes.
Cuando configuré mi clúster utilicé este comando que me permitió crear el clúster en el primer nodo y unirme al segundo nodo.
$ kubeadm init --apiserver-advertise-address=192.168.70.11 --pod-network-cidr=10.244.0.0/16
El problema es que todos los pods del sistema kube todavía usan la interfaz enp0s3.
$ 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
Me gustaría obligar a Kubernetes a usar enp0s8 exclusivamente. ¿Hay alguna forma de hacer eso sin eliminar la interfaz enp0s3?
Así se ven los nodos
$ 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
Y esta es la información de la versión.
$ 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"}
Respuesta1
Hay un problema en GitHub relacionado con tu problema:kubelet informa dirección IP incorrecta #44702
Al final de la discusión,yujuhong explicadopor qué sucede esto:
kubelet usa elDirección IP informada por el proveedor de la nubesi existe, o la primera dirección ipv4 sin loopback (código aquí) si no hay un proveedor de nube. Además, podría sobrescribirse con indicadores de kubelet.
Actualicé los enlaces en la cita a v1.11. Aquí lo mencionado en elcódigocomentarios para 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
Las opciones de kubelet mencionadas en los comentarios del código se copian dedocumentación de kubelet:
- --node-ip string: dirección IP del nodo. Si se configura, kubelet usará esta dirección IP para el nodo
- --hostname-override string: si no está vacía, utilizará esta cadena como identificación en lugar del nombre de host real.
Si miramos elcódigo, veremos queespera IPv4 o IPv6dirección aquí:
if addr := net.ParseIP(kl.hostname); addr != nil
Las dos últimas opciones no son muy convenientes ni confiables de usar en su caso, así que las omití.
La primera opción también fue sugerida pordcbwen elcomentarioy tuvo comentarios positivos:
Si no está utilizando un proveedor de nube, intente modificar las opciones de la línea de comandos de kubelet para pasar "--node-ip=" o establecer la configuración de NodeIP en el archivo yaml de configuración de kubelet.
De todos modos, depende de ti elegir lo que más te convenga.