【问题标题】:how to deploy the dist folder of npm run build in kubernetes?如何在 kubernetes 中部署 npm run build 的 dist 文件夹?
【发布时间】:2020-01-20 08:00:53
【问题描述】:

我有一个 node.js 应用程序,我正在尝试部署到 Kubernetes。要在我的机器上正常运行它而不使用 Kubernetes,我会运行命令 npm install 和 npm run build,然后提供“dist”文件夹。通常我会使用“npm install -g serve”安装npm的服务,然后运行“serve -s dist”。这工作正常。但是现在部署到Kubernetes进行生产如何创建我的图像?我的意思是docker文件应该如何这个样子?

注意:我不想使用 nginx、apache 或任何类型的 web 服务器。我想使用 node/npm 的服务器来服务 dist 文件夹。请帮助

Dockerfile(我试过的)

FROM node:8

WORKDIR /usr/src/app

COPY /dist

RUN npm install -g serve

serve -s dist


我确定这个 dockerfile 是否正确。所以我需要有关如何正确创建映像以服务 npm run build 的 dist 文件夹的指导。请帮助?

【问题讨论】:

    标签: docker npm kubernetes


    【解决方案1】:

    我认为您可以在全球范围内找到大量关于客户 Web 应用程序在 Kubernetes 集群中的集成以及进一步向服务访问者展示它们的教程。

    实际上,在Docker 环境中容器化的应用程序必须从Dockerfile 移植到特定的Image 或在Docker Compose 工具中构建,以保留所有应用程序的服务依赖关系;当镜像准备好后,它可以存储在公共DockerHub或隔离Private registry中,因此Kubernetes容器runtime然后拉取这个镜像并根据声明的资源在集群内创建适当的工作负载(Pods)@ 987654329@.

    我会推荐以下场景:

    从您最初的 Dockerfile 构建 docker 映像(我做了一些更正):

    FROM node:8
    
    WORKDIR /usr/src/app
    
    COPY dist/ ./dist/
    
    RUN npm install -g serve
    

    $ sudo docker image build <PATH>

    创建与源图片相关的tag

    $ sudo docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

    将图像导出到 DockerHub 或一些私有注册表:

    $ sudo docker push [OPTIONS] NAME[:TAG]

    创建相关的Kubernetes工作负载(Pod)并应用到Kubernetes集群中,在容器内启动Node服务器,监听5000端口:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nodetest
      labels:
        node: test
    spec:
      containers:
      - name: node-test
        image: TARGET_IMAGE[:TAG]
        ports:
        - containerPort: 5000
        command: [ "/bin/bash", "-ce", "serve -s dist" ]
    

    如果您考虑将应用程序暴露给外部集群客户端,请查看NodePort 服务:

    $ kubectl expose po nodetest --port=5000 --target-port=5000 --type=NodePort

    Update_1:

    然后,应用程序服务可能会在某个特定端口内访问主机,您可以简单地检索此端口值:

    kubectl get svc nodetest -o jsonpath='{.spec.ports[0].nodePort}'

    Update_2:

    为了在某个所需端口上公开NodePort 服务,只需应用以下清单,接近 30000 端口分配:

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        node: test
      name: nodetest
    spec:
      ports:
      - nodePort: 30000
        port: 5000
        protocol: TCP
        targetPort: 5000
      selector:
        node: test
      type: NodePort
    

    【讨论】:

    • 嗨我试过你说的,但我在206.189.22.155:5000得到连接被拒绝
    • 确实,当你应用NodePort服务类型时,k8s会从一个范围(默认值:30000-32767)中分配一些端口来代理主机上的目标服务5000端口,看更新我的答案中的部分。
    • 好的,如何将它暴露给特定的节点端口值,例如 30000?
    • 最后一个问题...可以使用部署代替 pod 吗??
    • 是的,我刚刚解释了有关 Pod 的基本内容,但是一旦您决定控制 Pod 副本和所有其他风格,您可以转到一些高级资源,例如 deployment
    猜你喜欢
    • 2020-04-23
    • 2022-08-17
    • 2020-04-23
    • 2020-07-15
    • 2015-04-09
    • 2023-04-03
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多