2016-01-11 7 views
7

Ich habe einen Kubernetes Einzelknotenaufbau (siehe https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant-single.html)Kubernetes pod nicht (durch Service) verbindet selbst, nur auf anderen pod-Behälter

Ich habe einen Service und eine Replikations Controller Schaffung Schoten. Diese Pods müssen sich mit den anderen Pods im gleichen Dienst verbinden (Hinweis: Dies ist letztlich so, dass ich Mongo mit w/replica-Sets ausführen kann (nicht localhost), aber dieses einfache Beispiel zeigt das Problem, das mongo hat).

Wenn ich eine Verbindung von einem Knoten zum Dienst herstelle, wird dieser (wie erwartet) an einen der Pods verteilt. Dies funktioniert so lange, bis es sich selbst ausgleicht (der Container, in dem ich bin). Dann kann es keine Verbindung herstellen.

Es tut mir leid, um ausführlich zu sein, aber ich werde alle meine Dateien anhängen, so dass Sie sehen können, was ich in diesem kleinen Beispiel mache.

Dockerfile:

FROM ubuntu 
MAINTAINER Eric H 
RUN apt-get update; apt-get install netcat 
EXPOSE 8080 
COPY ./entry.sh/
ENTRYPOINT ["/entry.sh"] 

Hier ist der Einstiegspunkt

#!/bin/bash 
# wait for a connection, then tell them who we are 
while : ; do 
    echo "hello, the date=`date`; my host=`hostname`" | nc -l 8080 
    sleep .5 
done 

die

docker build -t echoserver .

Tag dockerfile bauen und zu meinem K8S Cluster-Registrierung laden

docker tag -f echoserver:latest 127.0.0.1:5000/echoserver:latest 
docker push 127.0.0.1:5000/echoserver:latest 

Hier mein Replication-Controller

apiVersion: v1 
kind: ReplicationController 
metadata: 
    labels: 
    role: echo-server 
    app: echo 
    name: echo-server-1 
spec: 
    replicas: 3 
    template: 
    metadata: 
     labels: 
     entity: echo-server-1 
     role: echo-server 
     app: echo 
    spec: 
     containers: 
     - 
     image: 127.0.0.1:5000/echoserver:latest 
     name: echo-server-1 

     ports: 
      - containerPort: 8080 

Und schließlich ist mein Service-Dienst meine hier ist

kind: Service 
metadata: 
    labels: 
    app: echo 
    role: echo-server 
    name: echo-server-1 
    name: echo-server-1 
spec: 
    selector: 
    entity: echo-server-1 
    role: echo-server 
    ports: 
    - port: 8080 
     targetPort: 8080 

erstellen kubectl create -f echo.service.yaml

erstellen mein rc kubectl create -f echo.controller.yaml

mein PODs 210

Get

kubectl get po 
NAME     READY  STATUS RESTARTS AGE 
echo-server-1-jp0aj 1/1  Running 0   39m 
echo-server-1-shoz0 1/1  Running 0   39m 
echo-server-1-y9bv2 1/1  Running 0   39m 

den Dienst IP kubectl exec -t -i echo-server-1-jp0aj /bin/bash

nun mehrmals auf den Dienst verbinden ... Es wird mir

kubectl get svc 
NAME   CLUSTER_IP EXTERNAL_IP PORT(S) SELECTOR        AGE 
echo-server-1 10.3.0.246 <none>  8080/TCP entity=echo-server-1,role=echo-server 39m 

Exec in eine der Hülsen Holen Sie sich das App-Nachricht für alle Pods außer wenn es zu sich selbst kommt, woraufhin es hängt.

[email protected]:/# nc 10.3.0.246 8080 
hello, the date=Mon Jan 11 22:02:38 UTC 2016; my host=echo-server-1-y9bv2 
[email protected]:/# nc 10.3.0.246 8080 
^C 
[email protected]:/# nc 10.3.0.246 8080 
hello, the date=Mon Jan 11 22:02:43 UTC 2016; my host=echo-server-1-shoz0 
[email protected]:/# nc 10.3.0.246 8080 
^C 
[email protected]:/# nc 10.3.0.246 8080 
hello, the date=Mon Jan 11 22:31:19 UTC 2016; my host=echo-server-1-y9bv2 
[email protected]:/# nc 10.3.0.246 8080 
hello, the date=Mon Jan 11 22:31:23 UTC 2016; my host=echo-server-1-shoz0 
[email protected]:/# nc 10.3.0.246 8080 
hello, the date=Mon Jan 11 22:31:26 UTC 2016; my host=echo-server-1-y9bv2 
[email protected]:/# nc 10.3.0.246 8080 
hello, the date=Mon Jan 11 22:31:27 UTC 2016; my host=echo-server-1-shoz0 
[email protected]:/# nc 10.3.0.246 8080 

Wie kann ich Dinge so konfigurieren, dass alle Mitglieder eines Dienstes eine Verbindung mit allen anderen Mitgliedern herstellen können, einschließlich sich selbst?

Antwort

3

Vielen Dank an alle, die auf GitHub geholfen haben.
Die Abhilfemaßnahme erwies sich wie folgt:

tanen01 am 4. Feb. kommentiert v1.1.7 K8S hier das gleiche Problem sehen stabil

Problem tritt mit:

kube-proxy --proxy-mode=iptables 

Sobald ich es geändert habe:

(auch die Standardeinstellung), dann funktioniert es wieder.

Also, wenn Sie diese erleben, bitte versuchen Sie es --proxy-mode ausschalten, wenn Sie kube-proxy starten.

1

Das soll funktionieren - wir haben es ausgiebig mit dem iptables-Proxy in kubernetes v1.1 getestet (nicht Standard, sondern in v1.2). Kannst du mehr über deine Umgebung sagen?

+0

kubelet --version = true Kubernetes v1.1.2 + 3.085.895 – rideswitch

+0

ich die Single-Node-Demo bin mit von https://github.com/coreos/coreos-kubernetes.git als mein Ausgangspunkt – rideswitch

+0

Coreos Version 899,5. 0 von beta – rideswitch