Bereitstellung einer Node.js-Anwendung mit Kustomize auf Minikube

5 min read• By Noel Tandap
Blog
Erfahre, wie du eine Node.js-App mit Kustomize auf Minikube bereitstellst. Verwalte Dev-, Staging- und Prod-Umgebungen mühelos ohne komplexe Templates oder doppelte YAML

Einführung

In diesem Artikel zeigen wir Ihnen, wie Sie eine Node.js-Anwendung mit Kustomize auf einem Minikube-Cluster bereitstellen. Wir behandeln die Projektstruktur, die Dockerfile-Konfiguration, Kubernetes-Manifeste und die Verwendung von Kustomize zur Verwaltung verschiedener Konfigurationen für Entwicklungs-, Staging- und Produktionsumgebungen. Außerdem erörtern wir die Vorteile von Kustomize gegenüber anderen Alternativen.

Voraussetzungen

Bevor wir beginnen, stellen Sie bitte sicher, dass Folgendes auf Ihrem Rechner installiert ist:

Projektstruktur

Hier ist die Struktur unseres Projekts:

profile-app/ structure
profile-app/
├── config/
│ └── config.json
├── k8s/
│ ├── base/
│ │ ├── deployment.yaml
│ │ ├── service.yaml
│ │ ├── pvc.yaml
│ │ ├── namespace.yaml
│ │ └── kustomization.yaml
│ └── overlays/
│ ├── dev/
│ │ ├── config.json
│ │ └── kustomization.yaml
│ ├── prod/
│ │ ├── config.json
│ │ └── kustomization.yaml
│ └── staging/
│ ├── config.json
│ └── kustomization.yaml
├── app.js
├── package.json
├── Dockerfile
└── docs/
└── readme.md

Anwendungscode

app.js

app.js
1const express = require("express");
2const fs = require("fs");
3const app = express();
4const PORT = process.env.PORT || 3001;
5// Read the mounted config file
6const CONFIG_PATH = "./config/config.json";
7let config = { name: "Noel Bansikah", role: "DevOps Engineer", nameColor: "black", roleColor: "gray", environment: "development" };
8// Check if the config file exists
9if (fs.existsSync(CONFIG_PATH)) {
10 config = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));
11}
12// Define a color map for meaningful colors
13const colorMap = {
14 black: "#000000",
15 gray: "#6c757d",
16 blue: "#007BFF",
17 yellow: "#FFC107",
18 red: "#DC3545",
19 green: "#28A745"
20};
21// Get the colors from the config or default to black and gray
22const nameColor = colorMap[config.nameColor] || colorMap.black;
23const roleColor = colorMap[config.roleColor] || colorMap.gray;
24app.get("/", (req, res) => {
25 res.send(`
26 <html>
27 <body style="background-color: white; text-align: center; padding: 50px;">
28 <h1 style="color: ${nameColor};">Hello, I am ${config.name} 🚀</h1>
29 <h2 style="color: ${roleColor};">Role: ${config.role}</h2>
30 <h3>Environment: ${config.environment}</h3>
31 <p>GitHub: <a href="https://github.com/bansikah22">bansikah22</a></p>
32 <p>GitLab: <a href="https://gitlab.com/tandapnoelbansikah">bansikah22</a></p>
33 <p>LinkedIn: <a href="https://linkedin.com/in/tandapnoelbansikah">bansikah22</a></p>
34 </body>
35 </html>
36 `);
37});
38app.listen(PORT, () => console.log(`Server running on port ${PORT}...`));

Dockerfile

Dockerfile
1# Stage 1: Build stage
2FROM node:18-alpine AS build
3WORKDIR /app
4COPY package.json package-lock.json ./
5RUN npm ci --production
6COPY app.js ./
7# Stage 2: Production stage
8FROM node:18-slim
9WORKDIR /app
10RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
11COPY --from=build /app/node_modules /app/node_modules
12COPY --from=build /app/app.js /app/app.js
13CMD ["node", "app.js"]
14EXPOSE 3001

Erstellen und Hochladen des Docker-Images

Um das Docker-Image zu erstellen und auf Docker Hub hochzuladen, befolgen Sie diese Schritte:

  1. Docker-Image erstellen:

Bash
docker build -t <your-dockerhub-username>/profile-app:latest .

2. Das Docker-Image in Docker Hub hochladen:

Bash
docker push <your-dockerhub-username>/profile-app:latest

Ersetzen Sie dies <your-dockerhub-username>durch Ihren tatsächlichen Docker Hub-Benutzernamen.

