<p>O kubeadm falha sem endereço ipv4 na interface de rede com defaultroute</p>

Criado em 3 out. 2018  ·  42Comentários  ·  Fonte: kubernetes/kubeadm

É um RELATÓRIO DE BUGS ou PEDIDO DE RECURSO?

Escolha um: RELATÓRIO DE BUG

Versões

versão kubeadm (use kubeadm version ):
kubeadm version: &version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:14:39Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}

Meio Ambiente :

  • Versão do Kubernetes (use 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"}
  • Provedor de nuvem ou configuração de hardware : Hardware
  • SO (por exemplo, de / etc / os-release):
    `` `NAME =" CentOS Linux "
    VERSÃO = "7 (núcleo)"
    ID = "centos"
    ID_LIKE = "rhel fedora"
    VERSION_ID = "7"
    PRETTY_NAME = "CentOS Linux 7 (Core)"
    ANSI_COLOR = "0; 31"
    CPE_NAME = "cpe: / o: centos: centos : 7"
    HOME_URL = " https://www.centos.org/ "
    BUG_REPORT_URL = " https://bugs.centos.org/ "

CENTOS_MANTISBT_PROJECT = "CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION = "7"
REDHAT_SUPPORT_PRODUCT = "centos"
REDHAT_SUPPORT_PRODUCT_VERSION = "7"


- **Kernel** (e.g. `uname -a`):
`Linux node1-lab-a1-01 3.10.0-862.14.4.el7.x86_64 #1 SMP Wed Sep 26 15:12:11 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux`

- **Others**:
Our hosts are setup using IPv4 BGP over IPv6 (rfc5549: https://tools.ietf.org/html/rfc5549).
The host ip address is attached to a loopback address and FRR bgp announces that IP to connected TOR switches (spine and leaf fabric). There is no IPv4 address on the connected interfaces, but I do have a default route that allows access to the world:

```# ip route
default proto bgp metric 20
    nexthop via 169.254.0.1 dev em1 weight 1 onlink
    nexthop via 169.254.0.1 dev em2 weight 1 onlink
10.101.155.0/24 proto bgp metric 20
    nexthop via 169.254.0.1 dev em1 weight 1 onlink
    nexthop via 169.254.0.1 dev em2 weight 1 onlink
10.101.246.0/24 dev em3 proto kernel scope link src 10.101.246.11
169.254.0.0/16 dev em3 scope link metric 1002
169.254.0.0/16 dev em1 scope link metric 1003
169.254.0.0/16 dev em2 scope link metric 1005
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1

O que aconteceu?

Tendo um problema semelhante ao # 982

corrida

# kubeadm config images pull
unable to select an IP from default routes.
# kubeadm config images pull -v 10
I1003 20:56:35.880474   87226 interface.go:360] Looking for default routes with IPv4 addresses
I1003 20:56:35.880550   87226 interface.go:365] Default route transits interface "em1"
I1003 20:56:35.881831   87226 interface.go:174] Interface em1 is up
I1003 20:56:35.881925   87226 interface.go:222] Interface "em1" has 1 addresses :[fe80::266e:96ff:fe5f:7b48/64].
I1003 20:56:35.881957   87226 interface.go:189] Checking addr  fe80::266e:96ff:fe5f:7b48/64.
I1003 20:56:35.881989   87226 interface.go:202] fe80::266e:96ff:fe5f:7b48 is not an IPv4 address
I1003 20:56:35.882027   87226 interface.go:360] Looking for default routes with IPv6 addresses
I1003 20:56:35.882051   87226 interface.go:376] No active IP found by looking at default routes
unable to select an IP from default routes.

O mesmo erro acontece ao fazer kubeadm init

O que você esperava que acontecesse?

Espero que o kubeadm funcione e extraia as imagens ou execute um init.
Talvez haja uma maneira de especificar o endereço IP ou a interface de meus hosts.

Como reproduzi-lo (o mínimo e precisamente possível)?

Mais alguma coisa que precisamos saber?

areecosystem kinbug prioritimportant-longterm sinetwork

Comentários muito úteis

Além disso, é um pouco mais difícil de analisar com todas as outras saídas e espaçamentos;)

Já fiz tanto sed & awk na minha vida, provavelmente estou muito insensível ;-)

Todos 42 comentários

@ bart0sh @kad - Você tem alguma configuração de rede semelhante a esta?

@scheuk qual é o endereço IPv4 local resolvível para esse host?
Você pode adicioná-lo a / etc / hosts e especificar a configuração do kubeadm?

/ cc @ kubernetes / sig-network-bugs

@timothysc sabemos se o api-server funcionará com este tipo de ambiente? Só estou me perguntando se conseguirmos fazer o kubeadm funcionar nesta configuração de rede, teremos mais problemas no futuro?

Se você tiver um adaptador Ethernet específico que envolve os detalhes e você pode vincular ou substituir / etc / hosts, eu acho que deveria "simplesmente funcionar".

@timothysc
meu IP de host local fica em lo0:

# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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
    inet 10.101.228.11/32 brd 10.101.228.11 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever

o endereço 10.101.228.11 ip

Passei a manhã fazendo kubeadm init trabalhar.
Consegui adicionar isso à configuração e o init funcionou perfeitamente.

api:
  advertiseAddress: 10.101.228.11

No entanto, ainda estou preso precisando de uma rota para executar o comando kubeadm config images pull
bem como kubeadm token create --print-join-command para obter o comando join para adicionar nós de trabalho ao cluster.

@timothysc
Você pode explicar a substituição de / etc / hosts?

Acabei de tentar adicionar 10.101.228.11 hostname a / etc / hosts.
mas o kubeadm ainda está olhando para a interface com a rota.

Portanto, isso tem a ver com as especificações de sua configuração de rede, juntamente com o comportamento padrão do sistema.

Tenho quase certeza de que se você fizesse um adaptador com ponte para vincular o endereço IPv4, em vez de ser vinculado ao loopback, ele detectaria corretamente.

Estou cavando agora para ver se há uma substituição global para o nic que funciona em *.

Portanto, seria uma combinação de --api-advertise-addresses e --hostname-override, não tenho certeza de que todas essas opções percolam todos os subcomandos, ainda investigando.

@scheuk você poderia correr

kubeadm config images pull --config yourconfig.yaml

com seu arquivo de configuração especificando: advertiseAddress

Você pode precisar passar --config para cada subcomando b / c da forma como sua rede está configurada.

você pode executar kubeadm token create --print-join-command partir de qualquer host ou pipeline com a sinalização --kubeconfig .

Uma possível solução alternativa para o puxão de imagens dada a configuração seria algo como:
kubeadm config images list | xargs -n1 -I {} docker pull {}
executar antes do init

@timothysc @mauilion

Não continue --kubeconfig:

# kubeadm token create --print-join-command --kubeconfig /etc/kubernetes/admin.conf
unable to select an IP from default routes.

também se eu tentar com --config, ele diz que você não pode combinar os dois:

# kubeadm token create --print-join-command --config /etc/kubernetes/kubeadm.conf
can not mix '--config' with arguments [print-join-command]

Isso funcionou, vou atualizar minha implantação para fazer isso

# kubeadm config images pull --config /etc/kubernetes/kubeadm.conf

Quero dizer que você pode usar kubeadm token create de uma máquina com uma rota padrão como o seu laptop, desde que tenha acesso ao apiserver em execução e um kubeconfig de nível de administrador

@scheuk

`` `

kubeadm token create --print-join-command --config /etc/kubernetes/kubeadm.conf

não pode misturar '--config' com argumentos [print-join-command]
`` `

é um pequeno bug que podemos consertar no 1.13

Você ainda está bloqueado?

@timothysc

Eu ainda estou bloqueado.
Usamos o ansible para realizar todas essas etapas e atualmente executo
kubeadm token create --print-join-command no primeiro mestre para obter o comando para unir os nós de trabalho ao cluster. No entanto, posso ser capaz de me desbloquear temporariamente fazendo o que @mauilion diz, e configurar o kubeadm localmente (de onde o ansible é executado) para executar essa ação.

Obrigado por toda a ajuda até agora!

Usamos o ansible para realizar todas essas etapas e atualmente executo
kubeadm token create --print-join-command no primeiro mestre para obter o comando para unir os nós de trabalho ao cluster.

A saída de init contém o comando que você deve executar nos outros nós.

Isso normalmente é feito em ansible, pois o token tem vida curta e é mais fácil capturar a saída do comando join do token create em vez do init.

Além disso, é um pouco mais difícil de analisar com todas as outras saídas e espaçamentos;)

Além disso, é um pouco mais difícil de analisar com todas as outras saídas e espaçamentos;)

Já fiz tanto sed & awk na minha vida, provavelmente estou muito insensível ;-)

Portanto, meu localhost onde eu executaria o kubeadm do ansible é um mac.
Na página de instalação do kubeadm, ele não oferece suporte ao mac os x.

docker run --net=host --rm -v /path/to/kubeconfig:/kubeconfig quay.io/mauilion/kubeadm:v1.11.3  kubeadm token create --print-join-command --kubeconfig=/kubeconfig

output:
kubeadm join 10.192.0.2:6443 --token iwikby.5u4wc05jnbdldq5e --discovery-token-ca-cert-hash sha256:f19311dfe7034d14c48002fd4f29e285270a573b9e9066735d5749ca89b9c89f

:)

@mauilion duh! mas isso é incrível, você tem um conatiner kubeadm :)

Acabei de atualizar meu ansible para executar:
docker run --rm -v /etc/kubernetes/admin.conf:/kubeconfig quay.io/mauilion/kubeadm:v1.11.3 kubeadm token create --print-join-command --kubeconfig=/kubeconfig 2>/dev/null no primeiro mestre. Deixe o contêiner usar a rede do docker em vez da rede do host para mascarar minha configuração de rede.

bom

Você está desbloqueado @scheuk

Sim, estou desbloqueado agora! Obrigado por toda a ajuda!

@ bart0sh @kad - Você tem alguma configuração de rede semelhante a esta?

Não temos exatamente isso, mas acho que podemos simular de forma mais simples, mas perto dessa configuração.

@scheuk você pode mostrar exemplos do que você tem em sua tabela de roteamento ipv6 e que tipo de endereços ipv4 / ipv6 você tem em suas interfaces em *? (não há necessidade de mostrar IPs reais, você pode ofuscar, apenas gostaria de ver que tipo de endereços unicast podem estar presentes em sua configuração, ao lado de endereços locais de link).

@kad nossa equipe de rede mudou para ipv6 ainda, mas eles compraram o roteamento cumulus linux no host usando os endereços locais de link ipv6 e o ​​RFC mencionado acima.
aqui um link de como funciona: https://docs.cumulusnetworks.com/display/ROH/Routing+on+the+Host
na seção Interfaces não numeradas de BGP e OSPF .

Anexado aqui está a saída da minha tabela de roteamento ipv6 e interfaces:

# ip -6 route
unreachable ::/96 dev lo metric 1024 error -113 pref medium
unreachable ::ffff:0.0.0.0/96 dev lo metric 1024 error -113 pref medium
unreachable 2002:a00::/24 dev lo metric 1024 error -113 pref medium
unreachable 2002:7f00::/24 dev lo metric 1024 error -113 pref medium
unreachable 2002:a9fe::/32 dev lo metric 1024 error -113 pref medium
unreachable 2002:ac10::/28 dev lo metric 1024 error -113 pref medium
unreachable 2002:c0a8::/32 dev lo metric 1024 error -113 pref medium
unreachable 2002:e000::/19 dev lo metric 1024 error -113 pref medium
unreachable 3ffe:ffff::/32 dev lo metric 1024 error -113 pref medium
fe80::/64 dev fabric0 proto kernel metric 256 mtu 9000 pref medium
fe80::/64 dev em1 proto kernel metric 256 pref medium
fe80::/64 dev em2 proto kernel metric 256 pref medium
fe80::/64 dev em3 proto kernel metric 256 pref medium
fe80::/64 dev docker0 proto kernel metric 256 pref medium

# ip addr show em1
4: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 24:6e:96:5f:7b:48 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::266e:96ff:fe5f:7b48/64 scope link
       valid_lft forever preferred_lft forever

# ip addr show em2
5: em2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
    link/ether 24:6e:96:5f:7b:4a brd ff:ff:ff:ff:ff:ff
    inet6 fe80::266e:96ff:fe5f:7b4a/64 scope link
       valid_lft forever preferred_lft forever

@kad nossa equipe de rede mudou para ipv6 ainda, mas eles compraram o roteamento cumulus linux no host usando os endereços locais de link ipv6 e o ​​RFC mencionado acima.
aqui um link de como funciona: https://docs.cumulusnetworks.com/display/ROH/Routing+on+the+Host
na seção Interfaces não numeradas de BGP e OSPF .

@scheuk obrigado pelos esclarecimentos. Então, para resumir a imagem inteira (para ver, se eu compreendo sua configuração completamente):

  • seu host tem na interface lo um (ou mais?) / 32 endereços ipv4.
  • você não tem endereços unicast ipv6 / 128 em lo (semelhante aos cenários ipv4)
  • interfaces de rede usam locais de link em bofh ipv4 / ipv6.
  • ospf / bgp usado para anunciar rotas reais para o host e / 32 ou / 128 do host são anunciados de volta aos TORs.

Isso é correto?

se estiver correto acima, você pode compartilhar mais uma saída de ip ro get 8.8.8.8 ?
(em vez de 8.8.8.8 você pode usar qualquer IP unicast. Estou tentando entender qual kernel usará como endereço de origem de saída para a rota padrão e as rotas que você obteve em ospf / bgp, fora do intervalo de IP do cluster )

@scheuk você pode tentar o patch de # 69578 para ver se funciona em sua configuração.
Se você precisar de ajuda, posso fornecer binário integrado com esse patch aplicado.

@kad, seu entendimento de nossa configuração está correto.
O BGP também anuncia outras rotas, ele está configurado para pegar rotas de buraco negro locais e anunciá-las, mas isso é para conectividade POD vs conectividade de host.

Aqui está a saída de ip ro get no host:

# ip ro get 8.8.8.8
8.8.8.8 via 169.254.0.1 dev em2 src 10.101.228.11
    cache

Vou tentar testar o patch do # 69578 também e informá-lo

@kad você pode me enviar um binário, pode levar menos tempo do que eu configurando go / descobrindo como adicionar um patch :)

@kad você pode me enviar um binário, pode levar menos tempo do que eu configurando go / descobrindo como adicionar um patch :)

tente http://orava.kad.name/kubeadm/kubeadm-69578
Este kubeadm é construído a partir do branch master. mas, no mínimo, deve estar ok para tentar em sua configuração.

@kad com boa aparência:

# ./kubeadm-69578 config images pull -v 10
I1009 21:53:05.336396   47234 interface.go:384] Looking for default routes with IPv4 addresses
I1009 21:53:05.336485   47234 interface.go:389] Default route transits interface "em1"
I1009 21:53:05.337591   47234 interface.go:196] Interface em1 is up
I1009 21:53:05.337687   47234 interface.go:244] Interface "em1" has 1 addresses :[fe80::266e:96ff:fe5f:7b48/64].
I1009 21:53:05.337721   47234 interface.go:211] Checking addr  fe80::266e:96ff:fe5f:7b48/64.
I1009 21:53:05.337742   47234 interface.go:224] fe80::266e:96ff:fe5f:7b48 is not an IPv4 address
I1009 21:53:05.337768   47234 interface.go:398] Default route exists for IPv4, but interface "em1" does not have unicast addresses. Checking loopback interface
I1009 21:53:05.338779   47234 interface.go:196] Interface lo is up
I1009 21:53:05.338884   47234 interface.go:244] Interface "lo" has 4 addresses :[127.0.0.1/8 10.101.228.11/32 192.0.2.1/24 ::1/128].
I1009 21:53:05.338918   47234 interface.go:211] Checking addr  127.0.0.1/8.
I1009 21:53:05.338958   47234 interface.go:221] Non-global unicast address found 127.0.0.1
I1009 21:53:05.338977   47234 interface.go:211] Checking addr  10.101.228.11/32.
I1009 21:53:05.338995   47234 interface.go:218] IP found 10.101.228.11
I1009 21:53:05.339025   47234 interface.go:250] Found valid IPv4 address 10.101.228.11 for interface "lo".
I1009 21:53:05.339044   47234 interface.go:404] Found active IP 10.101.228.11 on loopback interface
I1009 21:53:05.339186   47234 version.go:156] fetching Kubernetes version from URL: https://dl.k8s.io/release/stable-1.txt
I1009 21:53:05.687024   47234 feature_gate.go:206] feature gates: &{map[]}

Boa. então, por favor, comente sobre RP :)

/ cc @rdodev - com relação aos problemas do cli-arg.

PR relacionado a isso está em andamento por
https://github.com/kubernetes/kubernetes/pull/69578

/ assign @rdodev

Vamos conversar de manhã sobre este.

kubeadm token create --print-join-command --config /etc/kubernetes/kubeadm.conf não pode misturar '--config' com argumentos [print-join-command]

Em termos de cli isso já foi cuidado com o @timothysc

https://github.com/kubernetes-csi/driver-registrar/blob/87d0059110a8b4a90a6d2b5a8702dd7f3f270b80/vendor/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/validation/validation.75

ótimo!

Basta colocar o ip do master no lugar de $ (hostname -i)
Por exemplo:
kubeadm init --apiserver-advertise-address 192.168.1.2

Esta página foi útil?
0 / 5 - 0 avaliações