Mit unserem Blogpost wollen wir einen Überblick über die drei großen Cloudanbieter geben und darauf eingehen, wie mit einfachsten Mitteln ein Kubernetes Cluster in der jeweiligen Cloud mit Terraform erstellt werden kann. Bevor der Beitrag auf die einzelnen Terraformbeispiele eingeht, beleuchten wir zunächste Kubernetes, Terraform und geben einen Überblick über die 3 großen Hyperscaler Amazon Web Services (AWS), Azure und Google Cloud.

Was sind Container und wofür benötigt man Kubernetes in der Cloud?

Ein Container ist eine Art von Virtualisierung, bei der eine Anwendung in einem abgeschotteten Bereich ausgeführt wird, der von der Host-Umgebung isoliert ist. Dies ermöglicht es, die Anwendung in einer vorhersehbaren und reproduzierbaren Umgebung auszuführen, die von der Hardware- und Betriebssystemumgebung des Hosts unabhängig ist.

Die Verwendung von Containern ermöglicht es, Anwendungen schnell und einfach bereitzustellen und zu skalieren. Da Containers leicht zu transportieren sind, können sie auf verschiedenen Hosts ausgeführt werden, was die Flexibilität und Skalierbarkeit von Anwendungen erhöht.

Kubernetes ist ein von Google entwickeltes Open-Source-System zur Verwaltung von ebendiesen Container-Anwendungen und hat sich zum de-facto Standard entwickelt. Als Container-Verwaltungstool weist Kubernetes einen hohen Abstraktionsgrad auf und kann für die Ausführung vieler verschiedener Softwaretypen verwendet werden. Dadurch ist es möglich, alle Arten von Software im selben Cluster oder auf mehreren Clustern auszuführen.

Jeder Kubernetes Cluster besteht aus einer Steuerungsebene (Master-Nodes), die für die Durchführung von Verwaltungsaufgaben im Cluster zuständig ist. Dazu gehören Aufgaben wie die Verwaltung von Aufträgen, die Planung von Containern und alle anderen Aufgaben, die auf den Worker-Nodes ausgeführt werden sollen. Die angeschlossenen Worker-Node-Server sind für die Ausführung dieser Aufgaben zuständig. Auf den Worker-Nodes werden somit die Container ausgeführt.

Kubernetes-Cluster können hochverfügbar sein, wenn die Aufgaben der Master und Workernodes auf mehrere Server verteilt werden.

Was ist Terraform?

Terraform ist ein Open-Source-Tool, das von HashiCorp entwickelt wurde. Mit der HashiCorp-Konfigurationssprache (HCL) lässt sich die gewünschte Cloud Infrastruktur über eine Zielbeschreibung erstellen, ändern und löschen. Über verschiedene Provider, also Schnittstellenanbindungen, kann Terraform nahezu jede Infrastruktur verwalten. Dies Unterscheidet Terraform im Cloudumfeld maßgeblich von proprietären Lösungen wie AWS CDK, dem Deployment Manager von Google oder den Azure Blueprints. Angefangen von physischen Geräten über virtuelle Maschinen und Containern bis hin zur Softwarekonfiguration kann über Terraform alles beschrieben werden. Unter https://registry.terraform.io/browse/providers sind die offiziellen Provider, sowie die der Partner aufgelistet. Neben den in diesem Beitrag verwendeten Provider existieren zum Beispiel auch Provider für die Alibaba, IBM oder Oracle Cloud.

Mit Terraform erstellen die Benutzer eine deklarative Beschreibung der gewünschten Infrastruktur. Diese Beschreibung wird dann verwendet, um Änderungen oder Upgrades für diese Infrastruktur zu erstellen. Terraform berechnet die Differenz zwischen aktueller und gewünschter Infrastruktur und führt die notwendigen Änderungen aus. Der Prozess lässt sich beispielsweise vollständig über github actions als Pipeline ausführen und die Beschreibung der HCL-Files über git versionieren.