Kubernetes-Manifeste

Basismanifeste

Das baseVerzeichnis enthält die gemeinsame Konfiguration, die in allen Umgebungen verwendet wird. Dazu gehören die Definitionen für Bereitstellung, Dienst, PVC und Namespace.

k8s/base/deployment.yaml

k8s/base/deployment.yaml
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: profile-app
5spec:
6 replicas: 1
7 selector:
8 matchLabels:
9 app: profile-app
10 template:
11 metadata:
12 labels:
13 app: profile-app
14 spec:
15 containers:
16 - name: profile-app
17 image: <your-dockerhub-username>/profile-app:latest
18 imagePullPolicy: Always
19 ports:
20 - containerPort: 3001
21 volumeMounts:
22 - name: config-volume
23 mountPath: /app/config
24 subPath: config.json
25 readOnly: false
26 volumes:
27 - name: config-volume
28 configMap:
29 name: profile-app-config

k8s/base/service.yaml

k8s/base/service.yaml
1apiVersion: v1
2kind: Service
3metadata:
4 name: profile-service
5spec:
6 selector:
7 app: profile-app
8 ports:
9 - protocol: TCP
10 port: 80
11 targetPort: 3001
12 type: ClusterIP

k8s/base/pvc.yaml

k8s/base/pvc.yaml
1apiVersion: v1
2kind: PersistentVolumeClaim
3metadata:
4 name: profile-app-pvc
5spec:
6 accessModes:
7 - ReadWriteOnce
8 resources:
9 requests:
10 storage: 1Gi

k8s/base/namespace.yaml

k8s/base/namespace.yaml
1apiVersion: v1
2kind: Namespace
3metadata:
4 name: profile-app

k8s/base/kustomization.yaml

Die kustomization.yamlDatei im baseVerzeichnis definiert die Ressourcen und Bilder, die in der Basiskonfiguration verwendet werden.

k8s/base/kustomization.yaml
1resources:
2 - deployment.yaml
3 - service.yaml
4 - pvc.yaml
5 - namespace.yaml
6
7images:
8 - name: profile-app
9 newName: <your-dockerhub-username>/profile-app
10 newTag: latest

Overlays

Das overlaysVerzeichnis enthält umgebungsspezifische Konfigurationen. Jede Umgebung (Entwicklung, Produktion, Staging) hat ihr eigenes Verzeichnis mit einer config.jsonDatei und einer kustomization.yamlDatei.

k8s/overlays/dev/config.json

k8s/overlays/dev/config.json
1{
2 "name": "Noel Bansikah",
3 "role": "DevOps Engineer and Software Developer",
4 "nameColor": "blue",
5 "roleColor": "green",
6 "environment": "development"
7}

k8s/overlays/dev/kustomization.yaml

k8s/overlays/dev/Kustomization.json
1namespace: dev
2resources:
3 - ../../base
4
5configMapGenerator:
6 - name: profile-app-config
7 files:
8 - config.json=config.json

k8s/overlays/prod/config.json

k8s/overlays/prod/config.json
1{
2 "name": "Noel Bansikah",
3 "role": "Senior DevOps Engineer",
4 "nameColor": "red",
5 "roleColor": "yellow",
6 "environment": "production"
7}

k8s/overlays/prod/kustomization.yaml

k8s/overlays/prod/kustomization.json
1namespace: prod
2resources:
3 - ../../base
4
5configMapGenerator:
6 - name: profile-app-config
7 files:
8 - config.json=config.json

k8s/overlays/staging/config.json

k8s/overlays/staging/config.json
1{
2 "name": "Noel Bansikah",
3 "role": "DevOps Engineer",
4 "nameColor": "green",
5 "roleColor": "blue",
6 "environment": "staging"
7}

k8s/overlays/staging/kustomization.yaml

k8s/overlays/staging/kustomization.json
1namespace: staging
2resources:
3 - ../../base
4
5configMapGenerator:
6 - name: profile-app-config
7 files:
8 - config.json=config.json

Kustomize verwenden

Kustomize ist ein Tool zur Anpassung von Kubernetes-Ressourcenkonfigurationen. Es ermöglicht die Verwaltung unterschiedlicher Konfigurationen für verschiedene Umgebungen, ohne YAML-Dateien duplizieren zu müssen. Kustomize ist in Kubernetes integriert kubectlund daher einfach zu bedienen.

