推介会

推介会

推介会

在开发 Elixir Umbrella 应用程序(管理多个应用程序的通用应用程序)时,我在主应用程序中包含了两个 Web 应用程序,每个应用程序都有自己的 URL 和端口(admin.example.com:8081 &&www.example.com:8080)。

我最近将应用程序部署到了 Google Kubernetes Engine 上,按照本教程。尽管我时不时会遇到一些问题,但我还是设法完成了它,并且让一个网站可以在线访问(无法访问另一个)。

配置

这是生产 Dockerfile

FROM elixir:alpine

ARG app_name=prod
ARG phoenix_subdir=.
ARG build_env=prod

ENV MIX_ENV=${build_env} TERM=xterm
WORKDIR /opt/app
RUN apk update --no-cache \
  && apk upgrade --no-cache \
  && apk add --update --no-cache nodejs npm make build-base openssl ncurses-libs libgcc libstdc++ \
  && mix local.rebar --force \
  && mix local.hex --force
COPY . .

RUN mix do deps.get, compile
RUN cd apps/admin/assets \
  && npm rebuild node-sass \
  && npm install \
  && ./node_modules/webpack/bin/webpack.js \
  && cd .. \
  && mix phx.digest

RUN cd apps/app/assets \
  && npm rebuild node-sass \
  && npm install \
  && ./node_modules/webpack/bin/webpack.js \
  && cd .. \
  && mix phx.digest
RUN mix release ${app_name} \
  && mv _build/${build_env}/rel/${app_name} /opt/release \
  && mv /opt/release/bin/${app_name} /opt/release/bin/start_server


FROM alpine:latest

ARG hello

RUN apk update --no-cache \
  && apk upgrade --no-cache \
  && apk --no-cache --update add ca-certificates openssl-dev bash openssl libc6-compat libgcc libstdc++ ncurses-libs \
  && apk add --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 add --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=true
EXPOSE ${PORT}
EXPOSE 8081
WORKDIR /opt/app
COPY --from=0 /opt/release .
CMD (/usr/local/bin/cloud_sql_proxy \
  -projects=${GCLOUD_PROJECT_ID} -dir=/tmp/cloudsql &); \
  exec /opt/app/bin/start_server start

以及cloudbuild.yamlGKE 用于构建 pod。

steps:
  name: "gcr.io/cloud-builders/docker"
  args: ["build", "-t", "gcr.io/next-borders-v1/prod:$_TAG",
       "--build-arg", "project_id=next-borders-v1", ".",
       "--file=./prod.Dockerfile"]
images: ["gcr.io/next-borders-v1/prod:$_TAG"]

有了这两个文件,我按照这组命令来公开端口 8080(Web 应用程序),它起作用了:

gcloud builds submit --substitutions=_TAG=v0.2 .
kubectl run hello-web --image=gcr.io/${PROJECT_ID}/hello:v1 --port 8080
kubectl expose pod hello-web --type=LoadBalancer --port=80 --target-port=8080

但我无法访问管理应用程序。因此,我尝试公开多个目标端口:

# Remove the actual service so it doesn't create an error saying it already exists
kubectl delete svc hello-web
kubectl expose pod hello-web --type=LoadBalancer --port=80,8080,8081 --target-port=8080,8081

并出现错误。

然后我回去尝试公开多个端口,并将目标端口更改为管理网站 (8081),虽然它仍然只是一个网站,但确实发挥了作用。

kubectl expose pod hello-web --type=LoadBalancer --port=80,8080,8081 --target-port=8081

我还在 DNS 配置中添加了 IP,这样我就可以尝试通过指定的 URL 访问应用程序(它们包括一个可以通过 URL 请求进行过滤的服务器)。

问题

因此,作为初学者,我有几个问题:GKE pod 可以在一个应用程序中处理多个端口吗?如果可以,我可以通过 cli 来做吗?怎么做?还是我必须使用配置文件?如果不是,最好的方法是什么?两个 pod,一个用于应用程序,另一个用于管理网站?

观察

实际上有一个类似主题但它没有提到 GKE 命令行界面,我遵循的教程没有解释文件的配置及其用法。配置文件是否是解决方案,到目前为止,我还没有关于如何编写或使用它的线索。

我查阅了相关文献试图找到答案

编辑

  • 2021/08/15
    • 在配置部分添加多个目标端口尝试
    • 在配置部分中添加与 kubectl 公开请求关联的端口/网站

相关内容