Teil III Minimal Python Api mit HttpsRoute

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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen
WordPress Cookie Hinweis von Real Cookie Banner