Teil II https://blog.consol.de/it-consulting-solutions/k8s/teil-ii-minimal-python-api-deploy-to-k8s/ endete mit einer HttpRoute welche mit curl http://<DNS-NAME>/weather-api/London/uk abgerufen werden kann. In diesem dritten und abschließenden Teil wird das Deployment um eine HttpsRoute erweitert, welche ein durch cert-manager verwaltetes TLS-Zertifikat verwendet
cert-manager nach folgender Anleitung installieren : https://cert-manager.io/docs/installation/kubectl/
Um ein selbst signiertes Zertifikat anlegen zu können brauchen wir eine ROOT-CA dies erfolgt mit root-ca-setup.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: root-ca
namespace: cert-manager
spec:
isCA: true
commonName: Development Root CA
secretName: root-ca-secret
privateKey:
algorithm: ECDSA
size: 256
duration: 87600h # 10 years
issuerRef:
name: selfsigned-issuer
kind: ClusterIssuer
---
# Then create a CA issuer using the root CA
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: dev-ca-issuer
spec:
ca:
secretName: root-ca-secret
Um es verwenden zu können muss dieses CA-Zertifikat in die Liste der erlaubten CAs auf dem Host eingetragen werden.
# macOS
$ kubectl get secret root-ca-secret -n cert-manager -o jsonpath='{.data.tls\.crt}' | base64 -d > dev-ca.crt
$ sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain dev-ca.crt
# Linux (Ubuntu/Debian)
$ kubectl get secret root-ca-secret -n cert-manager -o jsonpath='{.data.tls\.crt}' | base64 -d > dev-ca.crt
$ sudo cp dev-ca.crt /usr/local/share/ca-certificates/
$ sudo update-ca-certificates
Der Issuer dev-ca-issuer kann mit service.example.local-certificate.yaml verwendet werden um das TLS-Zertifikat servcice-tls-secret anzulegen
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: service-tls
namespace: default
spec:
secretName: service-tls-secret
duration: 2160h
renewBefore: 720h
isCA: false
privateKey:
algorithm: RSA
size: 2048
usages:
- server auth
- client auth
dnsNames:
- service.example.local
issuerRef:
name: dev-ca-issuer
kind: ClusterIssuer
Man kann service-tls-secret verwenden um ein zusätzliches Https-Gateway für den DNS-Namen service.example.local für unsere API anzulegen. Hierzu dient weather-gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: weather-gateway
spec:
gatewayClassName: traefik
listeners:
- name: websecure
port: 8443
protocol: HTTPS
hostname: service.example.local
tls:
certificateRefs:
- name: service-tls-secret
Mit service.example.local.yaml kann letztendlich eine HttpRoute für unsere Weather-API definiert werden.
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: weather-https-route
namespace: default
spec:
parentRefs:
# Attach to the gateway
- name: weather-gateway
hostnames:
- service.example.local
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: weather-api-service
port: 5000
In dem Cluster sind folgende Routen vorhanden bzw. man kann testen mit
$ kubectl get httproutes
NAME HOSTNAMES AGE
weather-api-httproute 6d2h
weather-https-route ["service.example.local"] 24h
$ curl https://service.example.local/London/Uk
{"base":"stations","clouds":{"all":100},"cod":200,"coord":{"lat":51.5085,"lon":-0.1257},"dt":1773330655,"id":2643743,"main":......
Mit diesem Setup kann man mit Python relativ leicht Endpunkte implementieren um die Funktionalität des zu erstellenden Setups (Datenbank-Connectivität, Storage, etc. pp) zu prüfen


