Я создал виртуальный кластер kubernetes с помощью vagrant box. Все мои box имеют 2 сетевых интерфейса
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 создается по умолчанию и имеет тот же IP-адрес на всех ящиках. Видимо, это особенность виртуального ящикаhttps://github.com/hashicorp/vagrant/issues/6456. Я добавил интерфейс enp0s8 в качестве частной сети, чтобы мои устройства могли общаться друг с другом. У каждого устройства свой IP-адрес, поэтому я хочу использовать его для Kubernetes.
Когда я настраивал свой кластер, я использовал эту команду, которая позволила мне создать кластер на первом узле и присоединиться ко второму узлу.
$ kubeadm init --apiserver-advertise-address=192.168.70.11 --pod-network-cidr=10.244.0.0/16
Проблема в том, что все модули kube-system по-прежнему используют интерфейс 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
Я хотел бы заставить kubernetes использовать исключительно enp0s8. Есть ли способ сделать это без удаления интерфейса enp0s3?
Вот как выглядят узлы
$ 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
А это информация о версии
$ 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"}
решение1
На GitHub есть проблема, связанная с вашей проблемой:kubelet сообщает неверный IP-адрес #44702
В конце обсуждения,юджухонг объяснилпочему это происходит:
kubelet используетIP-адрес, предоставленный поставщиком облачных услугесли он существует, или первый не-loopback-адрес ipv4 (код здесь) если нет облачного провайдера. Кроме того, он может быть перезаписан флагами kubelet.
Я обновил ссылки в цитате до версии 1.11. Вот что упоминается вкодкомментарии для 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
Параметры kubelet, указанные в комментариях к коду, скопированы издокументация kubelet:
- --node-ip string - IP-адрес узла. Если установлено, kubelet будет использовать этот IP-адрес для узла
- --hostname-override string — если не пусто, будет использовать эту строку в качестве идентификатора вместо фактического имени хоста.
Если мы посмотрим накод, мы увидим, что этоожидает IPv4 или IPv6адрес здесь:
if addr := net.ParseIP(kl.hostname); addr != nil
Последние два варианта не очень удобны и надежны в вашем случае, поэтому я их пропустил.
Первый вариант также был предложенdcbwвкомментарийи имел положительные отзывы:
Если вы не пользуетесь услугами облачного провайдера, попробуйте изменить параметры командной строки kubelet, указав «--node-ip=", или настроить конфигурацию NodeIP в yaml-файле конфигурации kubelet.
В любом случае, вам решать, что вам больше подходит.