本文主要内容是通过dockerfile创建镜像,并通过kubernets(简称k8s)来启动集群服务。最后你会得到一个简单的nodejs提供的api服务。
写在前面
需要安装的有node(如何安装?),kubectl(如何安装?)
一,创建nodejs应用
本文主要是用于实践k8s,所以nodejs项目写的非常简单,除了package*.json之外只有简单的app.js文件
1,首先创建一个app.js文件。代码如下,作用是用nodejs生成两个api,一个get一个post,并监听3000端口提供服务。
点击查看代码
const Koa = require('koa');
const app = new Koa();
const Router = require('koa-router');
const router = new Router();// GET /api/users
router.get('/api/users', async (ctx) => {ctx.body = [{ name: 'Alice' }, { name: 'Bob' }];
});// POST /api/users
router.post('/api/users', async (ctx) => {const user = ctx.request.body;// 处理用户数据...ctx.status = 201;ctx.body = { message: 'User created', user };
});// 使用路由中间件
app.use(router.routes());
app.use(router.allowedMethods());app.listen(3000);
如果是在本地,你可以使用node app.js
轻松启动,但可能报错,提示koa和koa-router未安装,这个时候你需要npm install koa
和npm install koa-router
,然后你就有了package.json
和package-lock.json
两个文件了。重新执行node后,在浏览器访问localhost:300/api/users
即可访问得到数据返回。
以下为package.json代码供参考:
点击查看代码
{"name": "my-koa-api","version": "1.0.0","description": "A simple Koa API","private": true,"main": "app.js","scripts": {"start": "node app.js"},"dependencies": {"koa": "^2.15.3","koa-router": "^12.0.1"}
}
二,创建dockerfile
拥有了建议的nodejs项目之后,我们来创建dockerfile。
首先,在你的项目根目录下创建名为Dockerfile
的文件,并复制以下代码(代码中有注释)
点击查看代码
# 1. 选择 Node.js 官方镜像作为基础镜像
FROM node:20.15.0# 2. 设置工作目录为 /app
WORKDIR /app# 3. 将 package.json 和 package-lock.json 复制到工作目录
COPY package*.json ./# 4. 安装项目依赖
RUN npm install# 5. 将当前目录下的所有文件复制到工作目录
COPY . .# 6. 暴露 API 服务运行的端口,默认 Koa 监听 3000 端口
EXPOSE 3000# 7. 定义环境变量(如果有需要)
# ENV NODE_ENV production# 8. 定义启动命令,启动 Koa 应用
CMD ["npm", "start"]
它的配置思路为:首先安装node的20.15.0版本为基础镜像,然后设置工作目录为app(等容器启动之后进入可查看当前目录),复制package*.json就是两个json文件,随后npm install安装,接着复制当前目录下的所有文件到工作目录,随后暴露3000端口,最后启动node。
镜像构建
docker build -t my-koa-api .
创建一个名为my-koa-api的镜像
镜像打标
docker tag my-koa-api xyb1205/my-koa-api:latest
其中my-koa-api是本地镜像的名称,xyb1205是docker hub上的用户名,my-koa-api:latest是新创建的标签
镜像推送
docker push xyb1205/my-koa-api:latest
至此,hub上就有名为xyb120/my-koa-api的镜像了
三,配置k8s,创建集群
1,创建my-app-deployment.yaml配置文件
点击查看代码
apiVersion: apps/v1
kind: Deployment
metadata:name: my-app
spec:replicas: 3selector:matchLabels:app: my-apptemplate:metadata:labels:app: my-appspec:containers:- name: my-appimage: xyb1205/my-koa-api:latestports:- containerPort: 3000
2,创建my-app-service.yaml文件
service有好几种类型,最常见的有ClusterIP,Nodeport,LoadBalancer,service默认类型为ClusterIP,ClusterIP和Nodeport一般都是提供集群内部使用的,LoadBalancer可以供集群外部使用。
点击查看代码
apiVersion: v1
kind: Service
metadata:name: my-app-service
spec:type: LoadBalancer # 设置 Service 类型为 LoadBalancerselector:app: my-app # 选择器,用于匹配 Pod 的标签ports:- name: http # 端口名称protocol: TCP # 协议类型port: 80 # Service 端口,集群外部访问使用此端口targetPort: 3000 # Pod 的目标端口
使用以下命令配置kubernets
kubectl apply -f my-app-deployment.yaml
kubectl apply -f my-app-service.yaml
注意,如何启动kubernets呢?你需要在你的docker desktop应用中打开设置,并开启kubernets服务
四,访问
查看kubectl get services
即可看到kubernets的服务
通过 http://<EXTERNAL-IP>:<Port>即可访问服务
(由于本nodejs项目的api路径已配置,所以你可以这样访问测试 http://<EXTERNAL-IP>:80/api/users)
代表成功访问
五;踩过的坑
1,Nodeport并不能生成EXTRAL_IP,EXTRAL_IP才能被集群外部访问。(EXTRAL_IP的可访问范围,还需要研究)
2,nginx反向代理还需要加进来
3,集群内部访问ip,可以通过节点内命令,或者容器端口映射,来访问。(后续有时间再详细出一个)
4,集群>节点>pod>容器。pod是容器的承载
5,在讨论 Kubernetes 集群、云计算环境或网络安全时,"防火墙策略"、"网络策略"和"网络安全组" 是三个关键概念,它们共同构成了网络环境的安全和访问控制机制
6,kubernets有负载均衡,但是也有局限性。
六,常用命令总结
其实命令都是为需求服务的
- kubectl get services // 获取所有服务
- kubectl get pods // 获取所有pods
- kubectl get nodes //获取所有节点
- kubectl describe service <service-name> // 查看service-name服务的详细信息