Vorteile von Kustomize

  • Deklarative Verwaltung: Mit Kustomize können Sie Kubernetes-Ressourcen deklarativ verwalten.

  • Umgebungsspezifische Konfigurationen: Sie können mithilfe von Overlays verschiedene Konfigurationen für unterschiedliche Umgebungen verwalten.

  • Keine Vorlagen: Kustomize verwendet keine Vorlagen, wodurch es einfacher zu verstehen und zu warten ist.

  • Integriert in kubectl: Kustomize ist in integriert kubectl, sodass Sie keine zusätzlichen Tools installieren müssen.

Alternativen zu Kustomize

  • Helm: Helm ist ein Paketmanager für Kubernetes, der Konfigurationen mithilfe von Vorlagen verwaltet. Obwohl Helm leistungsstark und weit verbreitet ist, kann seine Verwaltung im Vergleich zu Kustomize komplexer sein.

  • Ksonnet: Ksonnet war ein weiteres Tool zur Verwaltung von Kubernetes-Konfigurationen, wurde aber zugunsten von Kustomize und Helm als veraltet eingestuft.

Warum wir Kustomize bevorzugen

Wir bevorzugen Kustomize für unsere Anwendung, da es eine einfache und deklarative Möglichkeit bietet, Konfigurationen für verschiedene Umgebungen zu verwalten. Es ist benutzerfreundlich, integriert kubectlund benötigt keine Vorlagen, was die Wartung vereinfacht.

Bereitstellung der Anwendung

1. Start Minicube

Bash
minikube start

2. Bereitstellung in Kubernetes

Bash
kubectl apply -k k8s/overlays/dev
kubectl apply -k k8s/overlays/prod
kubectl apply -k k8s/overlays/staging

3. App testen

Hafenweiterleitung

Bash
kubectl port-forward -n dev svc/profile-service 8080:80
kubectl port-forward -n staging svc/profile-service 8081:80
kubectl port-forward -n prod svc/profile-service 8082:80

Greifen Sie auf die App zu.

Öffnen Sie Ihren Browser und navigieren Sie zu:

developement access to app minikube DE
  • Staging: http://localhost:8081

    staging access to app minikube DE
  • Produktion: http://localhost:8082

    production access to app minikube DE

4. Bereitstellungen überprüfen

Bash
kubectl get pods -n dev
kubectl get pods -n staging
kubectl get pods -n prod
kubectl get services -n dev
kubectl get services -n staging
kubectl get services -n prod

5. Überprüfen Sie die Protokolle, um die Farben zu bestätigen

Bash
kubectl logs -n dev deployment/profile-app
kubectl logs -n staging deployment/profile-app
kubectl logs -n prod deployment/profile-app

6. Testen Sie die persistente Speicherung

Überprüfen Sie die Lautstärkehalterung.

Bash
kubectl exec -n dev -it $(kubectl get pod -n dev -l app=profile-app -o jsonpath='{.items[0].metadata.name}') -- ls /app/config
Check the Volume Mount minikube DE

Starten Sie den Pod neu und prüfen Sie, ob die Konfiguration erhalten bleibt.

Bash
kubectl delete pod -n dev -l app=profile-app
kubectl get pods -n dev -w

7. Überprüfen Sie die aktualisierte Konfiguration

Bash
kubectl exec -n dev -it $(kubectl get pod -n dev -l app=profile-app -o jsonpath='{.items[0].metadata.name}') -- curl profile-service
Verify the Updated Config Minikube DE

Öffnen Sie http://localhost:8080 in Ihrem Browser, um die aktualisierte Konfiguration zu sehen! 🎉

Abschluss

In diesem Artikel haben wir untersucht, wie man eine Node.js-Anwendung mit Kustomize auf einem Minikube-Cluster bereitstellt. Wir haben die Projektstruktur, die Dockerfile-Konfiguration, Kubernetes-Manifeste und die Verwendung von Kustomize zur Verwaltung verschiedener Konfigurationen für Entwicklungs-, Staging- und Produktionsumgebungen behandelt. Außerdem haben wir die Vorteile von Kustomize gegenüber anderen Alternativen erörtert. Link zum Code

Bei Fragen oder Problemen könnt ihr diese gerne unten in den Kommentaren stellen. Viel Spaß beim Programmieren!

Referenzen

Viel Spaß beim Programmieren! 🎉

© 2026 adorsys. Alle Rechte vorbehalten.
Certificate TopCompany Kununu
Certificate ISO 27001
Certificate ISO 9001