Как настроить проброс портов в 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 есть внутренняя сеть, позволяющая делать то, что я хочу. Например, если я запускаю
Конечно, я мог бы делать все, что хочу, запустив переадресацию портов в сеансе 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