In dem letzten Beitrag https://blog.consol.de/software-engineering/devops/teil-i-eines-minimal-python-testusecases-fuer-container-basierte-setups/ habe ich eine minimale Python‑API mit Flask erstellt und als Container deployed. In diesem Teil gehen wir weiter und erstellen ein K8s‑Manifest mit der GatewayAPI basiert auf Traefik‑Ingress, um unsere API nach außen verfügbar zu machen.
Zuletzt haben wir diesen „Dockerfile“ erstellt:
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"]
Um das daraus resultierende Image auf Kubernetes zu deployen, wird es in eine verfügbare Registry gepusht und mit dem folgenden Manifest deployment.yaml als Deployment + HttpRoute bereitgestellt.
apiVersion: apps/v1
kind: Deployment
metadata:
name: weather-api-deployment
spec:
replicas: 1
selector:
matchLabels:
app: weather-api
template:
metadata:
labels:
app: weather-api
spec:
containers:
- name: weather-api-container
image: <REGISTRY-URL>/weather-api:latest
ports:
- containerPort: 5000
env:
- name: API_KEY
value: "a9289XXXXXXXXXXXXXXXXXXXXXXXXX268"
imagePullSecrets:
- name: gitlab-auth
---
apiVersion: v1
kind: Service
metadata:
name: weather-api-service
labels:
app: weather-api
spec:
ports:
- port: 5000
targetPort: 5000
type: LoadBalancer
selector:
app: weather-api
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: weather-api-httproute
spec:
parentRefs:
- name: traefik-gateway
namespace: kube-system
rules:
- matches:
- path:
type: PathPrefix
value: /weather-api
filters:
- type: URLRewrite
urlRewrite:
path:
type: ReplacePrefixMatch
replacePrefixMatch: /
backendRefs:
- name: weather-api-service
port: 5000
Das Secret gitlab‑auth zum Pull aus der Registry wurde zuvor für die GitLab‑Registry im Source‑Projekt angelegt und per nachfolgendem Befehl in Kubernetes bekannt gemacht.
kubectl create secret docker-registry gitlab-auth \
--docker-server=https://<DNS-Name-of-your-registry> \
--docker-username=kubernetes \
--docker-password=<password aus dem token> \
--docker-email=<your fine email adress>
Jetzt kann per curl http://<DNS-NAME>/weather-api/London/uk zugegriffen werden. Im dritten und letzten Teils dieses Blogs erweitern wir die HttpRoute um eigene Zertifikate für den Https-Zugriff.


