Как настроить проброс портов в MicroK8S по кластеру (в идеале без манифеста)?

Я изучаю K8S, используя MicroK8S. У меня есть кластер из трех узлов, каждый узел имеет 16 ГБ ОЗУ. Кластер автоматически перешел в режим высокой доступности. Кластер находится в моей домашней локальной сети.

Вот мои узлы:

Настраивать

У меня есть веб-приложение, работающее на модуле в кластере. Он отвечает на порт 9090. Вот как я его запустил.

У меня есть образ на ноутбуке для разработки, который я превращаю в архив:

      docker save k8s-workload > k8s-workload.docker.tar

Затем я отправляю этот архив лидеру кластера:

      scp k8s-workload.docker.tar 192.168.50.251:/home/myuser/

Затем я загружаю это изображение во все узлы кластера:

      root@arran:/home/myuser# microk8s images import < k8s-workload.docker.tar
Pushing OCI images to 192.168.50.251:25000
Pushing OCI images to 192.168.50.135:25000
Pushing OCI images to 192.168.50.74:25000

Затем я проверяю тип MIME и контрольную сумму изображения на каждом узле, поскольку у меня были некоторые проблемы с этим :

      root@arran:/home/myuser# microk8s ctr images list | grep workload
docker.io/library/k8s-workload:latest   application/vnd.docker.distribution.manifest.v2+json    sha256:725b...582b 103.5 MiB linux/amd64

Наконец, я запускаю рабочую нагрузку, гарантируя, что K8S не попытается получить образ (в этом нет необходимости, но политика по умолчанию все равно пытается):

      root@arran:/home/myuser# microk8s kubectl run k8s-workload --image=k8s-workload --image-pull-policy='Never' --port=9090
pod/k8s-workload created

Затем я подтверждаю, что это удалось, из узла-лидера:

      root@arran:/home/myuser# microk8s kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP             NODE       NOMINATED NODE   READINESS GATES
k8s-workload   1/1     Running   0          83m   10.1.134.216   yamazaki   <none>           <none>

Запуск приложения

Чтобы получить доступ к веб-приложению с моего ноутбука для разработки, я сначала открываю приложение только на одном узле. Модуль работает на узле Yamazaki, поэтому сначала я запускаю его с этого узла:

      root@yamazaki:/home/myuser# microk8s kubectl port-forward pod/k8s-workload 9090 --address='0.0.0.0'
Forwarding from 0.0.0.0:9090 -> 9090

Это работает нормально.

Проблема

Я хотел бы получить доступ к приложению, отправив запрос к любому узлу кластера, а не только к этому. В настоящее время приложение работает только на одном узле, и я бы хотел, чтобы оно работало, даже если я сделаю веб-запрос к другому узлу.

Я знаю, что у K8S есть внутренняя сеть, позволяющая делать то, что я хочу. Например, если я запускаюкоманду на Арране (и убить то же самое на Ямазаки), то приложение все равно будет работать, даже если модуль работает только на Ямадзаки. Но я по-прежнему могу получить доступ к приложению только с одного IP (Арран, где работает переадресатор портов).

Конечно, я мог бы делать все, что хочу, запустив переадресацию портов в сеансе SSH на каждом узле. Но я бы хотел запустить что-то, что выживет после завершения всех сеансов SSH.

В идеале я хотел бы сделать это с помощью консольной команды, но мне интересно, понадобится ли мне для этого YAML-манифест. Судя по моим исследованиям, я думаю, что мне нужен ClusterIP.


Обновление/исследование 1

Я читаю страницу руководства K8S по балансировке нагрузки на «голое железо». Часть страницы рекомендовала пользователю применить файл конфигурации из 646 строк , что было бы довольно контрпродуктивно для сценария обучения.

Этот пример кажется более разумным, но здесь неясно, как LB инструктируется для запуска на всех хостах.

Обновление/исследование 2

Я также нашел этот ресурс специально для MicroK8S, который рекомендует дополнение для входа. К сожалению, для этого необходимо, чтобы моя рабочая нагрузка была настроена как Служба, а на данный момент у меня есть только модуль, так что думаю, это исключено.

1 ответ

Давайте использоватьNodePort service, это абстрактный способ представить приложение, работающее на набореPodsкак сетевая служба, он будет маршрутизировать входящий трафик через порт каждогоNodeна вашService.

Мы можем определить это так:

      apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  type: NodePort
  ports:
    - port: 9090
      targetPort: 9090
      nodePort: 30090
  selector:
    run: k8s-workload

Затем мы применяем манифест, и он должен работать.microk8s kubectl apply -f my-service.yaml

Другие вопросы по тегам