Как выставить два приложения / службы через уникальные порты с помощью k3d?
* Перекрестная публикация из обсуждения k3d на GitHub: https://github.com/rancher/k3d/discussions/690
Я пытаюсь открыть две службы через два порта. В качестве альтернативы мне также хотелось бы знать, как выставлять их через один и тот же порт и использовать разные маршруты. Я пробовал несколько статей и много конфигураций. Дайте мне знать, где я ошибаюсь с сетью k3d + k3s / kubernetes + traefik (+ klipper?) ...
Я разместил пример:
Цель:
- Достигните "app-1" на хосте через порт 8080
- Достигните "приложение-2" на хосте через порт 8091
Шаги
* См .:https://github.com/ericis/k3d-networkingфайлы в репо
Настроить
k3d
кластер и выставить порты приложений для балансировщика нагрузкиports: # map localhost to loadbalancer - port: 8080:80 nodeFilters: - loadbalancer # map localhost to loadbalancer - port: 8091:80 nodeFilters: - loadbalancer
Развертывайте приложения с помощью «deployment.yaml» в Kubernetes и открывайте порты контейнеров.
ports: - containerPort: 80
Раскрывайте сервисы в кубернетах. Здесь я попробовал два метода.
Использование CLI
$ kubectl create service clusterip app-1 --tcp=8080:80 $ kubectl create service clusterip app-2 --tcp=8091:80
Использование "service.yaml"
spec: ports: - protocol: TCP # expose internally port: 8080 # map to app targetPort: 80 selector: run: app-1
Предоставьте доступ к сервисам за пределами кубернетов с помощью ingress.yaml.
backend: service: name: app-1 port: # expose from kubernetes number: 8080
2 ответа
Вам либо нужно использовать вход, либо открывать порты на каждом отдельном узле (k3d работает на докере, поэтому вам нужно открыть порты докера)
Без открытия порта во время создания кластера k3d служба nodeport не предоставит доступ к вашему приложению.
k3d cluster create mycluster -p 8080:30080@agent[0]
Например, это откроет «внешний» порт (на вашем локальном хосте) 8080 и сопоставит его с 30080 на узле - тогда вы можете использовать службу NodePort для фактического подключения трафика с этого порта к вашему приложению:
apiVersion: v1
kind: Service
metadata:
name: some-service
spec:
ports:
- protocol: TCP
port: 80
targetPort: some-port
nodePort: 30080
selector:
app: pgadmin
type: NodePort
Вы также можете открывать порты на серверном узле, например:
k3d cluster create mycluster -p 8080:30080@server[0]
Ваши приложения могут быть запланированы для запуска на любом узле, и если вы заставите модуль появиться на определенном узле (допустим, вы открываете определенный порт на агенте [0] и настраиваете свои файлы .yaml для работы с этим определенным портом) , по какой-то причине класс хранения ранчо локального пути просто ломается и не создает постоянный том для вашего требования. Вам вроде как должно повезти, и ваша капсула будет расписана там, где вам нужно. (если вы найдете способ планировать поды на определенных узлах без нарушения работы провайдера хранилища, дайте мне знать)
Вы также можете сопоставить целый ряд портов, например:
k3d cluster create mycluster --servers 1 --agents 1 -p "30000-30100:30000-30100@server[0]"
но будьте осторожны с количеством портов, которые вы открываете, если вы откроете слишком много, k3d выйдет из строя.
Использование балансировщика нагрузки - аналогично, вам просто нужно открыть один порт и сопоставить его с балансировщиком нагрузки.
k3d cluster create my-cluster --port 8080:80@loadbalancer
Затем вам нужно использовать вход, (иначе трафик не достигнет)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: hello
port:
number: 80
Я также думаю, что входящий трафик будет маршрутизировать только трафик http и https, https должен выполняться на порту, предположительно вы можете сопоставить оба порта
80
и порт
443
, но мне не удалось заставить это работать (я думаю, что сертификаты также должны быть настроены).
У меня это работает просто идеально.
3 быстрых шага и все готово!
k3d cluster create mycluster --registry-use registry --servers 1 --agents 1 --port '3000:3000@loadbalancer' --port '8080:80@loadbalancer' --port '9443:433@loadbalancer' --port '8082:8082@loadbalancer' --port '8081:80@loadbalancer'
kubectl create service clsuterip.....targetPort
kubectl expose deploy my-app-deployment --name=my-app-deployment-lb --type=LoadBalancer
предыстория/объяснение
у меня тоже все работало хорошо, а потом, я думаю, с изменениями версий... оно просто остановилось, но настройка аналогична, только одна волшебная команда в конце концов все исправила.
На моем Ubuntu (VPS - nginx): который просто обрабатывает 80:433 (нормально), я просто прокси (ssl wss что угодно)
https://dev.domain.com:443 -> http://127.0.0.1:3000 или http://localhost:3000 любой: порт в кластере, на который я хочу указать, поэтому я запускаю:
k3d cluster create mycluster --registry-use registry --servers 1 --agents 1 --port '3000:3000@loadbalancer' --port '8080:80@loadbalancer' --port '9443:433@loadbalancer' --port '8082:8082@loadbalancer' --port '8081:80@loadbalancer'
Приведенная выше команда устанавливает для меня типичный кластер с именем myclsuter. Важная часть — 8080:80@loadbalancer (строчные буквы).
поэтому после установки он ВСЕ ЕЩЕ НЕ БУДЕТ работать, все, что мы делали до сих пор, сообщало работающему кластеру k3d, что там «может быть» или «ожидается» балансировщик нагрузки kubenetes, ожидающий внутри. а с помощью k3d вы также можете выполнять команды настройки, указывающие на @agent @server и все такое... но мне это бесполезно.
Итак, здесь я указываю от 3000 до 3000, от 8080 до 80 и от 9443 до 433 и так далее (внутри кластера).
теперь... создайте ClusterIp svc для развертывания...
kubectl create service clsuterip.....targetPort
kubectl expose deploy my-app-deployment --name=my-app-deployment-lb --type=LoadBalancer
вот и все ! Ваше развертывание Kubernetes доступно хостингу через любой порт, который он использует.