Kubernetes NodeJS 打字稿超时?在 minikube 中的快速路线上
Kubernetes NodeJS typescript timeout? on express Routes in minikube
我正在尝试在 minikube 中创建一个 Kubernetes 节点,其中包含一个 NodejS Express 服务器。
基本应用程序 运行 在裸机上没有任何问题(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
部署文件(服务器-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 文件:
(当我删除或注释掉从第 6 步到第 9 步的路由时,应用程序 运行 在 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
由于某种原因容器完成了 ???
当我删除从第 6 步到第 9 步的路由时,我看到了这个:
> 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 天。
这也可能很有趣,我不明白任何....关于这个的事情。一段时间后,pod 重新启动,一段时间后它崩溃了。
我再次在 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 没有提供足够的资源。我在使用 AWS Beanstalk 时遇到了同样的问题,服务器也突然停止了,但在日志中我可以看到原因。他们 运行 内存不足。
所以要解决这个 Minkube 必须像这样使用额外的内存参数启动:
minikube start --memory=4096
我正在尝试在 minikube 中创建一个 Kubernetes 节点,其中包含一个 NodejS Express 服务器。
基本应用程序 运行 在裸机上没有任何问题(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
部署文件(服务器-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 文件: (当我删除或注释掉从第 6 步到第 9 步的路由时,应用程序 运行 在 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
由于某种原因容器完成了 ???
当我删除从第 6 步到第 9 步的路由时,我看到了这个:
> 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 天。
这也可能很有趣,我不明白任何....关于这个的事情。一段时间后,pod 重新启动,一段时间后它崩溃了。 我再次在 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 没有提供足够的资源。我在使用 AWS Beanstalk 时遇到了同样的问题,服务器也突然停止了,但在日志中我可以看到原因。他们 运行 内存不足。 所以要解决这个 Minkube 必须像这样使用额外的内存参数启动:
minikube start --memory=4096