Dockerisierung und Kubernetes-Bereitstellung einer Node.js-Anwendung
Containerisierung und Deployment mit Leichtigkeit: Dieses Tutorial führt Sie Schritt für Schritt durch die Dockerisierung und Kubernetes-Bereitstellung einer Node.js-Anwendung.
Von den Grundlagen bis zur Implementierung bietet Ihnen dieser Beitrag klare Schritt-für-Schritt-Anleitungen und wertvolle Einblicke. Erfahren Sie, wie Sie Ihre Anwendung mithilfe dieser leistungsfähigen Tools effizient modernisieren und skalieren können.
Schritt 1 – Klone des Node.js-Projektcodes
Zuerst klonen Sie den Node.js-Projektcode von GitHub:
git clone https://github.com/your-username/your-nodejs-app.git
Navigieren Sie dann in das Verzeichnis des geklonten Projektcodes:
cd your-nodejs-app
Schritt 2 – Dockerisierung der Anwendung
Die Node.js-Anwendung muss für die Ausführung in einem Docker-Container vorbereitet werden. Sie erstellen eine Dockerfile im Stammverzeichnis der Anwendung und eine .dockerignore-Datei, um Dateien und Verzeichnisse zu verwalten, die Sie beim Erstellen des Images ausschließen möchten.
Erstellen Sie eine Dockerfile:
touch Dockerfile
Öffnen Sie die Dockerfile in Ihrem bevorzugten Texteditor und fügen Sie den folgenden Inhalt ein:
# Verwenden Sie das offizielle Node.js 14-Image als Basis-Image
FROM node:14
# Setzen Sie das Arbeitsverzeichnis im Container
WORKDIR /usr/src/app
# Kopieren Sie die Abhängigkeitsdateien in das Arbeitsverzeichnis
COPY package*.json ./
# Installieren Sie die Abhängigkeiten
RUN npm install
# Kopieren Sie den Anwendungscode in das Arbeitsverzeichnis
COPY . .
# Ändern Sie die Standardportnummer
ENV PORT=8080
# Der Container hört auf den zuvor festgelegten Port
EXPOSE $PORT
# Starten Sie die Anwendung
CMD [ „node“, „index.js“ ]
Speichern und schließen Sie die Datei.
Schritt 3 – Übersetzen der Compose-Services in Kubernetes-Objekte mit Kompose
Nun, da Sie den Node.js-Projektcode geklont und die Anwendung verpackt haben, können Sie Ihre Docker-Compose-Dienstdefinitionen in Kubernetes-Objekte übersetzen. Sie können KOMPOSE verwenden, um diese Übersetzung zu erleichtern. Beginnen Sie, indem Sie eine neue YAML-Datei namens docker-compose.yaml im Stammverzeichnis der Anwendung erstellen:
touch docker-compose.yaml
Öffnen Sie die Datei in Ihrem bevorzugten Texteditor und fügen Sie den folgenden Inhalt ein:
version: ‚3‘
services:
web:
build: .
image: nodejs-mongo-web
ports:
– „8080:8080“
environment:
– MONGODB_URI=mongodb://mongodb:27017/hai
depends_on:
– mongodb
mongodb:
image: mongo
ports:
– „27017:27017“
environment:
– MONGO_INITDB_DATABASE=hai
Speichern und schließen Sie die Datei. Diese Datei definiert zwei Dienste: einen für die Node.js-Anwendung und einen für die MongoDB-Datenbank. Die web-Service-Definition legt fest, dass der Anwendungscode mithilfe des Dockerfiles im aktuellen Verzeichnis erstellt wird, und gibt an, dass die Anwendung auf Port 8080 im Container und Port 8080 auf dem Host gehört. Die mongodb-Service-Definition spezifiziert, dass der offizielle MongoDB-Container verwendet wird und gibt an, dass MongoDB auf Port 27017 im Container und Port 27017 auf dem Host gehört.
Kompilieren Sie nun die Docker-Compose-Dienstdefinitionen in Kubernetes-Objekte mit dem folgenden kompose-Befehl:
kompose convert -f docker-compose.yaml
Dieser Befehl liest die Dienstdefinitionen in docker-compose.yaml und gibt die entsprechenden Kubernetes-Objekte in YAML-Format aus. Standardmäßig werden Sie in vier Dateien aufgeteilt: one for the Node.js-Anwendung, one for the MongoDB-Datenbank, one for the Service exposing the Node.js application, and one for the Secret containing the MongoDB credentials.
Weitere Informationen zu den kompose-Befehlen und -Optionen finden Sie in der Dokumentation von KOMPOSE.
Nachdem die Dienstdefinitionen in Kubernetes-Objekte übersetzt wurden, werden Sie in einem neuen Verzeichnis mit dem Namen KOMPOSE erstellt. Navigieren Sie in dieses Verzeichnis, um die Dateien zu überprüfen:
cd kompose
Sie sollten vier YAML-Dateien sehen: nodejs-mongo-web-deployment.yaml, mongodb-deployment.yaml, nodejs-mongo-web-service.yaml und mongodb-secret.yaml. Diese Dateien entsprechen den Kubernetes-Objekten, die durch KOMPOSE erstellt wurden: Deployments für die Node.js-Anwendung und die MongoDB-Datenbank, einen Service, der die Node.js-Anwendung exponiert, und ein Secret, das die MongoDB-Anmeldeinformationen enthält.
Öffnen Sie jede Datei in Ihrem bevorzugten Texteditor und überprüfen Sie die generierten Kubernetes-Objekte:
- nodejs-mongo-web-deployment.yaml: Enthält die Deployment-Definition für die Node.js-Anwendung, einschließlich des Containerspecs, der Umgebungsvariablen und des Pod-Labels.
- mongodb-deployment.yaml: Enthält die Deployment-Definition für die MongoDB-Datenbank, einschließlich des Containerspecs, des Pod-Labels und des PersistentVolumeClaims.
- nodejs-mongo-web-service.yaml: Enthält die Service-Definition für die Node.js-Anwendung, einschließlich der Serviceart und des Zielports.
- mongodb-secret.yaml: Enthält das Secret-Objekt mit den MongoDB-Anmeldeinformationen, verschlüsselt als base64.
Sie können diese YAML-Dateien jetzt verwenden, um die Kubernetes-Objekte in Ihrem Cluster zu erstellen. Sie sollten jedoch einige Anpassungen vornehmen, um sicherzustellen, dass sie Ihren spezifischen Anforderungen entsprechen. Zum Beispiel sollten Sie die Umgebungsvariablen und die Zugriffsrechte anpassen, um Ihren spezifischen Anwendungsfall zu berücksichtigen.
Schritt 4 – Erstellen von Kubernetes-Secrets
Bevor Sie Ihre Kubernetes-Objekte erstellen, müssen Sie das Secret-Objekt mit den MongoDB-Anmeldeinformationen erstellen. Erstellen Sie zuerst ein Kubernetes-Secret-Objekt aus der mongodb-secret.yaml-Datei:
kubectl apply -f mongodb-secret.yaml
Dieser Befehl erstellt das Secret-Objekt im aktuellen Kubernetes-Namespace. Um das Secret-Objekt in einem anderen Namespace zu erstellen, verwenden Sie das -n Flag.
Überprüfen Sie, ob das Secret-Objekt erfolgreich erstellt wurde:
kubectl get secret mongodb
Sie sollten eine Ausgabe wie die folgende sehen:
NAME TYPE
DATA AGE
mongodb Opaque 2 10s
Das Secret-Objekt mit dem Namen mongodb wurde erfolgreich erstellt. Es enthält zwei Datenfelder: username und password, die die MongoDB-Anmeldeinformationen enthalten.
Schritt 5 – Anpassen der Kubernetes-Objekte
Bevor Sie die Kubernetes-Objekte erstellen, sollten Sie einige Anpassungen vornehmen, um sicherzustellen, dass sie Ihren spezifischen Anforderungen entsprechen. Dazu gehören das Festlegen von Umgebungsvariablen, das Festlegen von Zugriffsrechten und das Konfigurieren von Ressourcenlimits.
Öffnen Sie zuerst die nodejs-mongo-web-deployment.yaml-Datei in Ihrem bevorzugten Texteditor und nehmen Sie die folgenden Anpassungen vor:
- Setzen Sie die Umgebungsvariable MONGODB_URI, um auf das Secret-Objekt mit den MongoDB-Anmeldeinformationen zu verweisen.
- Fügen Sie einen Init-Container hinzu, der darauf wartet, dass die MongoDB-Datenbank bereit ist, bevor er die Node.js-Anwendung startet.
Fügen Sie zuerst den Init-Container zur Deployment-Definition der Node.js-Anwendung hinzu. Öffnen Sie dazu die nodejs-mongo-web-deployment.yaml-Datei und fügen Sie den folgenden Init-Container-Spec unter spec.template.spec.containers hinzu:
initContainers:
– name: init-db
image: mongo
command: [’sh‘, ‚-c‘, ‚until mongo –eval „db.adminCommand(‚ping‘)“; do sleep 2; done‘]
Speichern und schließen Sie die Datei.
Erstellen Sie dann den Service für die MongoDB-Datenbank. Öffnen Sie die mongodb-service.yaml-Datei und fügen Sie den folgenden Service-Definition unter spec hinzu:
apiVersion: v1
kind: Service
metadata:
name: mongodb
labels:
io.kompose.service: mongodb
spec:
ports:
– name: „27017“
port: 27017
targetPort: 27017
selector:
io.kompose.service: mongodb
Speichern und schließen Sie die Datei.
Schritt 6 – Erstellen der Kubernetes-Objekte
Nachdem Sie die Anpassungen vorgenommen haben, können Sie Ihre Kubernetes-Objekte im Cluster erstellen. Verwenden Sie dazu den kubectl apply-Befehl, um die Deployment- und Service-Definitionen in Ihren Cluster zu übertragen:
kubectl apply -f nodejs-mongo-web-deployment.yaml
kubectl apply -f mongodb-deployment.yaml
kubectl apply -f nodejs-mongo-web-service.yaml
kubectl apply -f mongodb-service.yaml
Nachdem Sie die Kubernetes-Objekte erstellt haben, können Sie den Status der Pods überprüfen, um sicherzustellen, dass Sie erfolgreich gestartet wurden:
kubectl get pods
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
NAME READY STATUS RESTARTS AGE
mongodb-6b789f4577-gj22z 1/1 Running 0 5m
nodejs-mongo-web-695b58d4d4-d8lqz 1/1 Running 0 5m
Wenn der STATUS für beide Pods Running lautet, wurden Sie erfolgreich gestartet. Wenn der STATUS etwas anderes ist, verwenden Sie den kubectl describe-Befehl, um weitere Informationen zu erhalten und mögliche Probleme zu diagnostizieren.
Schritt 7 – Zugreifen auf die Anwendung
Nachdem die Pods gestartet wurden, können Sie auf die Anwendung zugreifen, indem Sie den Service-Endpoint verwenden. Verwenden Sie dazu den kubectl get service-Befehl, um den Service-Endpoint abzurufen:
kubectl get service nodejs-mongo-web
Sie sollten eine Ausgabe ähnlich der folgenden sehen:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nodejs-mongo-web ClusterIP 10.245.159.26 8080/TCP 5m
Der Service-Endpoint ist der CLUSTER-IP, gefolgt von der PORT(S)-Nummer. Sie können auf die Anwendung zugreifen, indem Sie eine HTTP-Anfrage an den Service-Endpoint senden.
Öffnen Sie einen Webbrowser oder verwenden Sie curl, um auf die Anwendung zuzugreifen:
curl http://:
Ersetzen Sie und durch die entsprechenden Werte für Ihren Service-Endpoint. Wenn Sie die Anwendung im Browser öffnen, sollten Sie die Startseite der Anwendung sehen, die eine Liste von Haiinformationen anzeigt.
Fazit
In diesem Tutorial haben Sie gelernt, wie Sie Docker-Compose-Dienstdefinitionen in Kubernetes-Objekte mit KOMPOSE übersetzen. Sie haben einen Node.js-Anwendungscode geklont und verpackt, die Docker-Compose-Dienstdefinitionen in Kubernetes-Objekte übersetzt, Kubernetes-Secrets erstellt, Anpassungen an den Kubernetes-Objekten vorgenommen und die Kubernetes-Objekte in Ihrem Cluster erstellt. Schließlich haben Sie auf die Anwendung zugegriffen, um sicherzustellen, dass Sie erfolgreich gestartet wurde.