【问题标题】:Kubernetes NodeJS typescript timeout? on express Routes in minikubeKubernetes NodeJS 打字稿超时?在 minikube 中的快速路线上
【发布时间】: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


【解决方案1】:

好的解决了,问题是 minikube 没有提供足够的资源。我在使用 AWS Beanstalk 时遇到了同样的问题,服务器也突然停止了,但在日志中我可以看到原因。他们用完了内存。 所以要解决这个 Minkube 必须使用额外的内存参数,如下所示:

minikube 启动 --memory=4096

【讨论】:

  • 我希望我可以帮助其他人解决这个问题,这样他们就不需要寻找 4 天,最终通过共同的想法找到解决方案。
猜你喜欢
  • 2020-08-12
  • 1970-01-01
  • 2016-11-14
  • 2017-12-27
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 2013-12-04
  • 2020-03-24
相关资源
最近更新 更多