Назад | Перейти на главную страницу

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

Инфраструктура:

+------------------------------------------------------+
| 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.

https://github.com/kubernetes/kubernetes/issues/39586