Einleitung: Warum JavaScript auf Kubernetes bereitstellen?
\nModerne Webentwicklung mit JavaScript (insbesondere mit Node.js) erfordert zunehmend nicht nur den Start einer Anwendung auf einem einzelnen Server, sondern die Organisation einer ausfallsicheren, skalierbaren und einfach zu verwaltenden Infrastruktur. Kubernetes (K8s) ist der De-facto-Standard für die Container-Orchestrierung. Wenn Sie mit Node.js entwickeln und möchten, dass Ihre Anwendung Spitzenlasten übersteht, sich nach Ausfällen automatisch erholt und ohne Ausfallzeiten einfach aktualisiert werden kann, benötigen Sie Kubernetes.
\nIn diesem Leitfaden werden wir den grundlegenden Bereitstellungsprozess einer einfachen Node.js-Anwendung in einem Kubernetes-Cluster durchgehen. Sie erfahren, wie Sie ein Docker-Image vorbereiten, die erforderlichen YAML-Manifeste (Deployment, Service, Ingress) schreiben und die Anwendung starten. Der Artikel richtet sich an Entwickler, die bereits mit den Grundlagen von Node.js und Docker vertraut sind, aber gerade erst ihre Reise in die Welt von Kubernetes beginnen.
\n\n
1. Vorbereitung der Node.js-Anwendung und des Docker-Images
\nAls Erstes benötigen wir eine Anwendung, die wir bereitstellen werden. Erstellen wir einen einfachen HTTP-Server mit Express, der auf GET-Anfragen antwortet.
\n1.1. Erstellen eines einfachen Servers (app.js)
\nconst express = require('express');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/', (req, res) => {\n res.send('Hello from Node.js on Kubernetes!');\n});\n\napp.listen(PORT, () => {\n console.log(`Server running on port ${PORT}`);\n});\n\nDatei package.json (Abhängigkeiten):
{\n "name": "k8s-node-app",\n "version": "1.0.0",\n "main": "app.js",\n "scripts": {\n "start": "node app.js"\n },\n "dependencies": {\n "express": "^4.18.2"\n }\n}\n\n1.2. Dockerfile für Node.js
\nDamit Kubernetes unsere Anwendung ausführen kann, muss sie in einen Container verpackt werden. Wir verwenden das offizielle Node.js-Image (Version 18 LTS).
\n# Verwende das offizielle Node.js-Image\nFROM node:18-alpine\n\n# Lege das Arbeitsverzeichnis innerhalb des Containers fest\nWORKDIR /usr/src/app\n\n# Kopiere package.json und package-lock.json\nCOPY package*.json ./\n\n# Installiere Abhängigkeiten\nRUN npm install --production\n\n# Kopiere den Quellcode der Anwendung\nCOPY . .\n\n# Gib den Port an, den die Anwendung abhören wird\nEXPOSE 3000\n\n# Befehl zum Starten der Anwendung\nCMD ["node", "app.js"]\n\nImage erstellen und in die Registry hochladen:
\n# Image erstellen\ndocker build -t my-registry/node-app:v1 .\n\n# In Docker Hub oder Ihre private Registry hochladen\ndocker push my-registry/node-app:v1\n\nErsetzen Sie my-registry durch den Namen Ihrer Registry (z.B. docker.io/username/node-app).
\n
2. Erstellen von YAML-Manifesten für Kubernetes
\nKubernetes verwendet einen deklarativen Ansatz: Wir beschreiben den gewünschten Zustand des Systems in YAML-Dateien, und K8s bringt alles in diesen Zustand. Wir benötigen drei Hauptressourcen: Deployment, Service und Ingress.
\n2.1. Deployment (deployment.yaml)
\nDas Deployment ist für das Starten und Aktualisieren von Pods (Containern) verantwortlich. Es stellt sicher, dass die erforderliche Anzahl von Replikaten immer läuft.
\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: node-app-deployment\n labels:\n app: node-app\nspec:\n replicas: 3 # Anzahl der Replikate (Kopien) der Anwendung\n selector:\n matchLabels:\n app: node-app\n template:\n metadata:\n labels:\n app: node-app\n spec:\n containers:\n - name: node-app\n image: my-registry/node-app:v1\n ports:\n - containerPort: 3000\n env:\n - name: PORT\n value: "3000"\n resources:\n requests:\n memory: "64Mi"\n cpu: "250m"\n limits:\n memory: "128Mi"\n cpu: "500m"\n\nWichtige Punkte:
\n- \n
replicas: 3— start