kubernetes: невозможно получить доступ к службе в кластере VirtualBox через ClusterIP / NodePort

Я создал 3-узловой кластер Kubernetes (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. Я также создал службу ClusterIP.

    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
    

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


person CppNoob    schedule 19.05.2018    source источник


Ответы (2)


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

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

person Bal Chua    schedule 20.05.2018

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

kubectl describe service foo-http

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

 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

и снова создайте свой сервис Ex.

kubectl create -f UrServiceScript.yaml
person EngSabry    schedule 21.05.2018