Инфраструктура:
+------------------------------------------------------+
| Host |
| +-----------------------------------+ |
| | Vagrant box | |
| | +------------------------------+ |
| | | Minikube | |
| | | +--------------------------+ |
| | | | Pods/Services/etc... | |
| | | | | |
| | | | | <--+ curl |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
+-----+----+---+--------------------------+------------+
Пример:
$ kubectl run nginx --image=nginx:alpine
svc.yaml:
apiVersion: v1
kind: Service
metadata:
labels:
run: nginx
name: nginx
spec:
externalTrafficPolicy: Cluster
ports:
- nodePort: 30888
port: 30888
protocol: TCP
targetPort: 80
selector:
run: nginx
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
Создайте сервис (обратите внимание, что его тип NodePort
):
$ kubectl create -f svc.yaml
Все работает и кажется, что я могу подключиться к 127.0.0.1:30888
и 0.0.0.0:30888
изнутри vagrant
коробка:
$ kubectl get po nginx-5bd976694-nq5sr
NAME READY STATUS RESTARTS AGE
nginx-5bd976694-nq5sr 1/1 Running 0 9m
$ kubectl get svc nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.105.135.126 <none> 30888:30888/TCP 9m
$ curl -sv 127.0.0.1:30888 > /dev/null
* Rebuilt URL to: 127.0.0.1:30888/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 30888 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:30888
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.13.8
< Date: Thu, 04 Jan 2018 11:18:21 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Tue, 26 Dec 2017 18:18:51 GMT
< Connection: keep-alive
< ETag: "5a42928b-264"
< Accept-Ranges: bytes
<
{ [612 bytes data]
* Curl_http_done: called premature == 0
* Connection #0 to host 127.0.0.1 left intact
$ curl -sv 0.0.0.0:30888 > /dev/null
* Rebuilt URL to: 0.0.0.0:30888/
* Trying 0.0.0.0...
* TCP_NODELAY set
* Connected to 0.0.0.0 (127.0.0.1) port 30888 (#0)
> GET / HTTP/1.1
> Host: 0.0.0.0:30888
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.13.8
< Date: Thu, 04 Jan 2018 11:18:28 GMT
< Content-Type: text/html
< Content-Length: 612
< Last-Modified: Tue, 26 Dec 2017 18:18:51 GMT
< Connection: keep-alive
< ETag: "5a42928b-264"
< Accept-Ranges: bytes
<
{ [612 bytes data]
* Curl_http_done: called premature == 0
* Connection #0 to host 0.0.0.0 left intact
Итак, это работает на гостевой машине, но если я попробую curl
на vagrant
host - ответа нет:
$ vagrant port | grep guest
22 (guest) => 2222 (host)
30270 (guest) => 27017 (host)
30888 (guest) => 30888 (host)
30330 (guest) => 3306 (host)
30080 (guest) => 8080 (host)
30081 (guest) => 8081 (host)
$ curl -sv 127.0.0.1:30888 > /dev/null
* Rebuilt URL to: 127.0.0.1:30888/
* Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 30888 (#0)
> GET / HTTP/1.1
> Host: 127.0.0.1:30888
> User-Agent: curl/7.52.1
> Accept: */*
>
$ curl -sv 0.0.0.0:30888 > /dev/null
* Rebuilt URL to: 0.0.0.0:30888/
* Trying 0.0.0.0...
* TCP_NODELAY set
* Connected to 0.0.0.0 (127.0.0.1) port 30888 (#0)
> GET / HTTP/1.1
> Host: 0.0.0.0:30888
> User-Agent: curl/7.52.1
> Accept: */*
>
Я думаю, что самая большая проблема здесь в том, что minukube
ip в бродячем поле 127.0.0.1
:
$ sudo -E minikube ip
127.0.0.1
Любые идеи?
Оказалось, что простой iptables
Правило может положить конец страданиям:
# iptables -A DOCKER -j ACCEPT
Может потребоваться запустить с параметром --insecure-bind-address = 0.0.0.0.