Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Automatisches DR-Failover für EKS-Cluster mit Route 53

By Piyush PatilDec 15, 20236 min read

Diese Seite ist auch in English, Español, Français, Italiano, 日本語 und Português verfügbar.

In diesem Artikel zeige ich Ihnen, wie Sie ein automatisches Failover für einen EKS-Cluster in Ihre Disaster-Recovery-Region (DR) einrichten. Vorab eine kurze Einordnung von EKS und Route 53.

Amazon Elastic Kubernetes Service (EKS) ist ein vollständig verwalteter Dienst, mit dem Sie Kubernetes auf AWS betreiben, ohne eine eigene Kubernetes Control Plane oder Worker Nodes installieren, betreiben oder warten zu müssen. Mit EKS nutzen Sie die Stärken und die Flexibilität von Kubernetes, um Ihre containerisierten Anwendungen über mehrere AWS Availability Zones hinweg auszurollen, zu verwalten und zu skalieren. EKS lässt sich zudem nahtlos mit zahlreichen AWS-Diensten und Funktionen wie IAM, VPC, CloudWatch oder CloudFormation verzahnen – für eine sichere, zuverlässige und skalierbare Kubernetes-Plattform.

Amazon Route 53 ist ein cloud-basierter DNS-Dienst, der Ihre Nutzer mit Ihren Webanwendungen und Ressourcen auf AWS und im Internet verbindet. Route 53 bietet hohe Verfügbarkeit, Skalierbarkeit, Performance und Sicherheit für DNS-Anfragen und -Antworten. Darüber hinaus stehen Funktionen wie Health Checks, Traffic Management, Domain-Registrierung und DNSSEC zur Verfügung. Route 53 spielt zudem mit weiteren AWS-Diensten wie Elastic Load Balancing, CloudFront oder S3 zusammen und leitet Ihre Nutzer zuverlässig an den optimalen Endpoint Ihrer Anwendung.

Für dieses Beispiel starte ich zwei EKS-Cluster: einen in US-EAST-1 (Produktionsregion) und einen in US-WEST-2 (DR-Region). Für den Produktionscluster nutze ich eine eigene Domain über Route 53. Anschließend lasse ich auf beiden Clustern eine 2048-Spielanwendung laufen und zeige das automatische Failover von Route 53, indem ich gezielt Ausfälle im Produktionscluster provoziere. Einen EKS-Cluster können Sie auf vielen Wegen aufsetzen – über die AWS-Konsole, Terraform, CloudFormation und weitere Tools. Ich nutze hier die AWS-Konsole, damit das Vorgehen für alle gut nachvollziehbar bleibt. Unten sehen Sie das zugehörige Architekturkonzept.

Konzeptionelle Architektur

**Schritt 1: EKS-Cluster anlegen**

Im Folgenden zeige ich die Schritte für die Produktionsregion us-east-1; ein vergleichbares Setup steht in us-west-2 bereit.

Name: eks-blog-production-us-east-1

Kubernetes-Version: 1.25

Cluster Service Role: Legen Sie eine Rolle "eksClusterRole" an und stellen Sie sicher, dass die folgenden drei Policies zugewiesen sind: AmazonEKSWorkerNodePolicy, AmazonEC2ContainerRegistryReadOnly und AmazonEKS_CNI_Policy.

eksClusterRole

Wählen Sie die Default-VPC und 2 oder 3 Subnetze aus.

Wählen Sie eine Security Group, in der die Ports 22, 80 und 8080 freigegeben sind.

Cluster-Endpoint-Zugriff: public

Vollständige Cluster-Details vor dem Start

Schritt 2: Node Groups zum Cluster hinzufügen

Cluster öffnen > Compute > Add NodeGrp

Name: eks-blog-production-eks-nodegrp-1

Cluster Service Role: Legen Sie eine Rolle "eksNodeRole" an und stellen Sie sicher, dass die folgenden drei Policies zugewiesen sind: AmazonEKSWorkerNodePolicy, AmazonEC2ContainerRegistryReadOnly und AmazonEKS_CNI_Policy.

Alle übrigen Einstellungen lassen Sie auf den Standardwerten.

EKS Node Group

Schritt 3: Am Cluster authentifizieren

Öffnen Sie die AWS Cloud Shell und führen Sie die folgenden Befehle aus.

# Im AWS-CLI-Fenster ausführen
aws sts get-caller-identity

# Account- und User-ID-Details prüfen

# kubeconfig-Datei anlegen, in der die EKS-Anmeldedaten gespeichert werden:

# Über die kubeconfig stellen Sie die Verbindung zum Cluster mit dem kubectl-CLI her.

aws eks update-kubeconfig --region us-east-1 --name eks-blog-production-us-east-1

# prüfen, ob die erstellten Nodes abrufbar sind
kubectl get nodes

Befehlsausgaben

Schritt 4: Neuen Pod in EKS für das 2048-Spiel anlegen

Erstellen Sie die folgende Datei 2048-pod.yaml, um den 2048-Game-Pod im Cluster auszurollen.

