Рейтинг:0

Как иметь приложение с несколькими портами в одном модуле GKE (используя cli)?

флаг in

Презентация

Работая над приложением Elixir Umbrella (обычное приложение, управляющее несколькими приложениями), я включил два веб-приложения в основное, каждое со своим собственным URL-адресом и портом (admin.example.com:8081 && www.example.com:8080).

Недавно я развернул приложение на Google Kubernetes Engine, следуя этому руководству. Хотя время от времени у меня возникали некоторые проблемы, мне удалось завершить его, и один веб-сайт был доступен в Интернете (не могу получить доступ к другому).

Конфигурация

Вот производственный Dockerfile

ИЗ эликсира:альпийский

имя_приложения ARG = продукт
ARG phoenix_subdir=.
ARG build_env = продукт

ENV MIX_ENV=${build_env} TERM=xterm
РАБОЧИЙ КАТАЛОГ /opt/приложение
ЗАПУСТИТЬ обновление apk --no-cache \
  && обновление apk --no-cache \
  && apk add --update --no-cache nodejs npm make build-base openssl ncurses-libs libgcc libstdc++ \
  && смешать local.rebar --force \
  && смешать local.hex --force
КОПИРОВАТЬ . .

RUN mix сделать deps.get, скомпилировать
ЗАПУСК cd apps/admin/assets\
  && npm перестроить узел-sass \
  && нпм установить \
  && ./node_modules/webpack/bin/webpack.js \
  && CD .. \
  && смешать phx.digest

ЗАПУСК cd apps/app/assets \
  && npm перестроить узел-sass \
  && нпм установить \
  && ./node_modules/webpack/bin/webpack.js \
  && CD .. \
  && смешать phx.digest
ВЫПОЛНИТЬ выпуск микса ${app_name} \
  && mv _build/${build_env}/rel/${app_name} /opt/release \
  && mv /opt/release/bin/${app_name} /opt/release/bin/start_server


ОТ альпийского: последний

Арг привет

ЗАПУСТИТЬ обновление apk --no-cache \
  && обновление apk --no-cache \
  && apk --no-cache --update добавить ca-сертификаты openssl-dev bash openssl libc6-compat libgcc libstdc++ ncurses-libs \
  && apk добавить --no-cache --virtual .erlang-build gcc g++ libc-dev \
  && mkdir -p /usr/local/bin \
  && wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 \
  -O /usr/local/bin/cloud_sql_proxy \
  # && wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub \
  # && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.33-r0/glibc-2.33-r0.apk \
  # && apk добавить --no-cache glibc-2.33-r0.apk \
  && chmod +x /usr/local/bin/cloud_sql_proxy \
  && mkdir -p /tmp/cloudsql
ENV GCLOUD_PROJECT_ID=${project_id} \
  REPLACE_OS_VARS=истина
РАЗОБЛАЧИТЬ ${ПОРТ}
ВЫСТАВИТЬ 8081
РАБОЧИЙ КАТАЛОГ /opt/приложение
КОПИРОВАТЬ --from=0 /opt/release .
CMD (/usr/local/bin/cloud_sql_proxy \
  -projects=${GCLOUD_PROJECT_ID} -dir=/tmp/cloudsql &); \
  exec /opt/app/bin/start_server запуск

так же хорошо как облачная сборка.yaml используется GKE для создания модуля.

шаги:
  имя: "gcr.io/cloud-builders/docker"
  аргументы: ["сборка", "-t", "gcr.io/next-borders-v1/prod:$_TAG",
       "--build-arg", "project_id=next-borders-v1", ".",
       "--file=./prod.Dockerfile"]
изображения: ["gcr.io/next-borders-v1/prod:$_TAG"]

Имея в руках эти два файла, я следую этому набору команд, чтобы открыть порт 8080 (веб-приложение), который работал:

gcloud builds submit --substitutions=_TAG=v0.2 .
kubectl запустить hello-web --image=gcr.io/${PROJECT_ID}/hello:v1 --port 8080
kubectl предоставляет модуль hello-web --type=LoadBalancer --port=80 --target-port=8080

Но я не мог получить доступ к приложению администратора. Итак, я попытался открыть несколько целевых портов:

# Удалите фактическую службу, чтобы она не создавала ошибку о том, что она уже существует
kubectl удалить svc hello-web
kubectl выставить pod hello-web --type=LoadBalancer --port=80,8080,8081 --target-port=8080,8081

И получил ошибку.

Затем я вернулся, чтобы попытаться открыть несколько портов и изменить целевой порт на сайт администратора (8081), который работал, хотя это был всего лишь один веб-сайт.

kubectl предоставляет модуль hello-web --type=LoadBalancer --port=80,8080,8081 --target-port=8081

Я также добавил IP-адрес в конфигурацию DNS, чтобы попытаться получить доступ к приложениям через назначенный им URL-адрес (они включают сервер, который может фильтровать запрос URL-адреса).

Вопросы

Итак, вот мои несколько вопросов как новичка: Может ли модуль GKE обрабатывать несколько портов в одном приложении? Если да, то можно ли это сделать через кли и как? Или мне нужно использовать файл конфигурации? Если нет, то как лучше? Два модуля, один для приложения, а другой для веб-сайта администратора?

Наблюдение

На самом деле есть похожая тема, но в нем не говорится об интерфейсе командной строки GKE, а в руководстве, которому я следовал, не объясняется ни конфигурация файла, ни его использование. Будет ли файл конфигурации решением, я пока понятия не имею, как его написать или использовать.

Документация, которую я просмотрел, чтобы попытаться найти ответ

Редактировать

  • 2021/08/15
    • Добавьте попытку с несколькими целевыми портами в разделе «Конфигурация».
    • Добавьте порт/веб-сайт, связанный с запросом на раскрытие kubectl, в разделе «Конфигурация».
флаг jp
Да, модули могут отображать несколько модулей. Из вашего описания трудно сказать, какой порт вам не хватает. При этом чаще всего работают с декларативными манифестами, а не с императивными командами cli.
Aridjar avatar
флаг in
Спасибо за ваш ответ @Jonas. Отсутствующий порт является целевым портом (либо 8080 (веб-приложение), либо 8081 (веб-сайт администратора)). Я отредактировал вопрос, включив в него точность целевого порта, а также команду с несколькими целевыми портами, которую я пробовал, но это не сработало.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.