kubernetes: не может получить доступ к сервису в кластере VirtualBox через ClusterIP / NodePort - PullRequest
0 голосов
/ 19 мая 2018

Я создал кластер kubernetes с 3 узлами (1 мастер + 2 рабочих) в VirtualBox, используя инструкции здесь .Я использую Flannel для оверлейной сети.

Я установил sysctl -w net.bridge.bridge-nf-call-iptables=1 и sysctl -w net.bridge.bridge-nf-call-ip6tables=1 на ведущем устройстве во время установки.Я не устанавливал их на рабочих в то время, но я установил их позже и перезагрузил оба узла.

  1. У меня есть тривиальное веб-приложение, написанное на Go, прослушивающее порт 8080.Я создал контроллер репликации pod + таким образом:

    kubectl run foo --image=<...> --port=8080 --generator=run/v1
    

    Я могу получить доступ к своему сервису, используя IP-адрес POD и порт 8080.

  2. Я также создал ClusterIPservice.

    kubectl expose rc foo --name=foo-http --port=8081 --target-port=8080                   # ClusterIP service
    
    # kubectl get svc foo-http
    NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    foo-http   ClusterIP   10.106.88.24   <none>        8081/TCP   14m
    

    Когда я запускаю это с любого узла кластера, он зависает:

    curl http://10.106.88.24:8081   # that's the ClusterIP
    

    Запустив strace, я вижу, что curl запускает неблокирующую connect,и вращается в цикле на poll, при этом сокет не становится готовым к read - таким образом, соединение не проходит.

  3. Если вместо этого я создаю службу NodePort, Я просто получаю отказано в соединении.

    # cat svc_nodeport.json
    apiVersion: v1
    kind: Service
    metadata:
      name: foo-http
    spec:
      type: NodePort
      ports:
      - port: 8081
        targetPort: 8080
        nodePort: 31123
      selector:
        app: foo
    
    # kubectl create -f svc_nodeport.json
    # kubectl get svc foo-http
    NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    foo-http   NodePort    10.104.78.88   <none>        8081:31123/TCP   7m
    

    Когда я пытаюсь подключиться через порт 31123:

    # curl http://<node-ip>:31123    # Tried on master and both workers
    curl: (7) Failed connect to <node-ip>:31123; Connection refused
    

Как это отладить?

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

сначала проверьте, если что-то не так:

kubectl describe service foo-http

и попробуйте другой сетевой кластер (например: удалите текущую сеть и разверните сеть переплетения)

 kubectl get -n kube-system daemonset | grep -i Flannel |cut -f1 -d ' '| kubectl delete daemonset -n kube-system 
 kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

и для проверки измените "порт""и" targetPort "до 8080, как вы упомянули (или удалите" targetPort "), например:

ports:
      - port: 8080
        targetPort: 8080
        nodePort: 31123

затем

kubectl delete service foo-http

и снова создайте службу, напр.

kubectl create -f UrServiceScript.yaml
0 голосов
/ 20 мая 2018

Я думаю, что ваш селектор манифеста службы не выбирает модуль.Попробуйте описать стручок и проверьте наличие этикеток.Kubectl description pod Затем измените манифест службы в соответствии с вашими метками pod.

Рекомендуется использовать декларативные способы, написав манифест развертывания или pod, вместо использования обязательных команд kubectl, таких как run или create.

...