<p>I am trying to create a Kubernetes node in minikube with a NodejS Express server in it.</p>

<p>The basic application runs without any problem on bare metal(Linux Ubuntu, Windows etc). But in Kubernetes I have lot of problems
I have a lot of routes and the server deployment fails. If I reduce the number of routes with for lets say 50% the app runs fine. It doesn't make any difference which routes I commented out.</p>

<p>Deployment file (server-cluster-ip-service.yaml):</p>

<pre><code>apiVersion: v1
kind: Service
metadata:
    name: server-cluster-ip-service
spec:
    type: ClusterIP
    selector:
        component: server
    ports:
        -   port: 8093
            targetPort: 8093
</code></pre>

<p>Deployment file (server-deployment.yaml):</p>

<pre><code>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
</code></pre>

<p>server.ts file:</p>

<pre><code>export const app: Application = express();
app.listen(8093), () =&gt; {

    initApi(app).then(() =&gt; {
        apiRoutes(app);
    }).catch((error) =&gt; {
        console.log(" what the f?ck is going wrong: " + error);
    });
    console.log('HTTP Server running at http://' + '192.168.99.100' + ': on port: ' + '8093');
});
</code></pre>

<p>api.ts file:</p>

<pre><code>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');
}
</code></pre>

<p>apiRoute.ts file :
(And when I remove or commented out the routes from step6 untill step9 the application runs ok in kubernetes minikube.)</p>

<pre><code>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'); 
}
</code></pre>

<p>after loading the files with
kubectl apply -f 
And running
kubectl logs server-deployment-8588f6cfdd-ftqvj
Then i get this in response:</p>

<pre><code>&gt; salesactas400@0.8.0 start /server
&gt; ts-node ./server.ts
</code></pre>

<p>This is WRONG, it seems that the application crashes I don't see console.log messages.</p>

<p>After kubectl get pods I get this:</p>

<pre><code>NAME                                   READY   STATUS      RESTARTS   AGE
postgres-deployment-7d9788bdfd-pf6hf   1/1     Running     0          101s
server-deployment-8588f6cfdd-ftqvj     0/1     Completed   2          67s
</code></pre>

<p>For some reason the container completed ???</p>

<p>When i remove the routes from step6 to step9 then I see this:</p>

<pre><code>&gt; salesactas400@0.8.0 start /server
&gt; 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
</code></pre>

<p>So this is OK, but WHY I can't load all the routes, is there any limitation in kubernetes on NodeJS Express server on routes maybe, something else in my code is maybe wrong ?</p>

<p>I run:
minikube version 1.6.2, docker version 19.03.5
NodeJS version at this moment 12.14 from the the node:alpine image
I also tried NodeJS version 10.14 and 11.6</p>

<p>Dockerfile I have used for creating the container jabro888/salesactas4002server:1.0.1</p>

<pre><code>FROM node:12.14.0-alpine
WORKDIR "/server"
COPY ./package.json ./
RUN apk add --no-cache --virtual .gyp \
        python \
        make \
        g++ \
        unixodbc \
        unixodbc-dev \
    &amp;&amp; npm install \
    &amp;&amp; apk del .gyp
COPY . .
#ENV NODE_ENV=production
CMD ["npm", "start"]
</code></pre>

<p>I hope somebody can help me I am struggling all ready 3 days with this problem.</p>

<p>This also might be interesting and I don't understand no any .... thing about this. After some time the pod restarts and after some time it crashes. 
And again I tried the same app on a Linux machine and it runs without any problem.</p>

<pre><code>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$
</code></pre>

<p>Ok SOLVED, the problem was that minikube is not giving enough resources. I had the same problem when I used AWS Beanstalk, also suddenly the server stopped, but in the logs I could see why. They ran out of RAM.
So to solve this Minkube has to be started with an extra memory parameter like this:</p>

<blockquote>
  <p>minikube start --memory=4096</p>
</blockquote>