Mit Terraform kann somit nicht nur das Kubernetes Cluster in der gewünschten Cloud aufgebaut werden, sondern auch die Konfiguration vorgenommen werden. Selbst für den Kubernetes Paketmanager Helm existiert ein passender Terraform Provider, der die entsprechenden Kubernetes Deployments direkt auf dem Cluster ausführt. Ein Beispiel wäre zum Beispiel der Cert-Manager für SSL Zertifkate bei externen APIs oder auch external-dns zur Automatisierung von DNS Infrastruktur anhand von Deployment Annotations.

Hyperscaler – AWS, Google Cloud und Azure.

AWS (Amazon Web Services), Google Cloud und Azure sind Sammlungen von Cloud-Computing-Diensten, die von Amazon, Google und Microsoft angeboten werden. Alle drei Dienste bieten Skalierbarkeit, Zuverlässigkeit und Flexibilität für Unternehmen, die ihre IT-Infrastruktur in der Cloud betreiben möchten. Sie unterstützen unterschiedliche Programmiersprachen, Datenbanken und Betriebssysteme und bieten eine Vielzahl von Tools und Diensten für verschiedene Anwendungsbereiche.

Die genauen Vor- und Nachteile hängen jedoch davon ab, welche spezifischen Anforderungen und Ziele ein Unternehmen hat. Ein Vorteil von Google Cloud ist beispielsweise, dass es eng mit anderen Google-Diensten wie beispielsweise G-Suite oder Google Analytics integriert ist und dass die Kubernetes Integration am Fortgeschrittensten ist. Ein Nachteil ist, dass es einerseits deutlich weniger verbreitet als die anderen beiden Dienste ist und dass Google in Summe insgesamt weniger Dienste zur Verfügung stellt. Die angebotenen Dienste harmonieren allerdings sehr gut miteinander. Ein Vorteil von AWS ist, dass es seit langer Zeit am Markt ist und daher eine große Anzahl an integrierten Tools und Diensten anbietet. Ein Nachteil ist, dass es im Vergleich zu den anderen Diensten deutlich komplexer und schwieriger zu nutzen ist und dass die Tools in Summe nicht so gut zusammen harmonieren. Der vermutlich größte Vorteil von Azure ist, dass es gut für Unternehmen geeignet ist, die Microsoft-Technologien wie beispielsweise Azure AD nutzen. Ein Nachteil aus unserer Erfahrung ist, dass Azure in Summe die höchsten Betriebskosten aufweist, auch wenn es auf den ersten Blick im Kalkulator günstiger scheint.

Es ist wichtig, dass Unternehmen die spezifischen Anforderungen und Ziele berücksichtigen und einen Cloud-Dienst auswählen, der ihren Bedürfnissen am besten entspricht. Es empfiehlt sich, die verschiedenen Dienste zu vergleichen und gegebenenfalls eine kostenlose Testversion zu nutzen, bevor man sich für einen bestimmten Dienst entscheidet. Auch die Expertise der innFactory kann Ihnen bei der Entscheidung des richtigen Cloudanbieters helfen.

Google Cloud GKE Cluster mit Terraform erstellen.

Um mit Terraform ein Kubernetes-Cluster in der Google Cloud zu erstellen, müssen Sie zunächst Terraform auf Ihrem Computer installieren und die Google Cloud-Plattform-Authentifizierungskonfiguration einrichten. Danach können Sie ein Terraform-Skript erstellen, in dem Sie die gewünschten Einstellungen für Ihr Kubernetes-Cluster festlegen, beispielsweise die Anzahl der Kubernetes-Node und die verwendete Machine-Type. Sobald das Skript erstellt ist, können Sie Terraform mit dem Befehl terraform apply ausführen, um das Cluster zu erstellen.

Nachfolgend ein Beispiel für ein Terraform-Skript, das ein GKE Kubernetes-Cluster in der Google Cloud erstellt:

