【发布时间】:2020-01-06 02:46:38
【问题描述】:
我正在尝试在 minikube 中创建一个带有 NodejS Express 服务器的 Kubernetes 节点。
基本应用程序在裸机(Linux Ubuntu、Windows 等)上运行没有任何问题。但是在 Kubernetes 我有很多问题 我有很多路由,服务器部署失败。如果我用 for 减少路线的数量,比如说 50%,应用程序运行良好。我注释掉的路线没有任何区别。
部署文件(server-cluster-ip-service.yaml):
apiVersion: v1
kind: Service
metadata:
name: server-cluster-ip-service
spec:
type: ClusterIP
selector:
component: server
ports:
- port: 8093
targetPort: 8093
部署文件(server-deployment.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
name: server-deployment
spec:
replicas: 1
selector:
matchLabels:
component: server
template:
metadata:
labels:
component: server
spec:
containers:
- name: server
image: jabro888/salesactas4002server:1.0.1
ports:
- containerPort: 8093
server.ts 文件:
export const app: Application = express();
app.listen(8093), () => {
initApi(app).then(() => {
apiRoutes(app);
}).catch((error) => {
console.log(" what the f?ck is going wrong: " + error);
});
console.log('HTTP Server running at http://' + '192.168.99.100' + ': on port: ' + '8093');
});
api.ts 文件:
const options:cors.CorsOptions = {
allowedHeaders : config.get('server.cors.allowedHeaders'),
credentials: config.get('server.cors.credentials'),
methods: config.get('server.cors.methods'),
origin: config.get('server.cors.origin'),
preflightContinue: config.get('server.cors.preflightContinue')
};
export async function initApi(app) {
console.log('voor initialiseren');
//await apiInitialiseer();
console.log('na initialiseren');
app.use(bodyParser.json());
app.use(cors(options));
app.use(cookieParser());
app.set('strict routing', true);
app.enable('strict routing');
console.log('stap1');
}
apiRoute.ts 文件: (当我删除或注释掉从 step6 到 step9 的路由时,应用程序在 kubernetes minikube 中运行正常。)
export function apiRoutes(app) {
//app.route('/api/test').get(apiGetRequestByMedewerkerAfterTime);
app.route('/api/salesactas400/cookie').get(apiGetAllCookies);
app.route('/api/salesactas400/aut/v').put(apiVerlengSession);
app.route('/api/salesactas400/aut/s').put(apiStopSession);
console.log('step2');
app.route('/api/salesactas400/medewerker/login-afdeling').get(apiGetMedewerkerAfdelingByLogin);
app.route('/api/salesactas400/medewerker/Login').get(apiGetMedewerkerByLogin);
app.route('/api/salesactas400/medewerker/login').put(apiGetMedewerkerVestigingByLoginLogin); //+gebruikt inloggen PUt vanwege de cookie
console.log('step3');
app.route('/api/salesactas400/medewerker').get(apiGetAllMedewerkersWithAfdelingLocatie);
app.route('/api/salesactas400/medewerker/:id').get(apiGetMedewerkerByID);
app.route('/api/salesactas400/medewerker/:id').put(apiUpdateMedewerkerByID);
app.route('/api/salesactas400/medewerker').post(apiAddMedewerker);
app.route('/api/salesactas400/medewerker/:id').delete(apiDeleteMedewerkerByID);
console.log('step4');
app.route('/api/salesactas400/locatie').get(apiGetAllLocaties);
app.route('/api/salesactas400/locatie/:id').get(apiGetLocatieByID);
app.route('/api/salesactas400/locatie/:id').put(apiUpdateLocatieByID);
app.route('/api/salesactas400/locatie').post(apiAddLocatie);
app.route('/api/salesactas400/locatie/:id').delete(apiDeleteLocatieByID);
console.log('step5');
app.route('/api/salesactas400/afdeling').get(apiGetAllAfdelings);
app.route('/api/salesactas400/afdeling/:id').get(apiGetAfdelingByID);
app.route('/api/salesactas400/afdeling/:id').put(apiUpdateAfdelingByID);
app.route('/api/salesactas400/afdeling').post(apiAddAfdeling);
app.route('/api/salesactas400/afdeling/:id').delete(apiDeleteAfdelingByID);
console.log('step6');
app.route('/api/salesactas400/activiteit').get(apiGetAllActiviteitenWithAfdeling);
app.route('/api/salesactas400/activiteit/afdeling/:afdelingId').get(apiGetActiviteitenByAfdelingId);
app.route('/api/salesactas400/activiteit/:id').get(apiGetActiviteitByID);
app.route('/api/salesactas400/activiteit/:id').put(apiUpdateActiviteitByID);
app.route('/api/salesactas400/activiteit').post(apiAddActiviteit);
app.route('/api/salesactas400/activiteit/:id').delete(apiDeleteActiviteitByID);
console.log('step13');
console.log('step7');
app.route('/api/salesactas400/registratiefilter').put(apiGetAllRegistratiesFiltered);
app.route('/api/salesactas400/registratie').get(apiGetAllRegistraties);
app.route('/api/salesactas400/registratie/:id').get(apiGetRegistratieByMedewerkerID);
app.route('/api/salesactas400/registratie/:id').put(apiUpdateRegistratieByID);
app.route('/api/salesactas400/registratie/:id').delete(apiDeleteRegistratieByID);
app.route('/api/salesactas400/registratie').post(apiAddRegistratie);
console.log('step8');
app.route('/api/salesactas400/export').post(apiAddExport);
console.log('step9');
}
加载文件后 kubectl 应用 -f 并运行 kubectl 记录 server-deployment-8588f6cfdd-ftqvj 然后我得到这个回应:
> salesactas400@0.8.0 start /server
> ts-node ./server.ts
这是错误的,似乎应用程序崩溃了我没有看到 console.log 消息。
在 kubectl get pods 之后,我得到了这个:
NAME READY STATUS RESTARTS AGE
postgres-deployment-7d9788bdfd-pf6hf 1/1 Running 0 101s
server-deployment-8588f6cfdd-ftqvj 0/1 Completed 2 67s
由于某种原因容器完成了???
当我删除从 step6 到 step9 的路线时,我会看到:
> salesactas400@0.8.0 start /server
> ts-node ./server.ts
voor initialiseren
na initialiseren
stap1
HTTP Server running at http://192.168.99.100: on port: 8093
stap2
stap3
stap4
stap5
所以这没问题,但是为什么我不能加载所有路由,NodeJS Express 服务器上的 kubernetes 是否有任何限制路由,我的代码中的其他内容可能是错误的?
我跑: minikube 版本 1.6.2,docker 版本 19.03.5 来自 node:alpine 镜像的 NodeJS 版本是 12.14 我还尝试了 NodeJS 版本 10.14 和 11.6
Dockerfile 我用于创建容器 jabro888/salesactas4002server:1.0.1
FROM node:12.14.0-alpine
WORKDIR "/server"
COPY ./package.json ./
RUN apk add --no-cache --virtual .gyp \
python \
make \
g++ \
unixodbc \
unixodbc-dev \
&& npm install \
&& apk del .gyp
COPY . .
#ENV NODE_ENV=production
CMD ["npm", "start"]
我希望有人可以帮助我,我已经准备好 3 天来解决这个问题。
这也可能很有趣,我对此一无所知。一段时间后,吊舱重新启动,并在一段时间后崩溃。 我再次在 Linux 机器上尝试了相同的应用程序,它运行没有任何问题。
bp@bp-HP-Z230-Tower-Workstation:~/Documents/nodejs/salesactas400/server$ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-deployment-7d9788bdfd-mm8mm 1/1 Running 0 76s
server-deployment-8588f6cfdd-qd5n6 0/1 Completed 1 34s
bp@bp-HP-Z230-Tower-Workstation:~/Documents/nodejs/salesactas400/server$ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-deployment-7d9788bdfd-mm8mm 1/1 Running 0 81s
server-deployment-8588f6cfdd-qd5n6 0/1 Completed 1 39s
bp@bp-HP-Z230-Tower-Workstation:~/Documents/nodejs/salesactas400/server$ kubectl get pods
Unable to connect to the server: net/http: TLS handshake timeout
bp@bp-HP-Z230-Tower-Workstation:~/Documents/nodejs/salesactas400/server$ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-deployment-7d9788bdfd-mm8mm 1/1 Running 0 2m17s
server-deployment-8588f6cfdd-qd5n6 0/1 Completed 2 95s
bp@bp-HP-Z230-Tower-Workstation:~/Documents/nodejs/salesactas400/server$ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-deployment-7d9788bdfd-mm8mm 1/1 Running 0 2m21s
server-deployment-8588f6cfdd-qd5n6 0/1 Completed 2 99s
bp@bp-HP-Z230-Tower-Workstation:~/Documents/nodejs/salesactas400/server$ kubectl get pods
NAME READY STATUS RESTARTS AGE
postgres-deployment-7d9788bdfd-mm8mm 1/1 Running 0 2m27s
server-deployment-8588f6cfdd-qd5n6 0/1 CrashLoopBackOff 2 105s
bp@bp-HP-Z230-Tower-Workstation:~/Documents/nodejs/salesactas400/server$
【问题讨论】:
-
我在 Minikube 上使用 virtualBox 6.1 作为管理程序
-
我用的是Kubernetes v1.17,它是最新的稳定版本,所以这个应该是正确的!
-
Completed 表示应用无错误退出。将
DEBUG=express:*环境变量添加到您的容器并查看日志。有什么异常吗? -
我已经添加了 DEBUG=express:* 但容器仍然崩溃并且日志显示为: > salesactas400@0.8.0 start /server > DEBUG=express:* & ./node_modules/ .bin/ts-node ./server.ts
-
所以因为容器在启动时崩溃,所以无法登录容器。
标签: node.js typescript express kubernetes minikube