Wie man eine Python-Anwendung mit Okteto auf Kubernetes bereitstellt
Einführung
Okteto ist eine Entwicklungsplattform, die verwendet wird, um den Entwicklungsprozess für Kubernetes-Anwendungen zu optimieren. Es ermöglicht Entwicklern, ihre Anwendungen direkt in Kubernetes-Clustern zu erstellen und zu testen, ohne komplexe lokale Entwicklungsumgebungen einrichten zu müssen. Okteto ermöglicht Live-Updates für Anwendungen, die in Kubernetes-Clustern ausgeführt werden, sodass Entwickler ihre Codeänderungen in Echtzeit sehen können, ohne ihre Anwendungen neu erstellen oder erneut bereitstellen zu müssen.
In diesem Tutorial erstellen Sie eine Python-Anwendung und setzen sie mit Okteto auf Kubernetes ein.
Voraussetzungen
Bevor Sie mit diesem Tutorial beginnen, benötigen Sie Folgendes:
- Ein Kubernetes 1.28-Cluster. In diesem Tutorial wird das Setup einen DigitalOcean Kubernetes-Cluster mit mindestens 3 Knoten (4CPUs und 16GB RAM jeweils) verwenden.
kubectlinstalliert und konfiguriert, um mit Ihrem Cluster zu kommunizieren.- Ein Docker Hub-Konto.
- Docker läuft auf deinem lokalen Rechner.
- Eine Lizenz ist erforderlich, um Okteto zu nutzen. Melden Sie sich für die kostenlose 30-tägige Testversion von Okteto an, um einen Lizenzschlüssel zu erhalten.
- Der Helm-Paketmanager ist auf Ihrem lokalen Computer installiert. Um dies zu tun, schließen Sie Schritt 1 des Tutorials "So installieren Sie Software auf Kubernetes-Clustern mit dem Helm 3-Paketmanager" ab.
- Ein vollständig registrierter Domainname, der auf den Lastenausgleichsserver zeigt, der vom Nginx Ingress verwendet wird. Sie müssen einen
A-Eintrag mit dem Namen*und der IP-Adresse des Lastenausgleichsservers erstellen.
Schritt 1 - Erstellen Sie eine Python-Anwendung
Zuerst müssen Sie sicherstellen, dass Python auf Ihrem Ubuntu-System installiert ist. Sie können dies überprüfen, indem Sie ein Terminal öffnen und folgendes eingeben:
python3 --version
Wenn Python installiert ist, wird dieser Befehl die Version von Python anzeigen. Wenn nicht, können Sie es mit folgendem Befehl installieren:
sudo apt install python3 python3-venv python3-pip -y
Als nächstes erstellen Sie ein Verzeichnis, um Ihren Anwendungscode und andere Konfigurationen zu speichern.
mkdir my-app
Navigieren Sie als Nächstes zu Ihrem Anwendungsverzeichnis und erstellen Sie eine virtuelle Umgebung, um Ihre Projektabhängigkeiten zu isolieren.
cd my-app
python3 -m venv python-env
Aktivieren Sie als Nächstes die virtuelle Umgebung mit dem folgenden Befehl.
source python-env/bin/activate
Als nächstes erstellen Sie eine neue Python-Datei für Ihre Anwendung. Zum Beispiel erstellen Sie eine einfache app.py Datei:
nano app.py
Fügen Sie den folgenden Code hinzu:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, This is a simple Python App!"
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0')
Als Nächstes installieren Sie das Flask-Webframework.
pip install flask
Jetzt führen Sie Ihre Python-Anwendung mit dem folgenden Befehl aus.
python3 app.py
Sie werden die folgende Ausgabe sehen.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://172.20.10.2:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 311-959-468
Jetzt, da die Flask-Anwendung lokal läuft und Sie sie mit curl überprüfen können:
curl -X GET -H "Content-Type: application/json" http://localhost:5000
Sie sollten die folgende Antwort von der Flask-Anwendung erhalten.
Hello, This is a simple Python App!
Wenn Sie mit Ihrer Arbeit an Ihrem Projekt fertig sind, können Sie die virtuelle Umgebung deaktivieren, indem Sie eingeben:
deactivate
An diesem Punkt haben Sie eine Python-Anwendung erstellt und sie lokal getestet.
Schritt 2 - Dockerisiere Python-Anwendung
Das Dockerisieren einer Python-Anwendung beinhaltet das Erstellen eines Docker-Images, das die Python-Umgebung und die erforderlichen Abhängigkeiten zum Ausführen der Anwendung enthält.
Zuerst erstellen Sie eine Datei mit dem Namen Dockerfile im Stammverzeichnis Ihrer Python-Anwendung.
nano Dockerfile
Fügen Sie den folgenden Inhalt hinzu:
Use an official Python runtime as a parent image
FROM python:3.8-slim
Set the working directory in the container
WORKDIR /app
Copy the current directory contents into the container at /app
ADD . /app
Install any needed dependencies specified in requirements.txt
RUN pip install flask
Make port 5000 available to the world outside this container
EXPOSE 5000
Define environment variable
ENV NAME DockerizedPythonApp
Run app.py when the container launches
CMD ["python3", "./app.py"]
In diesem Dockerfile:
- FROM python:3.8-slim: Gibt das Basis-Image an, das verwendet werden soll. Sie verwenden ein offizielles Python-Image mit Python 3.8 installiert.
- Setzt das Arbeitsverzeichnis im Container auf /app.
- ADD . /app: Kopiert den Inhalt des aktuellen Verzeichnisses in das Verzeichnis /app des Containers.
RUN pip install flask: Installiert das Flask-Framework.EXPOSE 5000: Öffnet den Port5000, um eingehende Verbindungen zu ermöglichen.CMD ["python3", "app.py"]: Gibt den Befehl an, der beim Starten des Containers ausgeführt werden soll. In diesem Fall wirdapp.pyausgeführt.
Führen Sie jetzt den folgenden Befehl aus, um das Image basierend auf den Anweisungen in Ihrer Dockerfile zu erstellen.
docker build -t my-app .
Nachdem Sie das Docker-Image erstellt haben, können Sie Ihre Anwendung in einem Container mit dem erstellten Image ausführen:
docker run -dit -p 5000:5000 my-app:latest
Dieser Befehl startet einen Container aus dem my-app Image und mappt den Containerport auf einen Hostport 5000.
Sie können Ihren laufenden Anwendungscontainer mit dem Befehl docker ps überprüfen.
docker ps
Die Ausgabe wird sein:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
761c54c77411 my-app:latest "python3 ./app.py" 3 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp pedantic_wescoff
Öffnen Sie einen Webbrowser oder verwenden Sie curl, um die Anwendung über die URL http://your-server-ip:5000 zuzugreifen. Sie sollten die Nachricht Hallo, das ist eine einfache Python-App! sehen, die anzeigt, dass Ihre Python-Anwendung im Docker-Container läuft.
Bis jetzt hast du deine Python-Anwendung erfolgreich in Docker verpackt.
Schritt 3 - Python Docker-Image in das DockerHub-Register hochladen
Zuerst müssen Sie ein DockerHub-Konto haben. Wenn Sie noch keins haben, können Sie es auf der DockerHub-Website erstellen.
Verwenden Sie den Befehl docker login, um sich bei Docker Hub anzumelden. Ihnen wird aufgefordert, Ihren Docker Hub-Benutzernamen und Ihr Passwort einzugeben.
docker login
Die Ausgabe dieses Befehls wird sein:
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: username@gmail.com
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
Bevor du das Bild zu Docker Hub hochlädst, musst du es auch mit deinem Docker Hub-Benutzernamen und dem gewünschten Repository-Namen taggen.
docker tag my-app yourusername/my-app:latest
Sie können jetzt Ihr Docker-Image mit dem Befehl docker push zu Docker Hub hochladen.
docker push yourusername/my-app:latest
Nachdem Sie das Image gepusht haben, können Sie überprüfen, ob es auf Docker Hub verfügbar ist, indem Sie es mit der Docker Hub CLI suchen.
docker search yourusername/my-app
Ihr Python-App-Docker-Image ist jetzt auf Docker Hub verfügbar und kann von anderen abgerufen oder in verschiedenen Umgebungen bereitgestellt werden.
Schritt 4 - Erstellen Sie Kubernetes-Manifestdateien zur Bereitstellung der Python-Anwendung
Jetzt müssen Sie eine Kubernetes-Manifestdatei mit Okteto erstellen, um die Bereitstellung, den Dienst und die Ingress-Ressourcen für eine Anwendung namens my-app zu definieren.
nano k8s.yaml
Fügen Sie die folgende Konfiguration zur Datei hinzu.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- image: yourusername/my-app
name: my-app
---
apiVersion: v1
kind: Service
metadata:
name: my-app
spec:
type: ClusterIP
ports:
- name: "my-app"
port: 5000
selector:
app: my-app
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-app
annotations:
dev.okteto.com/generate-host: my-app
spec:
rules:
- http:
paths:
- backend:
service:
name: my-app
port:
number: 5000
path: /
pathType: ImplementationSpecific
Die obige Datei deployt eine Anwendung namens my-app mit Okteto, stellt sie intern über einen ClusterIP-Dienst auf Port 5000 bereit und richtet eine Ingress-Ressource ein, um den HTTP-Verkehr zur Anwendung zu leiten. Okteto-spezifische Annotationen werden verwendet, um bestimmte von Okteto bereitgestellte Funktionen zu aktivieren, wie z.B. die automatische Hostnamen-Generierung.
Schritt 5 - Okteto mit Helm installieren
Zuerst müssen Sie das Okteto Helm-Repository zu Ihrem Helm-Client hinzufügen.
helm repo add okteto https://charts.okteto.com
Nachdem Sie das Okteto Helm-Repository hinzugefügt haben, sollten Sie Ihre Helm-Repositories aktualisieren, um sicherzustellen, dass Sie die neuesten Informationen über verfügbare Charts haben:
helm repo update
Als Nächstes erstellen Sie eine config.yaml für Okteto.
nano config.yaml
Fügen Sie Ihren Okteto-Lizenzschlüssel, die Subdomain und andere Konfigurationen wie unten gezeigt hinzu:
license: INSERTYOURKEYHERE
subdomain: okteto.example.com
buildkit:
persistence:
enabled: true
registry:
storage:
filesystem:
persistence:
enabled: true
Hinweis: Ersetzen Sie den Lizenzschlüssel durch Ihren gültigen Okteto-Lizenzschlüssel und okteto.example.com durch Ihren Domainnamen.
Installieren Sie jetzt die neueste Version von Okteto mit der config.yaml Konfigurationsdatei.
helm install okteto okteto/okteto -f config.yaml --namespace okteto --create-namespace
Sobald das Okteto installiert ist, erhalten Sie die folgende Ausgabe.
NAME: okteto
LAST DEPLOYED: Tue Mar 12 20:27:21 2024
NAMESPACE: okteto
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Congratulations! Okteto is successfully installed!
Follow these steps to complete your domain configuration:
1. Create a wildcard A record "*.okteto.example.com", pointing it to the Okteto NGINX ingress controller External-IP:
$ kubectl get service -l=app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/component=controller --namespace=okteto
2. Access your Okteto instance at `https://okteto.okteto.example.com/login#token=88f8cc11`
Hinweis: Merken Sie sich die persönlichen Zugriffstokens 88f8cc11 aus dem obigen Ergebnis. Sie benötigen es, um sich bei Okteto zu authentifizieren.
Warten Sie einige Zeit und holen Sie dann die IP-Adresse ab, die DigitalOcean dynamisch dem NGINX Ingress zugewiesen hat, den Sie gerade installiert und konfiguriert haben, als Teil von Okteto:
kubectl get service -l=app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/component=controller --namespace=okteto
Sie werden die folgende Ausgabe sehen.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
okteto-ingress-nginx-controller LoadBalancer 10.101.31.239 45.76.14.191 80:31150/TCP,443:31793/TCP 3m21s
Sie müssen die EXTERNAL-IP-Adresse nehmen und sie zu Ihrem DNS für die Domain hinzufügen, die Sie verwenden möchten. Dies geschieht, indem Sie einen A-Eintrag mit dem Namen * erstellen.
Öffnen Sie jetzt Ihren Webbrowser und greifen Sie auf Ihre Okteto-Instanz unter https://okteto.okteto.example.com/login#token=88f8cc11 zu.
Schritt 6 - Installieren und Konfigurieren der Okteto-CLI
Das Okteto-CLI ist ein Open-Source-Befehlszeilenwerkzeug, mit dem Sie Ihre Anwendungen direkt auf Kubernetes entwickeln können.
Sie können die Okteto CLI unter Linux und macOS mit curl installieren. Öffnen Sie Ihr Terminal und führen Sie den folgenden Befehl aus:
sudo curl https://get.okteto.com -sSfL | sh
Sobald die Installation abgeschlossen ist, können Sie überprüfen, ob das Okteto-CLI korrekt installiert ist, indem Sie den folgenden Befehl ausführen:
okteto version
Dieser Befehl zeigt die Version der auf Ihrem System installierten Okteto-CLI an.
okteto version 2.25.2
Als Nächstes müssen Sie Ihre persönlichen Zugriffstoken verwenden, um sich mit der Okteto-CLI zu authentifizieren.
okteto context use https://okteto.okteto.example.com --token 88f8cc11 --insecure-skip-tls-verify
Seine Ausgabe wird sein:
✓ Using okteto-admin @ okteto.okteto.example.com
Führen Sie als Nächstes den folgenden Befehl aus, um zu überprüfen, ob Ihr Okteto-CLI konfiguriert ist.
okteto context list
Das gibt folgende Ausgabe:
Name Namespace Builder Registry
https://okteto.okteto.example.com * okteto-admin tcp://buildkit.okteto.example.com:443 registry.okteto.example.com
vke-4b7aaaa6-78fa-4a19-9fb3-cf7b8c1ec678 default docker -
Schritt 7 - Erstellen Sie Ihr Okteto-Manifest
Um mit der Entwicklung der Python-Anwendung zu beginnen, müssen Sie eine Okteto-Manifestdatei erstellen und die Konfiguration für Ihre Entwicklungsumgebung festlegen.
Lass uns eine okteto.yaml Datei für eine einfache Python-Anwendung erstellen.
nano okteto.yaml
Fügen Sie die folgende Konfiguration hinzu.
deploy:
- kubectl apply -f k8s.yaml
dev:
my-app:
command: bash
environment:
- FLASK_ENV=development
sync:
- .:/app
reverse:
- 9000:9000
volumes:
- /root/.cache/pip
In der obigen Datei,
deploy: Dieser Abschnitt definiert die Bereitstellungskonfiguration. Wenn Sieokteto upoderokteto deployausführen, führt Okteto den Befehlkubectl apply -f k8s.yamlaus, um die in der Dateik8s.yamldefinierten Kubernetes-Ressourcen bereitzustellen. Dies ermöglicht es Ihnen, Ihre Bereitstellungskonfiguration getrennt von Ihrer Entwicklungsumgebungskonfiguration festzulegen.command: bash: Gibt den Befehl an, der ausgeführt werden soll, wenn die Entwicklungsumgebung startet.- Umgebung: Legt Umgebungsvariablen fest, die in der Entwicklungsumgebung gesetzt werden sollen. In diesem Fall wird FLASK_ENV auf Entwicklung gesetzt.
sync: Gibt die Ordner an, die zwischen Ihrem lokalen Computer und der Entwicklungsumgebung synchronisiert werden sollen. Es synchronisiert das aktuelle Verzeichnis(.)mit/appinnerhalb der Entwicklungsumgebung.- reverse: Legt Portweiterleitungsregeln fest, um Ports von der Entwicklungsumgebung auf Ihren lokalen Computer weiterzuleiten. In diesem Fall leitet es Port 9000 von der Entwicklungsumgebung auf Port 9000 auf Ihrem lokalen Computer weiter.
volumes: Gibt zusätzliche Volumes an, die in die Entwicklungsumgebung eingebunden werden sollen. In diesem Fall wird das Verzeichnis/root/.cache/pip, das möglicherweise verwendet wird, um pip-Pakete zwischenzuspeichern, in die Entwicklungsumgebung eingebunden.
Jetzt deployen Sie Ihre Python-Anwendung mit dem folgenden Befehl in den Kubernetes-Cluster.
okteto deploy
Nach erfolgreicher Bereitstellung sehen Sie die folgende Ausgabe.
deployment.apps/my-app created
service/my-app created
ingress.networking.k8s.io/my-app created
i There are no available endpoints for 'Okteto'.
Follow this link to know more about how to create public endpoints for your application:
https://www.okteto.com/docs/cloud/ssl/
✓ Development environment 'Okteto' successfully deployed
i Run 'okteto up' to activate your development container
Als nächstes gehen Sie zurück zu Ihrem Webbrowser und aktualisieren das Okteto-Dashboard. Sie werden Ihre bereitgestellte Anwendung sehen:
Sie können auch auf Ihre Python-Anwendung über die URL https://my-app-okteto-admin.okteto.example.com zugreifen.
Schritt 8 - Entwickeln Sie die Python-Anwendung direkt auf Kubernetes
In diesem Abschnitt verwenden Sie den Befehl okteto up, um eine Python-Anwendung direkt auf Kubernetes bereitzustellen. Dieser Befehl synchronisiert Ihren lokalen Code mit der Entwicklungsumgebung. Sie können den Code mit Ihrer bevorzugten IDE oder Textbearbeitungsprogramm auf Ihrem lokalen Computer ändern, und die Änderungen werden automatisch mit der Entwicklungsumgebung in Kubernetes synchronisiert.
Lass uns die Entwicklungsumgebung mit Okteto starten:
okteto up
Dieser Befehl erstellt eine Entwicklungsumgebung basierend auf den in der okteto.yaml Datei angegebenen Konfigurationen.
i Using okteto-admin @ okteto.okteto.example.com as context
i 'Okteto' was already deployed. To redeploy run 'okteto deploy' or 'okteto up --deploy'
i Build section is not defined in your okteto manifest
✓ Persistent volume successfully attached
✓ Images successfully pulled
✓ Files synchronized
Context: okteto.okteto.example.com
Namespace: okteto-admin
Name: my-app
Reverse: 9000 <- 9000
root@my-app-okteto-7767588c8d-ndzj7:/app#
Als nächstes führen Sie Ihre Python-Anwendung aus:
python3 app.py
Sie werden die folgende Ausgabe sehen.
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://10.244.97.92:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 126-620-675
Bearbeiten Sie jetzt Ihre app.py Anwendungsdatei:
nano app.py
Ändern Sie die folgende Zeile:
return "Hello, This is a simple Python App Deployed on Kubernetes"
Speichern Sie die Datei und schließen Sie sie. Okteto wird die Codeänderungen automatisch erkennen und sie sofort auf Kubernetes anwenden.
Gehen Sie zurück zu Ihrem Webbrowser und laden Sie die Seite für Ihre Python-Anwendung neu. Sie werden Ihre modifizierte Anwendung auf dem folgenden Bildschirm sehen.
Schlussfolgerung
In diesem Tutorial haben Sie eine grundlegende Python-Anwendung erstellt und sie im Kubernetes-Cluster mit Okteto bereitgestellt. Die Fähigkeit von Okteto, lokale Codeänderungen in Echtzeit mit der Entwicklungsumgebung zu synchronisieren, ermöglicht schnelle Entwicklungsiterationen und sofortiges Feedback zu Codeänderungen. Insgesamt befähigt Okteto Entwickler dazu, sich auf den Bau hochwertiger Python-Anwendungen zu konzentrieren, ohne sich um die Komplexität der Kubernetes-Infrastruktur kümmern zu müssen.
Der Autor wählte die FreeBSD Foundation, um eine Spende im Rahmen des Write for DOnations-Programms zu erhalten.




