Kubernetes

Veraltete API-Versionen von Kubernetes finden

Jeder DevOps-Engineer oder Cluster-Administrator der schon YAML-Manifests für Kubernetes geschrieben hat, kennt dieses Problem: Welche API-Version kann genutzt werden? Werden in bestehenden YAML-Dateien veraltete Versionen genutzt oder benutzt man irgendwo ein Feld, welches nicht mehr lange unterstützt wird?

Für alle die weniger erfahren mit Kubernetes sind, hier ein Beispiel zur Verdeutlichung, anhand einer Deployment-Definition:

apiVersion: extensions/v1beta1
kind: Deployment
...

Die Version gibt an, welche exakte Spezifikation für ein Objekt (Kind) angewandt werden soll und folglich, welche Parameter und Einstellungen definiert werden können. Diese Spezifikationen erhalten mit Kubernetes-Updates immer wieder Anpassungen und die Version ändert sich. Es ist daher wichtig, frühzeitig alte Verwendungen zu finden und zu aktualisieren. Für das Objekt "Deployment" waren in der Vergangenheit z.B. folgende Versionen möglich. In Klammern steht der Kubernetes-Versionsbereich in dem diese Version gültig war.

extensions/v1beta1 (Bis 1.16)
apps/v1beta1 (Bis 1.16)
apps/v1beta2 (Bis 1.16)
apps/v1 (Seit 1.9)

Spätestens mit dem Update auf Kubernetes 1.16 mussten also alle Deployment-Definitionen auf apps/v1 umgeschrieben sein. In der Realität eines Kubernetes-Clusters gibt es hunderter solcher YAML-Dateien. Weit verbreitet ist an dieser Stelle auch das Tool "Helm", eine Art Paketverwaltung für Kubernetes, welche es ermöglicht wiederverwendbare YAML-Definitionen aus dem Internet zu nutzen. Eine Automatisierung zum Auffinden solcher veralteten Versionen ist also notwendig.

An dieser Stelle kommt das Tool K8sPolicy ins Spiel. Das Kommandozeilen-Programm ermöglicht es, anhand einer Konfiguration alle verwendeten oder relevanten YAML-Dateien zu finden und zu validieren. Mit einbezogen werden hier explizit auch alle Dateien die durch Helm-Pakete sogenannte "Helm-Charts" definiert werden.

Wird bei einem Durchlauf des Programms eine alte Version gefunden, so wird dies in der Konsolenausgabe angezeigt:

FAIL - my-deployment.yaml - Deployment/my-deployment: API extensions/v1beta1 for Deployment has been deprecated, use apps/v1 instead.

Manuelles Durchsuchen der Dateien kann somit entfallen. K8sPolicy bringt ebenfalls ein Docker-Image mit und lässt sich so leicht in einen automatisierten Buildprozess integrieren. Die Aktualität der verwendeten YAML-Definitionen wird auf diesem Weg fortlaufend automatisch überprüft und etwaiger Handlungsbedarf wird frühzeitig erkannt.