Flannel: no se puede acceder al pod desde el pod en un nodo diferente

Creado en 6 feb. 2019  ·  6Comentarios  ·  Fuente: coreos/flannel

Comportamiento esperado

He instalado Kubernetes en Ubuntu 18. Cuando configuro calico funciona pero quiero usar franela.
Cuando uso Flanned, no puedo hacer ping o curl a un pod en un nodo diferente. Funciona para un pod en el mismo nodo como aquí:

kubectl exec busybox -- curl 10.244.2.4
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   612  100   612    0     0   357k      0 --:--:-- --:--:-- --:--:--  597k
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Versión:

Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.2", GitCommit:"17c77c7898218073f14c8d573582e8d2313dc740", GitTreeState:"clean", BuildDate:"2018-10-24T06:54:59Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.5", GitCommit:"51dd616cdd25d6ee22c83a858773b607328a18ec", GitTreeState:"clean", BuildDate:"2019-01-16T18:14:49Z", GoVersion:"go1.10.7", Compiler:"gc", Platform:"linux/amd64"}
$ uname -r
4.15.0-43-generic

Comportamiento actual

No se puede acceder al pod en un nodo diferente

kubectl exec busybox -- curl 10.244.1.4
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: (7) Failed to connect to 10.244.1.4 port 80: No route to host
command terminated with exit code 7

Pasos para reproducir (para errores)

Franela instalada
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

El clúster está funcionando bien:

kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}
$ kubectl get pods -n kube-system
NAME                            READY   STATUS    RESTARTS   AGE
coredns-576cbf47c7-q7ncm        1/1     Running   1          30m
coredns-576cbf47c7-tclp8        1/1     Running   1          30m
etcd-kube1                      1/1     Running   1          30m
kube-apiserver-kube1            1/1     Running   1          30m
kube-controller-manager-kube1   1/1     Running   1          30m
kube-flannel-ds-amd64-6vlkx     1/1     Running   1          30m
kube-flannel-ds-amd64-7twk8     1/1     Running   1          30m
kube-flannel-ds-amd64-rqzr7     1/1     Running   1          30m
kube-proxy-krfzk                1/1     Running   1          30m
kube-proxy-vrssw                1/1     Running   1          30m
kube-proxy-xlrgz                1/1     Running   1          30m
kube-scheduler-kube1            1/1     Running   1          30m

El clúster se crea con: kubeadm init --apiserver-advertise-address=192.168.20.101 --pod-network-cidr=10.244.0.0/16

cortafuegos:

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-N KUBE-EXTERNAL-SERVICES
-N KUBE-FIREWALL
-N KUBE-FORWARD
-N KUBE-SERVICES
-A INPUT -m conntrack --ctstate NEW -m comment --comment "kubernetes externally-visible service portals" -j KUBE-EXTERNAL-SERVICES
-A INPUT -j KUBE-FIREWALL
-A FORWARD -m comment --comment "kubernetes forwarding rules" -j KUBE-FORWARD
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -s 10.244.0.0/16 -j ACCEPT
-A FORWARD -d 10.244.0.0/16 -j ACCEPT
-A OUTPUT -m conntrack --ctstate NEW -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
-A OUTPUT -j KUBE-FIREWALL
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
-A KUBE-FIREWALL -m comment --comment "kubernetes firewall for dropping marked packets" -m mark --mark 0x8000/0x8000 -j DROP
-A KUBE-FORWARD -m comment --comment "kubernetes forwarding rules" -m mark --mark 0x4000/0x4000 -j ACCEPT
-A KUBE-FORWARD -s 10.244.0.0/16 -m comment --comment "kubernetes forwarding conntrack pod source rule" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A KUBE-FORWARD -d 10.244.0.0/16 -m comment --comment "kubernetes forwarding conntrack pod destination rule" -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Traté de agregar iptables --policy FORWARD ACCEPT en cada nodo, pero no funcionó.

información adicional:

$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1


$ sysctl net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1

Comentario más útil

@PatrickKutch ¿También estás usando ubuntu 18? Logré hacerlo funcionar agregando la interfaz de red al archivo flannel.yml:

$ curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/v0.11.0/Documentation/kube-flannel.yml
$ sed -i.bak 's|        - --ip-masq|        - --ip-masq\n        - --iface=enp0s8|' kube-flannel.yml
$ kubectl create -f kube-flannel.yml

El comando sed agrega --iface=enp0s8 a los argumentos de franela:

...
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --iface=enp0s8
        - --kube-subnet-mgr
...

Espero que esto lo resuelva para ti también.

Todos 6 comentarios

Tengo exactamente el mismo problema, aunque estoy ejecutando 1.13.0. Calico funciona bien, pero quería usar franela. simplemente intentando un simple ping de pod a pod sin suerte.

@PatrickKutch ¿También estás usando ubuntu 18? Logré hacerlo funcionar agregando la interfaz de red al archivo flannel.yml:

$ curl -o kube-flannel.yml https://raw.githubusercontent.com/coreos/flannel/v0.11.0/Documentation/kube-flannel.yml
$ sed -i.bak 's|        - --ip-masq|        - --ip-masq\n        - --iface=enp0s8|' kube-flannel.yml
$ kubectl create -f kube-flannel.yml

El comando sed agrega --iface=enp0s8 a los argumentos de franela:

...
        command:
        - /opt/bin/flanneld
        args:
        - --ip-masq
        - --iface=enp0s8
        - --kube-subnet-mgr
...

Espero que esto lo resuelva para ti también.

Estoy en Ubuntu 18. Me alegro de que lo hayas hecho funcionar por ti mismo, sin embargo, dado que tengo muchos nodos en mi clúster, con diferentes dispositivos de red en ellos, no veo cómo me funcionará especificar un dispositivo :-(

@PatrickKutch ¿No son todos los nodos de Ubuntu 18 con la red enp0s8 ? ("el eth0 de Ubuntu 18").

No. Ninguna de mis 20 cajas tiene eso. Depende de en qué ranura se asiente la NIC y algunas otras cosas.

Buenos días. Publicación en caso de que esto ayude a otros. Desde https://github.com/coreos/flannel/issues/122 :

sudo systemctl stop docker
sudo iptables -t nat -F
sudo ip link del docker0
sudo systemctl start docker

Puse esto en un script que uso para volver a implementar el clúster (es decir kubeadm reset , kubeadm init ... , etc.), y resolvió dos problemas que estaba encontrando:

  • No se pueden curl pods en diferentes nodos.
  • El DNS del clúster se está ejecutando pero no funciona (es decir, no se pudo resolver kubernetes.default ni ningún otro nombre de DNS en la red del clúster).

¡Salud!

¿Fue útil esta página
0 / 5 - 0 calificaciones