Von Tobias Mückl auf Donnerstag, 04. Juli 2024
Kategorie: Cloud Services

Container Builds meistern mit Kaniko

Container-Technologien wie Docker haben die Softwareentwicklung revolutioniert, indem sie die Bereitstellung und Verwaltung von Anwendungen erheblich vereinfacht und beschleunigt haben. Sie ermöglichen es Entwickler:innen, Anwendungen in isolierten Umgebungen zu erstellen, zu testen und zu deployen, was zu einer höheren Konsistenz, Skalierbarkeit und Effizienz führt. Eine zentrale Herausforderung bei der Arbeit mit Containern ist jedoch die Erstellung der Container Images. Hier kommt Kaniko ins Spiel.

Was ist Kaniko?

Kaniko ist ein von Google entwickeltes Open-Source-Tool, das es ermöglicht, Docker-Container-Images in einer Container-Umgebung zu bauen, ohne auf einen Docker-Daemon angewiesen zu sein. Das bedeutet, dass Images direkt in der Cloud, auf einem CI-Server oder sogar in einem Kubernetes-Cluster erstellt werden können, ohne auf eine eigene Docker-Build-Infrastruktur zurückgreifen zu müssen.

Der Vorteil von Kaniko gegenüber traditionellen Methoden ist, dass es sicherer ist, da es den Bedarf an privilegierten Rechten eliminiert, die normalerweise notwendig sind, um Docker-Images in einer CI/CD-Pipeline zu bauen. Stattdessen führt Kaniko Builds in einem Standard-Container durch und verwendet ein eigenes Programm (Kaniko Executor), um das Image zu erstellen, das nicht auf dem Docker-Daemon basiert.

Kaniko in einer CI/CD-Pipeline

Kaniko ist besonders nützlich, wenn es in eine Continuous Integration und Continuous Deployment (CI/CD) Pipeline integriert wird. Hier können Sie automatisierte Workflows einrichten, um Ihre Container-Images zu bauen und zu deployen, sobald Änderungen am Code vorgenommen werden.

Ein typischer CI/CD-Workflow mit Kaniko könnte folgendermaßen aussehen:

  1. Code-Änderungen pushen: Entwickler:innen pushen Änderungen am Code oder das Dockerfile in ein Git Repository.
  2. CI/CD-Pipeline triggern: Der Push löst den Start der Pipeline aus.
  3. Kaniko-Build-Job starten: Als Teil der Pipeline startet ein Kaniko-Build-Job, der das Container-Image erstellt.
  4. Image-Bereitstellung: Nachdem das Image erfolgreich gebaut wurde, wird es in eine Container Registry gepusht und kann verwendet werden.

Beispielhafte Umsetzung

Die untenstehende Abbildung zeigt eine beispielhafte Implementierung in einem produktiven Kontext. Die Anwendung wird in einem GitHub Repository abgelegt. Dort kann ein GitHub Actions Workflow gestartet werden (manuell oder automatisch bei jedem Push), der einen sogenannten Reusable-Workflow mit den jeweiligen Parametern (Anwendungs-Name, Ziel-Registry, etc.) startet. Dieser Workflow dient als „Blaupause“ und beinhaltet die Build-Pipeline an sich. Ausgeführt wird die Pipeline vom GitHub Actions Runner, der im Kubernetes-Cluster arbeitet.

In der Pipeline werden die folgenden Schritte durchlaufen. Zunächst wird das Repository mit der Anwendung geklont und die übergebenen Parameter werden verarbeitet. Dann fragt die Pipeline den Status der Ziel-Registry (in diesem Fall AWS Elastic Container Registry [ECR]) ab. Dadurch kann sichergestellt werden, dass die Registry und das Repository darin existieren, andernfalls wird ein Repository angelegt.

Als Nächstes wird der Kaniko Executor auf Basis des offiziellen Kaniko Images als Kubernetes Job gestartet. Dieser baut das Container-Image der Anwendung und pusht dieses anschließend in das angegebene AWS ECR Repository.

Abschließend werden die Logs des Kaniko Jobs im GitHub Actions Workflow ausgegeben und der Job vom Cluster gelöscht. 

Fazit

Kaniko bietet die Möglichkeit, die Generierung von Container Images sichererer und effizienter zu gestalten. Die Abhängigkeit des Build-Prozesses zum Docker-Daemon wird eliminiert und die Integration in CI/CD-Pipelines vereinfacht.  

Seminarempfehlungen

Kommentare hinterlassen