especificar la interfaz de red para los pods de kubesystem

especificar la interfaz de red para los pods de kubesystem

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:

  1. --node-ip string: dirección IP del nodo. Si se configura, kubelet usará esta dirección IP para el nodo
  2. --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.

información relacionada