Я создал 3-узловой кластер Kubernetes (1 мастер + 2 рабочих) на VirtualBox, используя инструкции здесь. Я использую Flannel для оверлейной сети.
Я установил sysctl -w net.bridge.bridge-nf-call-iptables=1
и sysctl -w net.bridge.bridge-nf-call-ip6tables=1
на мастере во время установки. В то время я не устанавливал их на рабочих, но я установил их позже и перезагрузил оба узла.
У меня есть простое веб-приложение, написанное на Go, которое прослушивает порт 8080. Я создал контроллер pod + репликации следующим образом:
kubectl run foo --image=<...> --port=8080 --generator=run/v1
Я могу получить доступ к своей службе, используя IP-адрес POD и порт 8080.
Я также создал службу 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
, поэтому соединение не проходит.Если вместо этого я создаю службу 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
Как это отладить?