ake1150 - stock.adobe.com

So verwenden Sie Terraform in Elastic Kubernetes Service

Bei der Arbeit mit Elastic Kubernetes Service gibt es zahlreiche sich wiederholende Schritte. Wir erklären, wie Sie diese mit Terraform automatisieren und dadurch Zeit sparen.

Das Skalieren von Workloads verlangt die immer gleichen Handgriffe, insbesondere in der Cloud. Es ist nichtmehr zeitgemäß, diesen Prozess manuell durchzuführen. Automatisieren Sie diesen Vorgang, haben Sie mehr Zeit für Aufgaben, die Ihrem Unternehmen einen wirklichen Mehrwert bringen.

Auch wenn die Kubernetes-Orchestrierung anwendungsspezifisch ist, benötigen die Cluster eine – in den meisten Fällen – sehr ähnlichen Infrastruktur, auf der sie laufen. Es ist nicht optimal, sie jedes Mal von Grund auf neu zu konfigurieren oder manuell zu skalieren, wenn Sie wiederholbare und konsistente Prozesse schaffen wollen.

Terraform ist ein beliebtes Werkzeug zum Erstellen eines Elastic-Kubernetes-Service-Clusters (EKS) in AWS. Erfahren Sie mehr über seine Vorteile und folgen Sie einer schrittweisen Anleitung zum Bereitstellen eines EKS-Clusters mit Terraform.

Warum Terraform?

Terraform setzt auf Infrastructure as Code (IaC). Das heißt, es stellt Infrastruktur automatisiert anhand von Code bereit. Diese Methode bietet verschiedene Vorteile, darunter die folgenden:

  • wiederholbare und skalierbare Infrastruktur
  • kürzere Bereitstellungszeiten
  • niedrigere Kosten

Es gibt auf dem Markt verschiedene IaC- und Konfigurationsmanagement-Tools. Terraform erfreut sich jedoch zunehmender Beliebtheit bei Infrastrukturprofis, Entwicklern, DevOps-Ingenieuren, Site Reliability Engineers und anderen technischen Berufsgruppen. Viele der Stärken von Terraform ergeben sich aus den folgenden Punkten:

  • Es funktioniert plattformübergreifend;
  • Es ist für Menschen lesbar und erfordert keine fortgeschrittenen Kenntnisse;
  • Es ist quelloffen, was bedeutet, dass Ingenieure ihre eigenen Terraform-Provider für bestimmte Funktionen erstellen können; und
  • Es gibt sowohl eine kostenlose Version – Terraform - als auch eine Unternehmensversion – Terraform Cloud – die jeweils den gleichen Funktionsumfang aufweisen.

Einrichten eines EKS-Clusters mit Terraform

Bevor Sie mit der Arbeit beginnen, benötigen Sie Folgendes:

  • ein AWS-Konto;
  • Identitäts- und Zugriffsmanagement (IAM) Anmeldeinformationen und programmatischen Zugriff;
  • AWS-Anmeldeinformationen, die lokal mit aws configure eingerichtet werden;
  • eine für EKS konfigurierte Virtual Private Cloud; und
  • einen Code- oder Texteditor, wie VS Code.

Wenn Sie diese Voraussetzungen erfüllen, ist es an der Zeit, mit dem Schreiben des Codes zu beginnen. Die folgenden Schritte zeigen, wie Sie die Datei main.tf erstellen, um einen EKS-Cluster einzurichten, und die Variablendateien, um sicherzustellen, dass es in jeder Umgebung wiederholbar ist.

Erstellen der Datei main.tf

Wir verwenden in dieser Anleitung VS Code. Sie funktioniert aber auch in jedem anderen Texteditor.

Schritt 1. Öffnen Sie Ihren Texteditor und erstellen Sie ein neues Verzeichnis. Schreiben Sie eine neue Datei namens main.tf. Dabei benötigen Sie folgende Informationen:

  • den AWS Terraform-Anbieter;
  • eine neue IAM-Rolle für EKS;
  • die EKS-Richtlinie für die IAM-Rolle; und
  • den EKS-Cluster selbst, einschließlich der Worker Nodes.

Schritt 2. Fügen Sie in der Datei main.tf den Provider-Code hinzu. Damit stellen Sie sicher, dass Sie den AWS-Provider verwenden.

terraform {

 required_providers {

  aws = {

   source = "hashicorp/aws"

  }

 }

}

Schritt 3. Richten Sie die erste Ressource für die IAM-Rolle ein. Dadurch gewährleisten Sie, dass die Rolle Zugang zum EKS hat.

resource "aws_iam_role" "eks-iam-role" {

 name = "devopsthehardway-eks-iam-role"

 

 path = "/"

 

 assume_role_policy = <<EOF

{

 "Version": "2012-10-17",

 "Statement": [

  {

   "Effect": "Allow",

   "Principal": {

    "Service": "eks.amazonaws.com"

   },

   "Action": "sts:AssumeRole"

  }

 ]

}

EOF

 

}

Schritt 4. Haben Sie die Rolle erstellt, fügen Sie ihr diese beiden Richtlinien zu:

  • AmazonEKSClusterPolicy
  • AmazonEC2ContainerRegistryReadOnly-EKS

Dies ermöglicht Ihnen den ordnungsgemäßen Zugriff auf EC2-Instanzen (auf denen die Arbeitsknoten laufen) und EKS.

resource "aws_iam_role_policy_attachment" "AmazonEKSClusterPolicy" {

 policy_arn = "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy"

 role    = aws_iam_role.eks-iam-role.name

}

