docker - 带有 Docker 的 nodejs 中的本地 kubernetes Hello World
问题描述
我一直在关注教程视频并试图了解如何构建一个小型简约应用程序。我关注的视频是从注册表中提取容器,而我目前正在尝试在本地测试、构建和部署所有内容,如果可能的话。这是我的设置。
我在 mac OS 上安装了最新的 docker,并启用了 Kubernetes。
使用 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 文件是否正确,所以问题是我接下来要做什么?
解决方案
遗憾的是,您提供的片段不足,但您拥有基础知识。
我为你准备了一个谷歌教程,但不幸的是,没有什么明显的跳出来。这并不意味着没有,只是我没有找到它。
您的想法是正确的,并且需要了解很多技术水平,但是,我赞扬您的方法,并认为我们可以帮助您实现目标。
- 让我们从 helloworld Node.JS 教程开始
https://nodejs.org/en/docs/guides/getting-started-guide/
- 然后你想容器化这个
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
这里有一个隐含的
- 然后,您需要一个 Kubernetes 集群,您可以在其中部署您的应用程序
- 我觉得microk8s很棒
- 我是前 Google 员工,但Kubernetes Engine是基准(需要 $$$)
- DigitalOcean 的忠实粉丝,它也有Kubernetes(还有 $$$)
我的建议是(除了 microk8s 和 minikube)永远不要运行你自己的 Kubernetes 集群;把它留给云提供商。
- 现在你已经有了所有的部分,我建议你:
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 配置中。
推荐阅读
- oh-my-zsh - 为什么我的 .zshrc 文件颜色突然与其他文件不同?
- python - 在已经有 2.7 的 linux 服务器中安装 python 3.9,没有任何副作用
- python - 如何使用 django 将图像作为 BLOB 直接保存到 MySQL 数据库中?这些图片是通过 django 管理面板动态上传的?
- flutter - 白屏问题flutter web
- android - 托管 Google Play 中的 AppUpdateManager?
- reactjs - React Material UI 组件。函数还是类?
- c++ - 如何缩短此代码以避免冗余?
- sql - 查询返回日期行之间的日期范围
- css - 输入字段对齐
- c - 是否可以使用 for 循环编写“else if”N 次?