一、说在前面的话
有了docker镜像,要把一个项目部署到K8S里,主要就是编写deployment.yaml。
你需要考虑的是:
- 环境变量
- 服务的健康检测
- 持久化
- 启动命令
- 程序使用的数据源
- 程序使用的配置文件
因为本前端项目比较简单,这里只做一个简单示例。
二、deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:annotations:deployment.kubernetes.io/revision: '2'labels:app: chatgpt-next-webname: chatgpt-next-webnamespace: web-service
spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: chatgpt-next-webstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:labels:app: chatgpt-next-webspec:containers:- image: xxx-harbor-registry-vpc.cn-hangzhou.cr.aliyuncs.com/xxx/chatgpt-next:1.0.4imagePullPolicy: Alwaysname: chatgpt-next-webenv:- name: TZvalue: Asia/Shanghai- name: PORTvalue: 5173resources:limits:cpu: 2memory: 2Girequests:cpu: 200mmemory: 1.8GiterminationMessagePath: /dev/termination-logterminationMessagePolicy: FilevolumeMounts:- mountPath: /etc/localtimename: volume-localtimednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30volumes:- hostPath:path: /etc/localtimetype: ''name: volume-localtime
这里定义了环境变量PORT,指定容器监听的端口号,默认是3000。
三、启动命令
你可以在deployment.yaml中指定command,那样的话,会覆盖docker容器本身的CMD。
比如:
containers:- image: xxx-harbor-registry-vpc.cn-hangzhou.cr.aliyuncs.com/xxx/chatgpt-next:1.0.4name: chatgpt-next-webcommand:- node- server.js
因为我们的Dockerfile已定义CMD,所以这里无需定义command。
这里说下,我踩过的一个坑,定义了一个错误的command,导致pod容器没有启动进程。
当时的错误写法见下:
四、总结
至此,开源项目ChatGPT-Next-Web的容器化部署至k8s就梳理完毕了。
作为一个nodejs后端程序,它不同于h5静态页面,类似于java程序,但又没有java复杂。
另外,每个Nodejs程序的Dockerfile可能都不一样,但是java程序就又相对一致了。