resource "aws_iam_role_policy_attachment" "AmazonEC2ContainerRegistryReadOnly-EKS" {

 policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"

 role    = aws_iam_role.eks-iam-role.name

}

Schritt 5. Nachdem Sie alle Voraussetzungen geschaffen haben, erstellen Sie das EKS-Cluster.

resource "aws_eks_cluster" "devopsthehardway-eks" {

 name = "devopsthehardway-cluster"

 role_arn = aws_iam_role.eks-iam-role.arn

 

 vpc_config {

  subnet_ids = [var.subnet_id_1, var.subnet_id_2]

 }

 

 depends_on = [

  aws_iam_role.eks-iam-role,

 ]

}

Schritt 6. Richten Sie eine IAM-Rolle für die Worker Nodes ein. Der Prozess ähnelt dem zum Erstellen der IAM-Rolle für den EKS-Cluster, mit dem Unterschied, dass Sie dieses Mal die Richtlinien für die EKS-Arbeitsknoten anlegen. Dazu gehören:

  • AmazonEKSWorkerNodePolicy
  • AmazonEKS_CNI_Policy
  • EC2InstanceProfileForImageBuilderECRContainerBuilds
  • AmazonEC2ContainerRegistryReadOnly

resource "aws_iam_role" "workernodes" {

  name = "eks-node-group-example"

 

  assume_role_policy = jsonencode({

   Statement = [{

    Action = "sts:AssumeRole"

    Effect = "Allow"

    Principal = {

     Service = "ec2.amazonaws.com"

    }

   }]

   Version = "2012-10-17"

  })

 }

 

 resource "aws_iam_role_policy_attachment" "AmazonEKSWorkerNodePolicy" {

  policy_arn = "arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy"

  role    = aws_iam_role.workernodes.name

 }

 

 resource "aws_iam_role_policy_attachment" "AmazonEKS_CNI_Policy" {

  policy_arn = "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"

  role    = aws_iam_role.workernodes.name

 }

 

 resource "aws_iam_role_policy_attachment" "EC2InstanceProfileForImageBuilderECRContainerBuilds" {

  policy_arn = "arn:aws:iam::aws:policy/EC2InstanceProfileForImageBuilderECRContainerBuilds"

  role    = aws_iam_role.workernodes.name

 }

 

 resource "aws_iam_role_policy_attachment" "AmazonEC2ContainerRegistryReadOnly" {

  policy_arn = "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly"

  role    = aws_iam_role.workernodes.name

 }

Schritt 7. Zum Schluss erstellen Sie die Worker Nodes. Verwenden Sie zu Testzwecken erst einmal nur einen davon in der scaling_config-Konfiguration. In der Produktion sollten Sie den Best Practices folgen und mindestens drei Worker Nodes einrichten.

resource "aws_eks_node_group" "worker-node-group" {

  cluster_name  = aws_eks_cluster.devopsthehardway-eks.name

  node_group_name = "devopsthehardway-workernodes"

  node_role_arn  = aws_iam_role.workernodes.arn

  subnet_ids   = [var.subnet_id_1, var.subnet_id_2]

  instance_types = ["t3.xlarge"]

 

  scaling_config {

   desired_size = 1

   max_size   = 1

   min_size   = 1

  }

 

  depends_on = [

   aws_iam_role_policy_attachment.AmazonEKSWorkerNodePolicy,

   aws_iam_role_policy_attachment.AmazonEKS_CNI_Policy,

   #aws_iam_role_policy_attachment.AmazonEC2ContainerRegistryReadOnly,

  ]

 }

 

  ]

 }

Erstellen der Datei variables.tf

Da Sie nun die Datei main.th erstellt haben, ist es an der Zeit, die Variablen einzurichten. Variablen ermöglichen es Ihnen, Werte zu übergeben und Ihren Code wiederholbar zu machen. Das heißt, Sie können diesen Code für jede EKS-Umgebung verwenden.

Schritt 1. Erstellen Sie eine neue Datei namens variables.tf mit den folgenden beiden Variablen:

  • Subnetz_id_1
  • Teilnetz_ID_2

Die beiden Subnetz-IDs wird die VPC nutzen, die Sie über AWS CloudFormation im Abschnitt Voraussetzungen erstellt haben. Sie können ein öffentliches Subnetz und ein privates Subnetz für Entwicklungszwecke parallel verwenden.

Schritt 2. Erstellen Sie innerhalb der Datei variables.tf die folgenden Variablen:

variable "subnet_id_1" {

  type = string

  default = "subnet-your_first_subnet_id"

 }

 

 variable "subnet_id_2" {

  type = string

  default = "subnet-your_second_subnet_id"

 }

Erstellen Sie die EKS-Umgebung

Um die Umgebung zu erstellen, stellen Sie sicher, dass Sie sich im Terraform-Verzeichnis und Modul befinden, das Sie zum Schreiben des Terraform-Modus verwendet haben. Führen Sie die folgenden Befehle aus:

  • terraform init. Initialisieren Sie die Umgebung und rufen Sie den AWS-Provider auf.
  • terraform plan. Planen Sie die Umgebung und stellen Sie sicher, dass es keine Bugs
  • terraform apply --auto-approve. Erstellen Sie die Umgebung mit dem apply-Befehl, kombiniert mit auto-approve, um überflüssige Interaktionsanfragen zu vermeiden.

Wenn Sie bereit sind, alle Terraform-Umgebungen zu zerstören, stellen Sie sicher, dass Sie sich in dem Terraform-Modul/Verzeichnis befinden, das Sie zum Erstellen des EKS-Clusters verwendet haben. Führen Sie dann den Befehl terraform destroy aus.

Erfahren Sie mehr über Containervirtualisierung