Kubernetes pod не может подключиться (через службу) к себе, только к другим контейнерам pod

у меня есть настройка одного узла kubernetes (см. https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant-single.html)

у меня есть служба и контроллер репликации, создающий модули. Эти стручки должны подключаться к другим стручкам в той же службе (Примечание: это в конечном счете, чтобы я мог заставить mongo работать с наборами реплик (не localhost), но этот простой пример демонстрирует проблему, которую имеет mongo).

когда я подключаюсь от любого узел к сервису, он будет распределен (как и ожидалось) на один из стручков. Это будет работать до тех пор, пока он не балансирует нагрузку на себя (контейнер, на котором я нахожусь). Затем он не подключается.

извините за многословие, но я собираюсь прикрепить все мои файлы, чтобы вы могли видеть, что я делаю в этом маленьком примере.

Dockerfile:

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

вот точка входа

#!/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

построить файла Docker

docker build -t echoserver .

тег и загрузить в реестр моего кластера k8s

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

вот мой контроллер репликации

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

и наконец, вот моя служба

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

создать свою службу kubectl create -f echo.service.yaml

создать мой rc kubectl create -f echo.controller.yaml

мои стручки

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

получить IP-адрес службы

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 в один из стручков kubectl exec -t -i echo-server-1-jp0aj /bin/bash

теперь подключение к службе несколько раз... Он даст мне приложение-сообщение для всех стручков, за исключением того, когда он доберется до себя, после чего он зависает.

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

как я могу настроить вещи так, чтобы все члены службы могли подключаться ко всем другим членам, включая себя?

3 ответов


спасибо всем, кто помог на GitHub.
Обходной путь оказался следующим:

tanen01 прокомментировал 4 февраля, увидев ту же проблему здесь, на k8s v1.1.7 стабильный

проблема возникает с:

kube-proxy --proxy-mode=iptables 

однажды я изменил его на:

           --proxy-mode=userspace 

(также по умолчанию), затем он снова работает.

Итак, если вы испытываете это, пожалуйста, попробуйте отключить --proxy-mode когда вы начинаете kube-proxy.


Я видел, как об этом сообщил по крайней мере один другой пользователь. Я подал вопрос: https://github.com/kubernetes/kubernetes/issues/20475

Я предполагаю, что вы использовали версию Kubernetes из этой ссылки -- 1.1.2.


Это должно работать - мы протестировали его широко с прокси iptables в kubernetes v1.1 (не по умолчанию, но будет в v1.2). Можете ли вы подробнее рассказать о своем окружении?