provider "google" {
  credentials = "${file("account.json")}"
  project     = "innFactory-demo-projekt"
  region      = "europe-west3"
}

resource "google_container_cluster" "cluster" {
  # Name und Region des Clusters (Frankfurt)
  name     = "gke-innfactory-cluster"
  location = "europe-west3"

  # Falls Sie die Worker Server selbst managen möchten. (Alternativ: GKE Autopilot)
  node_pool {
    name       = "default"
    machine_type = "n1-standard-1"
    initial_node_count = 3
  }
}

Um das Skript auszuführen, speichern Sie es als main.tf und führen Sie den Befehl terraform apply im selben Verzeichnis aus. Terraform wird dann die Einstellungen im Skript ausführen und das Kubernetes-Cluster in der Google Cloud erstellen. Weitere Informationen finden Sie in der Dokumentation von Terraform und in der Dokumentation von Google Cloud.

Da es sich bei dem Beispiel um ein sehr einfaches Cluster handelt, sollten Sie überlegen, ob Sie nicht fertige Module für ihr Cluster verwenden. Google Cloud und Hashicorp veröffentlichen auf Github unter https://github.com/terraform-google-modules fertige Module, die eine deutlich ausgereifte Konfiguration des Clusters ermöglichen. Unter https://github.com/terraform-google-modules/terraform-google-kubernetes-engine/tree/master/examples finden Sie einige Beispiele für verschiedenste Cluster. Sei es mit der Besonderheit, dass das Cluster im Autopilot Modus selbst Sorge für die Worker-Nodes trägt, aber auch Beispiele für abgesicherte private Cluster die nicht über das Internet gemanged werden können.

Google bietet mit GKE mit Abstand die meisten Möglichkeiten und Addons, die „out of the Box“ in die Google Cloud Infrastruktur integriert ist ohne das zusätzliche Deployments auf das Cluster geladen werden müssen. Funktionen wie der Autopilot, SSL-Zertifikate ohne zusätzlichen Cert-Manager, Loganalyse oder auch die Cluster Security Checks sind anders wir bei AWS und Azure direkt integriert.

AWS EKS Cluster mit Terraform erstellen.

Ein Beispiel für ein Terraform-Skript, das ein Kubernetes-Cluster (EKS) in AWS erstellt, könnte wie folgt aussehen:

# Konfigurieren des AWS-Providers
provider "aws" {
  # Ihre AWS-Zugangsdaten und Regionenkonfiguration
}

# Konfigurieren des Kubernetes-Moduls (EKS)
module "innFactory_eks_example" {
  source = "terraform-aws-modules/eks/aws"

  # Name und Region des Kubernetes-Clusters (Frankfurt)
  cluster_name = "my-eks-cluster"
  region       = "eu-central-1"

  # Anzahl der Worker-Knoten und deren Typ
  worker_groups = [
    {
      instance_type = "t3.medium"
      asg_max_size  = 2
    }
  ]

  # Zugriffsverhalten für das Kubernetes-API
  vpc_id     = "vpc-abc12"
  public_subnets = ["subnet-abc12", "subnet-def34", "subnet-def56"]]

}

Dieses Skript definiert zunächst den AWS-Provider und konfiguriert ihn mit den Zugangsdaten und Regionen-Einstellungen für Ihren AWS-Account. Anschließend wird das Kubernetes-Modul konfiguriert und die Einstellungen für den Cluster festgelegt, wie z.B. der Name, die Region, die Anzahl der Worker-Knoten und das Zugriffsverhalten.

Um das Skript auszuführen und das Cluster zu erstellen, müssen Sie Terraform wieder den Befehl apply ausführen lassen. Beachten Sie, dass dies nur ein Beispiel ist und je nach Ihren Anforderungen weitere Konfigurationen und Optionen erforderlich sein können. Weitere Informationen finden Sie in der Terraform-Dokumentation und im Kubernetes-Modul unter https://github.com/terraform-aws-modules/terraform-aws-eks/tree/master/examples/complete.