### code starts ###
apiVersion: v1
kind: Pod
metadata:
   name: 2048-pod
   labels:
      app: 2048-ws
spec:
   containers:
   - name: 2048-container
     image: blackicebird/2048
     ports:
       - containerPort: 80

### code ends ###

Wenden Sie die YAML-Datei an, um den Pod anzulegen.

# Konfigurationsdatei anwenden, um den Pod anzulegen
kubectl apply -f 2048-pod.yaml
#pod/2048-pod created

# den neu erstellten Pod anzeigen
kubectl get pods

2048-Pod angelegt

Schritt 5: Load-Balancer-Service einrichten

Jetzt richten wir einen Load-Balancer-Service ein. Legen Sie dazu die folgende Service-YAML-Datei mygame-svc.yaml an.

### code starts ###

apiVersion: v1
kind: Service
metadata:
   name: mygame-svc
spec:
   selector:
      app: 2048-ws
   ports:
   - protocol: TCP
     port: 80
     targetPort: 80
   type: LoadBalancer

### code ends ###

Wenden Sie die Service-Datei an.

# Konfigurationsdatei anwenden
kubectl apply -f mygame-svc.yaml

# Details des angepassten Service anzeigen
kubectl describe svc mygame-svc

Load-Balancer-Service angelegt

Wenn Sie den Load-Balancer-Endpoint "ab8412c93389c4e29beb8c5e3778d368–260705609.us-east-1.elb.amazonaws.com" im Browser aufrufen, lädt das Spiel.

Schritt 6: Domain [www.doyouneedk8s.com](http://www.doyouneedk8s.com/) auf das Spiel routen

Wechseln Sie in Route 53 zur Hosted Zone der Domain www.doyouneedk8s.com und legen Sie den Load-Balancer-Endpoint als CNAME-Record an. Sobald der DNS-Eintrag propagiert ist, lädt das Spiel im Browser, wenn Sie die Domain aufrufen.

Route 53 CNAME

Schritt 7: Ausfall provozieren

Nehmen wir an, in US Virginia tritt eine Störung auf. Wir lösen manuell ein Failover für die Anwendung in US-EAST-1 aus, indem ich die Inbound-Regel für Port 80 aus der Security Group des Load Balancers entferne. Das Spiel lädt nicht mehr, da für die Produktionsanwendung bislang kein Failover hinterlegt ist.

Schritt 8: Route-53-Failover in die DR-Region einrichten

Im ersten Schritt legen Sie in Route 53 einen Health Check für Ihre Anwendung an. Öffnen Sie Route 53, wählen Sie in der linken Navigation "Health Checks" und klicken Sie auf "Create Health Check".

Name: www.doyouneedk8s.com

What to monitor: Endpoint

Monitor and endpoint > Domain Name auswählen > www.doyouneedk8s.com im Feld Domain Name eintragen, Port 80

Health Check anlegen – Seite 1

Nach einem Klick auf "Next" können Sie auf der Folgeseite einen Alarm zu diesem Ereignis einrichten, damit Sie über das Failover informiert werden. Das ist schnell erledigt: Sie brauchen nur ein verifiziertes SNS-Topic und wählen es aus. Setzen Sie "Create Alarm" auf "Yes" und klicken Sie anschließend auf "Create health check".

Health Check anlegen

Sobald der Health Check die festgelegten Parameter erfüllt, erscheint er mit dem grünen Status "Healthy".

Health Check einsatzbereit

Wechseln Sie in Route 53 zur Hosted Zone von www.doyouneedk8s.com. Wählen Sie den CNAME-Record aus und stellen Sie unter Routing Policy die Option "Failover" ein.

Failover record type: Secondary

Health Check ID: der zuvor erstellte Domain-Health-Check.

Record ID: der Load Balancer in US-WEST-2, der beim Start des Spiels in der US-Oregon-Region angelegt wurde. Speichern Sie den Eintrag.

Jetzt geht es ans Testen. Provozieren Sie denselben Ausfall wie in Schritt 7 – diesmal läuft das Spiel weiter. Zur Veranschaulichung habe ich auf der Spielseite einen abweichenden Text hinterlegt, sodass klar zu erkennen ist, dass das Spiel jetzt aus der DR-Region ausgeliefert wird.

DR-Failover erfolgreich

Fazit:

Route 53 ist ein ausgesprochen leistungsfähiges Werkzeug von AWS, um robuste DR- und Business-Continuity-Strategien aufzubauen. In diesem Artikel habe ich gezeigt, wie sich ein Failover umsetzen lässt – die Synchronisierung von Code-Updates zwischen Produktions- und DR-Cluster bleibt jedoch in Ihrer Verantwortung. Wenn Sie diese Failover-Strategie produktiv einsetzen, sollten Sie zudem regelmäßig im Wartungsfenster einen Sanity-Test durchführen, um sicherzugehen, dass Produktions- und DR-Anwendung einwandfrei funktionieren.

Quellen: