настройка фланели для использования нестандартного интерфейса в кубернетах

Есть ли способ определить, какой интерфейс должен прослушивать Flannel? Согласно его документации, добавив FLANNEL_OPTIONS = "- iface = enp0s8 "в / etc / sysconfig / flanneld должно работать, но это не так.

Конфигурация моего главного узла работает в бродяге xenial (ubuntu 16.04):

$ sudo kubeadm init --pod-network-cidr 10.244.0.0/16 --apiserver-advertise-address 10.0.0.10 

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
clusterrole "flannel" created                                                                    
clusterrolebinding "flannel" created                                                                   
serviceaccount "flannel" created                                                                 
configmap "kube-flannel-cfg" created                                                                                                                                                       
daemonset "kube-flannel-ds" created   


ubuntu@master:~$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml
clusterrole "flannel" configured                                                          
clusterrolebinding "flannel" configured         

IP-адреса хоста:

$ ip addr                      
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1     
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00                                    
    inet 127.0.0.1/8 scope host lo            
       valid_lft forever preferred_lft forever                                               
    inet6 ::1/128 scope host                  
       valid_lft forever preferred_lft forever                                               
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000                                                                                    
    link/ether 02:63:8e:2c:ef:cd 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::63:8eff:fe2c:efcd/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:fb:ad:bb brd ff:ff:ff:ff:ff:ff                                       
    inet 10.0.0.10/24 brd 10.0.0.255 scope global enp0s8                                     
       valid_lft forever preferred_lft forever                                               
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default                                                                                            
    link/ether 02:42:da:aa:6e:13 brd ff:ff:ff:ff:ff:ff                                       
    inet 172.17.0.1/16 scope global docker0   
       valid_lft forever preferred_lft forever                                               
5: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default                                                                                         
    link/ether 5e:07:a1:7f:97:53 brd ff:ff:ff:ff:ff:ff                                       
    inet 10.244.0.0/32 scope global flannel.1 
       valid_lft forever preferred_lft forever                                               
    inet6 fe80::5c07:a1ff:fe7f:9753/64 scope link                                            
       valid_lft forever preferred_lft forever                                               
6: cni0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000                                                                                     
    link/ether 0a:58:0a:f4:00:01 brd ff:ff:ff:ff:ff:ff                                       
    inet 10.244.0.1/24 scope global cni0      
       valid_lft forever preferred_lft forever                                               
    inet6 fe80::7037:fcff:fe41:b1fb/64 scope link                                            
       valid_lft forever preferred_lft forever                  

Имена подов:

$ kubectl get pods --all-namespaces                                                                                                                                         
NAMESPACE     NAME                             READY     STATUS              RESTARTS   AGE  
kube-system   etcd-master                      1/1       Running             0          2m   
kube-system   kube-apiserver-master            1/1       Running             0          2m   
kube-system   kube-controller-manager-master   1/1       Running             0          2m   
kube-system   kube-dns-545bc4bfd4-gjjth        0/3       ContainerCreating   0          3m   
kube-system   kube-flannel-ds-gdz8f            1/1       Running             0          1m   
kube-system   kube-flannel-ds-h4fd2            1/1       Running             0          33s  
kube-system   kube-flannel-ds-rnlsz            1/1       Running             1          33s  
kube-system   kube-proxy-d4wv9                 1/1       Running             0          33s  
kube-system   kube-proxy-fdkqn                 1/1       Running             0          3m   
kube-system   kube-proxy-kj7tn                 1/1       Running             0          33s  
kube-system   kube-scheduler-master            1/1       Running             0          2m   

Фланелевые журналы:

$ kubectl logs -n kube-system kube-flannel-ds-gdz8f -c kube-flannel
I1216 12:00:35.817207       1 main.go:474] Determining IP address of default interface
I1216 12:00:35.822082       1 main.go:487] Using interface with name enp0s3 and address 10.0.2.15
I1216 12:00:35.822335       1 main.go:504] Defaulting external address to interface address (10.0.2.15)
I1216 12:00:35.909906       1 kube.go:130] Waiting 10m0s for node controller to sync
I1216 12:00:35.909950       1 kube.go:283] Starting kube subnet manager
I1216 12:00:36.987719       1 kube.go:137] Node controller sync successful
I1216 12:00:37.087300       1 main.go:234] Created subnet manager: Kubernetes Subnet Manager - master
I1216 12:00:37.087433       1 main.go:237] Installing signal handlers
I1216 12:00:37.088836       1 main.go:352] Found network config - Backend type: vxlan
I1216 12:00:37.089018       1 vxlan.go:119] VXLAN config: VNI=1 Port=0 GBP=false DirectRouting=false
I1216 12:00:37.295988       1 main.go:299] Wrote subnet file to /run/flannel/subnet.env
I1216 12:00:37.296025       1 main.go:303] Running backend.
I1216 12:00:37.296048       1 main.go:321] Waiting for all goroutines to exit
I1216 12:00:37.296084       1 vxlan_network.go:56] watching for new subnet leases

Как мне настроить фланель в кубернетах для прослушивания в enp0s8 вместо enp0s3?


person clvx    schedule 16.12.2017    source источник
comment
на centos я добавил переменную среды 'FLANNEL_OPTIONS = - iface = eth1' (потому что eth1 по умолчанию, а не eth0) в /run/flannel/subnet.env, и это сработало   -  person Andrew    schedule 12.10.2018
comment
Согласно документам по переменным среды, похоже, вы тоже могли бы просто установить FLANNELD_IFACE.   -  person geerlingguy    schedule 18.12.2019


Ответы (3)


У меня такая же проблема, пытаюсь использовать k8s и Vagrant. Я нашел это примечание в документации по фланели :

Vagrant обычно назначает всем виртуальным машинам два интерфейса. Первый, для которого всем хостам назначается IP-адрес 10.0.2.15, предназначен для внешнего трафика, который преобразуется через NAT.

Это может привести к проблемам с фланелью. По умолчанию фланель выбирает первый интерфейс на хосте. Это приводит к тому, что все хосты думают, что у них один и тот же публичный IP-адрес. Чтобы предотвратить эту проблему, передайте flannel флаг --iface eth1, чтобы выбрать второй интерфейс.

Поэтому я ищу его в конфигурации стручка фланели. Если вы загрузите файл kube-flannel.yml, вам следует взглянуть на спецификацию DaemonSet, особенно на контейнер "кубе-фланель". Там вы должны добавить обязательный аргумент «--iface = enp0s8» (не забывайте «=»). Часть кода, который я использовал.

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

Затем запустите kubectl apply -f kube-flannel.yml

Надежда помогает.

person lalo    schedule 12.02.2018
comment
Я подозревал, что проблема связана с фланелью iface, которую использовала для vxlan, но пытался решить ее, изменив таблицу маршрутизации. Ваше решение сработало как шарм. - person CTodea; 17.05.2018
comment
А также не забудьте добавить в kubelet.service следующее: --node-ip={{ hostvars[inventory_hostname]['ansible_enp0s8']['ipv4']['address'] }} , таким образом правильные IP-адреса хоста будут соответствовать CIDR подов. - person jonashackt; 21.06.2018
comment
мой iface - eth0 - person Hao; 14.11.2018
comment
Привет, лало, твое решение будет работать, только если все узлы будут одинаковыми! Если интерфейс на некоторых из узлов не enp0s8, это не сработает. - person mlazarov; 18.11.2018
comment
--iface-regex = 10 \ .0 \. * \. * это ответ - person Alex G; 04.07.2019

не знаю, запуск напрямую "kubectl apply -f kube-flannel.yml" не работает на моей стороне, он все еще отображается с использованием интерфейса с именем eth0.

после запуска kubectl delete -f kube-flannel.yml, затем kubectl apply -f kube-flannel.yml он показывает использование интерфейса с eth1:

I1122 11:31:44.405982       1 main.go:488] Using interface with name eth1 and address 192.168.0.24
I1122 11:31:44.406153       1 main.go:505] Defaulting external address to interface address (192.168.0.24)
I1122 11:31:44.428414       1 kube.go:131] Waiting 10m0s for node controller to sync
I1122 11:31:44.428552       1 kube.go:294] Starting kube subnet manager
I1122 11:31:45.429349       1 kube.go:138] Node controller sync successful
person Libo Zhu    schedule 22.11.2018
comment
Спасибо за комментарий, @ Libo-zhu, мы испытали точно такое же поведение. - person Bathz; 12.02.2019

Прежде всего, ничто на странице документации, которую вы связали, не говорит /etc/sysconfig; это очень старый каталог, который не подходит ни для systemd, ни для kubernetes DaemonSet, который вы фактически используете. Кроме того, если вы не монтируете что-то как /etc/sysconfig, то даже размещение этого содержимого в файле в файловой системе хоста не поможет вам при запуске flannel в контейнере.

Я думаю, что кратчайший путь к успеху - это добавить флаг командной строки в список аргументов flanneld, который можно легко сделать с помощью kubectl --namespace=kube-system edit daemonset kube-flannel-ds, обновить объявление container:, затем kubectl --namespace=kube-system delete pod -l app=flannel

person mdaniel    schedule 18.12.2017