Bereitstellung einer Node.js-Anwendung mit Kustomize auf Minikube
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/├── 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
1const express = require("express");2const fs = require("fs");3const app = express();4const PORT = process.env.PORT || 3001;5// Read the mounted config file6const 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 exists9if (fs.existsSync(CONFIG_PATH)) {10 config = JSON.parse(fs.readFileSync(CONFIG_PATH, "utf-8"));11}12// Define a color map for meaningful colors13const 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 gray22const 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
1# Stage 1: Build stage2FROM node:18-alpine AS build3WORKDIR /app4COPY package.json package-lock.json ./5RUN npm ci --production6COPY app.js ./7# Stage 2: Production stage8FROM node:18-slim9WORKDIR /app10RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*11COPY --from=build /app/node_modules /app/node_modules12COPY --from=build /app/app.js /app/app.js13CMD ["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:
Docker-Image erstellen:
docker build -t <your-dockerhub-username>/profile-app:latest .
2. Das Docker-Image in Docker Hub hochladen:
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
1apiVersion: apps/v12kind: Deployment3metadata:4 name: profile-app5spec:6 replicas: 17 selector:8 matchLabels:9 app: profile-app10 template:11 metadata:12 labels:13 app: profile-app14 spec:15 containers:16 - name: profile-app17 image: <your-dockerhub-username>/profile-app:latest18 imagePullPolicy: Always19 ports:20 - containerPort: 300121 volumeMounts:22 - name: config-volume23 mountPath: /app/config24 subPath: config.json25 readOnly: false26 volumes:27 - name: config-volume28 configMap:29 name: profile-app-config
k8s/base/service.yaml
1apiVersion: v12kind: Service3metadata:4 name: profile-service5spec:6 selector:7 app: profile-app8 ports:9 - protocol: TCP10 port: 8011 targetPort: 300112 type: ClusterIP
k8s/base/pvc.yaml
1apiVersion: v12kind: PersistentVolumeClaim3metadata:4 name: profile-app-pvc5spec:6 accessModes:7 - ReadWriteOnce8 resources:9 requests:10 storage: 1Gi
k8s/base/namespace.yaml
1apiVersion: v12kind: Namespace3metadata:4 name: profile-app
k8s/base/kustomization.yaml
Die kustomization.yamlDatei im baseVerzeichnis definiert die Ressourcen und Bilder, die in der Basiskonfiguration verwendet werden.
1resources:2 - deployment.yaml3 - service.yaml4 - pvc.yaml5 - namespace.yaml67images:8 - name: profile-app9 newName: <your-dockerhub-username>/profile-app10 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
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
1namespace: dev2resources:3 - ../../base45configMapGenerator:6 - name: profile-app-config7 files:8 - config.json=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
1namespace: prod2resources:3 - ../../base45configMapGenerator:6 - name: profile-app-config7 files:8 - config.json=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
1namespace: staging2resources:3 - ../../base45configMapGenerator:6 - name: profile-app-config7 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 integriertkubectl, 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
minikube start
2. Bereitstellung in Kubernetes
kubectl apply -k k8s/overlays/devkubectl apply -k k8s/overlays/prodkubectl apply -k k8s/overlays/staging
3. App testen
Hafenweiterleitung
kubectl port-forward -n dev svc/profile-service 8080:80kubectl port-forward -n staging svc/profile-service 8081:80kubectl port-forward -n prod svc/profile-service 8082:80
Greifen Sie auf die App zu.
Öffnen Sie Ihren Browser und navigieren Sie zu:
Entwicklung: http://localhost:8080

Staging: http://localhost:8081
![staging access to app minikube DE]()
Produktion: http://localhost:8082
![production access to app minikube DE]()
4. Bereitstellungen überprüfen
kubectl get pods -n devkubectl get pods -n stagingkubectl get pods -n prodkubectl get services -n devkubectl get services -n stagingkubectl get services -n prod
5. Überprüfen Sie die Protokolle, um die Farben zu bestätigen
kubectl logs -n dev deployment/profile-appkubectl logs -n staging deployment/profile-appkubectl logs -n prod deployment/profile-app
6. Testen Sie die persistente Speicherung
Überprüfen Sie die Lautstärkehalterung.
kubectl exec -n dev -it $(kubectl get pod -n dev -l app=profile-app -o jsonpath='{.items[0].metadata.name}') -- ls /app/config

Starten Sie den Pod neu und prüfen Sie, ob die Konfiguration erhalten bleibt.
kubectl delete pod -n dev -l app=profile-appkubectl get pods -n dev -w
7. Überprüfen Sie die aktualisierte Konfiguration
kubectl exec -n dev -it $(kubectl get pod -n dev -l app=profile-app -o jsonpath='{.items[0].metadata.name}') -- curl profile-service

Ö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! 🎉

