首页 > 解决方案 > 带有 Docker 的 nodejs 中的本地 kubernetes Hello World

问题描述

我一直在关注教程视频并试图了解如何构建一个小型简约应用程序。我关注的视频是从注册表中提取容器,而我目前正在尝试在本地测试、构建和部署所有内容,如果可能的话。这是我的设置。

  1. 我在 mac OS 上安装了最新的 docker,并启用了 Kubernetes。

  2. 使用 Docker 和 Docker Compose 运行的 helloworld NodeJS 应用程序

TODO:我希望能够启动我的实例,比如说 kubernetes 集群中的 3


Dockerfile

FROM node:alpine

COPY package.json package.json
RUN npm install

COPY . .
CMD ["npm", "start"]

码头工人-compose.yml

version: '3'

services:
    user:
      container_name: users
      build:
        context: ./user
        dockerfile: Dockerfile

在本教程的帮助下创建部署文件,它可能会出现问题,因为我正在合并来自 youtube 和 Web 链接的信息。

创建一个简约的 yml 文件以便能够启动和运行,稍后将研究其他方面,例如就绪性和活性。


apiVersion: v1
kind: Service
metadata:
  name: user
spec:
  selector:
    app: user
  ports:
    - port: 8080
  type: NodePort

请检查上面的 yml 文件是否正确,所以问题是我接下来要做什么?

标签: dockerkubernetes

解决方案


遗憾的是,您提供的片段不足,但您拥有基础知识。

我为你准备了一个谷歌教程,但不幸的是,没有什么明显的跳出来。这并不意味着没有,只是我没有找到它。

您的想法是正确的,并且需要了解很多技术水平,但是,我赞扬您的方法,并认为我们可以帮助您实现目标。

  1. 让我们从 helloworld Node.JS 教程开始

https://nodejs.org/en/docs/guides/getting-started-guide/

  1. 然后你想容器化这个

https://nodejs.org/de/docs/guides/nodejs-docker-webapp/

对于下面的#3,这里的最后一步是:

docker build --tag=<your username>/node-web-app .

但是,因为您使用的是 Kubernetes,所以您需要将此映像推送到公共存储库。这样一来,无论您的集群在哪里运行,它都可以访问容器映像。

由于该示例使用 DockerHub,让我们继续使用它:

docker push <your username>/node-web-app

注意https://docker.io/<your username>/node-web-app:latest这里有一个隐含的

  1. 然后,您需要一个 Kubernetes 集群,您可以在其中部署您的应用程序

我的建议是(除了 microk8s 和 minikube)永远不要运行你自己的 Kubernetes 集群;把它留给云提供商。

  1. 现在你已经有了所有的部分,我建议你:
kubectl run yourapp \
--image=<your username>/node-web-app:latest \
--port=8080 \
--replicas=1

我相信kubectl run已被弃用,但无论如何都要使用它。它将使用 1 个 Pod(==replica)为您创建一个 Kubernetes 部署(!)。--replicas=2如果您愿意,请随意调整该值(也许)。

创建部署后,您将需要创建一个服务以使您的应用程序可访问(在我的脑海中)此命令是:

kubectl expose deployment/yourapp --type=NodePort

现在您可以查询服务:

kubectl get services/yourapp

NAME    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
yourapp NodePort   10.152.183.27   <none>        80:32261/TCP   7s

注意已分配的 NodePort(在这种情况下!)是:32261,因此我可以使用curl http://localhost:32261(本地主机,因为我使用的是 microk8s)与应用程序交互。

kubectl很强大。确定 NodePort 的另一种方法是:

kubectl get service/yourapp \
--output=jsonpath="{.spec.ports[0].nodePort}"

从 开始的方法的优点kubectl run是,您可以通过以下方式轻松确定重新创建此 Deployment|Service 所需的 Kubernetes 配置:

kubectl get deployment/yourapp \
--format=yaml \
> ./yourapp.deployment.yaml

kubectl get service/yourapp \
--format=yaml \
> ./yourapp.service.yaml

这些命令将询问集群,为您检索配置并将其注入文件。它也将包含一些实例数据,但它的要点向您展示了重新创建部署所需的内容。您将需要编辑此文件。

但是,您可以通过首先删除部署和服务然后从配置中重新创建它来测试这一点:

kubectl delete deployment/yourapp
kubectl delete service/yourapp

kubectl apply --filename=./yourapp.deployment.yaml
kubectl apply --filename=./yourapp.service.yaml

注意:您经常会看到多个资源配置合并到一个 YAML 文件中。这是完全有效的 YAML,但您只会看到 Kubernetes 使用它。格式为:

...
some: yaml
---
...
some: yaml
---

使用它,您可以将yourapp.deployment.yaml和合并yourapp.service.yaml到单个 Kubernetes 配置中。


推荐阅读