Azure AKS Cluster mit Terraform erstellen

Wie auch Amazon und Google bietet Microsoft in Azure ein weitgehend gemangetes Kubernetes Produkt an. Azure Kubernetes Service (AKS) ist die verwaltete Kubernetes-Plattform von Microsoft Azure. Auch AKS erleichtert die Bereitstellung und Verwaltung von Anwendungen in Kubernetes-Containern und ermöglicht es Unternehmen, sich auf die Entwicklung von Anwendungen und nicht auf die Verwaltung von Clustern zu konzentrieren.

AKS bietet auch integrierte Tools und Dienste wie Azure Monitor und Azure Log Analytics, um die Leistung und Verfügbarkeit von Kubernetes-Clustern zu überwachen und zu optimieren. Es ist möglich, AKS mit anderen Azure-Diensten wie Azure Active Directory (Azure AD) und Azure Virtual Network zu integrieren, um eine sichere und skalierbare Kubernetes-Umgebung zu erstellen. AKS wird häufig in Verbindung mit Terraform erstellt.

Vom Funktionsumfang positioniert sich Azure AKS zwischen Google GKE, mit den meisten vordefinierten Möglichkeiten/Addons und AWS EKS mit den in unseren Augen am wenigsten vordefinierten Plugins und Diensten.

# Azure Provider konfigurieren
provider "azuread" { 
  # Ihre  Azure Cloud Zugangsdaten

  tenant_id = "" 
  client_id = ""
  client_secret = "" 
}

# Azure AD, falls RBAC via Azure AD abgebildet warden soll und eine existierende Rolle zugewiesen warden soll
provider "azuread" {
  tenant_id = ""
}

data "azuread_group" "aks_admin" {
  display_name = "AKS Admins"
}

# AKS Cluster erstellen

resource "azurerm_kubernetes_cluster" "innFactory_aks_example" {

  name                      = "my-aks-cluster"
  location                  = "westeurope"
  resource_group_name       = "innFactory-blog-rg"
  automatic_channel_upgrade  = "stable"
  dns_prefix                = "aks-"
  kubernetes_version        = "1.24.6"
  node_resource_group       = "aks-worker"
  private_cluster_enabled   = true
  sku_tier                  = "Paid”

  default_node_pool {
    name                = "default"
    node_count          = "1"
    vm_size             = "standard_d2_v2"
    enable_auto_scaling = true
    min_count           = 1
    max_count           = 3
    vnet_subnet_id      = "subnet1id"
  }

  network_profile {
    network_plugin     = "azure"
    load_balancer_sku  = "standard"
    network_policy     = "calico"
    dns_service_ip     = "10.1.0.10"
    docker_bridge_cidr = "172.17.0.1/16"
    service_cidr       = "10.1.0.0/16"
  }
  identity {
    type = "SystemAssigned"
  }
  http_application_routing_enabled = true

  ingress_application_gateway {
    subnet_id = "subnet2id"
  }
  # Beispiel für AKS RBAC über Azure AD
  role_based_access_control_enabled = true
  azure_active_directory_role_based_access_control {
    managed = true
    admin_group_object_ids = [
      data.azuread_group.aks_admin.id # Azure AD Gruppe mit Admin Zugriff auf das AKS Cluster
    ]
  }
}

Wichtig, auch dies soll nur ein Beispiel für die Erstellung eines Kubernetes Clusters über Terraform sein.

Zusammenfassung

In unserem Beitrag haben wir gesehen, dass alle großen Hyperscaler eine fertige Implementierung von Kubernetes anbieten, die vollständig über Terraform erzeugt werden können. Welche Cloudanbieter für Sie der richtige ist, hängt maßgeblich an ihren Anforderungen. Gerne unterstützen wir Sie bei der Auswahl der richtigen Technologie und der Umsetzung Ihrer digitalen Produkte in der Cloud.