Bei container‑basierten Themen braucht man oft eine „einfache“ API, die man zum Testen des gerade aufgesetzten Setups verwenden kann. Zu Beginn genügt häufig ein „hello‑world“-Container oder eine simple „echo“-App. Später benötigt man jedoch schnell mehr Flexibilität bzw. weitere Zugriffsmöglichkeiten.
Hier kommt Python Flask ins Spiel. Mit dieser Bibliothek kann man extrem schnell Web‑APIs erstellen, mit verhältnismäßig geringem Aufwand containerisieren und deployen. Im ersten Teil dieses Blogs erstellen wir eine einfache Web‑API und erstellen ein Containerimage. Der zweite und dritte Teil beschäftigen sich dann mit Kubernetes und der Gateway-API basierend auf Traefik für diese API.
Durch die Verwendung von Python habe ich die Möglichkeit, Tests auf der zu erstellenden Infrastruktur beliebig auszubauen.
Der folgende Python‑Code app.py stellt unsere API dar: (basiert zum Teil auf https://medium.com/@MetricFire/develop-and-deploy-a-python-api-with-kubernetes-and-docker-part-ii-a31d9c61817) :
import requests
import os
from flask import Flask
app = Flask(__name__)
API_KEY = os.environ['API_KEY']
@app.route('/'
def index() -> str:
return 'App Works!'
@app.route('/<string:city>/<string:country>')
def weather_by_city(country, city):
url = 'https://api.openweathermap.org/data/2.5/weather'
params = dict(
q=city + "," + country,
appid= API_KEY,
)
response = requests.get(url=url, params=params)
data = response.json()
return data
if __name__ == '__main__':
app.run(host="0.0.0.0", port=5000)
dazu noch der „Pipfile“
[requires] [packages] flask = '*' requests = '*' [dev-packages] pytest = '*' pytest-dotenv = '*'
und wir können mit folgendem Code „test_app.py“ auch testen
import pytest
from app import app
@pytest.fixture
def client():
app.config.update({"TESTING": True})
with app.test_client() as client:
yield client
def test_index(client):
response = client.get("/")
assert response.status_code == 200
assert b"App Works!" in response.data
def test_weater_by_city(client):
response = client.get("/London/uk")
assert response.status_code == 200
assert response.json["name"] == "London"
Wir containerisieren mit folgendem „Dockerfile“ bzw. „Containerfile“ und starten unseren Container auf der Commandline. Der API-Key wird gespeichert in der „.env“ Datei und später beim Start des Containers gezogen.
FROM python:3.10-alpine EXPOSE 5000 RUN pip install pipenv ADD Pipfile . ADD Pipfile.lock . RUN pipenv install --system --deploy --ignore-pipfile RUN mkdir -p /app ADD app.py /app WORKDIR /app CMD ["python", "app.py"]
$ podman build -t registry.consol.de/bierenfeld/weather-api . $ podman run -dit --rm -p 5000:5000 --name weather --env-file .env \ registry.consol.de/bierenfeld/weather-api
Im zweiten BLOG-Beitrag werden wir das Deployment um ein Kubernetes Manifest erweitern und im dritten Teil mit Hilfe der GatewayAPI eine HttpRoute mit „self signed“ Zertifikat vorschalten.


