Как сделать контейнеры Microk8s доступными с другой машины?

Я хотел бы использовать Microk8s для игры в Spring Cloud Data Flow, поэтому я установил Multipass на свою Windows 10 и виртуальная машина. Я запускаю Ubuntu, на которой установлен Microk8s. Я хотел бы добиться этого, все контейнеры работают на Ubuntu, которая представляет собой виртуальную виртуальную машину Virtualbox, управляемую Multipass, но я бы хотел иметь возможность подключаться к контейнерам из Windows.

Топология выглядит так:

Windows 10:

  • 192.168.1.107 предоставляется моим домашним маршрутизатором

Ubuntu, работающий в Virtualbox.

  • 192.168.52.1, предоставленный, как мне кажется, Windows для Virtualbox (сеть Virtualbox Host-Only)

Если я вхожу в Ubuntu, ifconfig говорит следующее:

multipass@scdf:~/scdf/spring-cloud-dataflow$ ifconfig                                                                                                                               
cbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500                                                                                                                                  
        inet 10.1.1.1  netmask 255.255.255.0  broadcast 0.0.0.0                                                                                                                             
        inet6 fe80::c802:9fff:fea2:93f1  prefixlen 64  scopeid 0x20<link>                                                                                                                   
        ether ca:02:9f:a2:93:f1  txqueuelen 1000  (Ethernet)                                                                                                                                
        RX packets 19890  bytes 6628126 (6.6 MB)                                                                                                                                            
        RX errors 0  dropped 0  overruns 0  frame 0                                                                                                                                         
        TX packets 21413  bytes 13988665 (13.9 MB)  

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0                                                                                                                  
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255
        inet6 fe80::a00:27ff:feba:30bb  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:ba:30:bb  txqueuelen 1000  (Ethernet)
        RX packets 208972  bytes 273941063 (273.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 24249  bytes 2084939 (2.0 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 157483  bytes 40950239 (40.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 157483  bytes 40950239 (40.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

microk8s.kubectl get all говорит следующее, это было выполнено в Ubuntu:

multipass@scdf:~/scdf/spring-cloud-dataflow$ microk8s.kubectl get all
NAME                                          READY   STATUS    RESTARTS   AGE
pod/default-http-backend-5d5ff5d4f5-6ttvd     1/1     Running   1          29m
pod/kafka-broker-64445d8596-88rl6             1/1     Running   24         98m
pod/kafka-zk-77bdb5bcbb-qjxfh                 1/1     Running   4          98m
pod/mysql-bdd598966-nknwk                     0/1     Pending   0          87m
pod/nginx-ingress-microk8s-controller-dh28n   1/1     Running   1          29m


NAME                           TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/default-http-backend   ClusterIP      10.152.183.57    <none>        80/TCP                       29m
service/kafka                  ClusterIP      10.152.183.194   <none>        9092/TCP                     98m
service/kafka-zk               ClusterIP      10.152.183.80    <none>        2181/TCP,2888/TCP,3888/TCP   98m
service/kubernetes             ClusterIP      10.152.183.1     <none>        443/TCP                      100m
service/mysql                  ClusterIP      10.152.183.113   <none>        3306/TCP                     87m
service/scdf-server            LoadBalancer   10.152.183.122   <pending>     80:32548/TCP                 80m
service/skipper                LoadBalancer   10.152.183.163   <pending>     80:30955/TCP                 81m

NAME                                               DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/nginx-ingress-microk8s-controller   1         1         1       1            1           <none>          29m

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/default-http-backend   1/1     1            1           29m
deployment.apps/kafka-broker           1/1     1            1           98m
deployment.apps/kafka-zk               1/1     1            1           98m
deployment.apps/mysql                  0/1     1            0           87m
deployment.apps/scdf-server            0/1     0            0           80m
deployment.apps/skipper                0/1     0            0           82m

NAME                                              DESIRED   CURRENT   READY   AGE
replicaset.apps/default-http-backend-5d5ff5d4f5   1         1         1       29m
replicaset.apps/kafka-broker-64445d8596           1         1         1       98m
replicaset.apps/kafka-zk-77bdb5bcbb               1         1         1       98m
replicaset.apps/mysql-bdd598966                   1         1         0       87m
replicaset.apps/scdf-server-6988d7795f            1         0         0       80m
replicaset.apps/skipper-5957946bf5                1         0         0       82m

Как видите, для внешних IP-адресов есть два состояния <Pending>. Я считаю, что они должны быть открыты, чтобы иметь возможность подключиться.

Я сделал то, что нашел в этой справке, но Я не мог понять, что сервер получает внешний IP.

Что я здесь делаю не так? Может ли Microk8s выставить свои контейнеры?


person AndrasCsanyi    schedule 16.08.2019    source источник


Ответы (1)


Вы правы, если вы хотите подключиться к своему кластеру извне, вы должны выставить сервис как LoadBalancer или NodePort.

К сожалению, поскольку вы не используете какого-либо облачного провайдера, который поддерживает LoadBalancer (например, AWS или GCP, который предоставляет внешние IP-адреса), вы не сможете предоставить сервис как LoadBalancer (сервис завис в состоянии Pending). Как описано здесь:

LoadBalancer: предоставляет доступ к Сервису извне с помощью балансировщика нагрузки облачного провайдера. Службы NodePort и ClusterIP, к которым направляется внешний балансировщик нагрузки, создаются автоматически.

По умолчанию в Microk8s вы можете использовать только такие сервисы, как NodePort и ClusterIP.

В вашей настройке вы можете использовать NodePort, ClusterIP с Ingress или MetalLB. Если вы будете использовать Ingress, не забудьте включить дополнения ingress и dns в Microk8s. Это можно сделать с помощью $ microk8s.enable dns ingress.

Суммируя. У вас есть следующие варианты:

  1. Используйте NodePort
  2. Используйте Ingress Controller.
  3. Установите Endpoints в YAML или используйте MetalLB и укажите Конечные точки.

Кроме того, вы можете проверить аналогичный случай здесь и здесь.

Надеюсь, это поможет.

person PjoterS    schedule 19.08.2019