super-eks: Ein EKS-Installer auf CDK-Basis

Mit Amazon EKS stellt AWS einen gemanagten Kubernetes-Cluster zur Verfügung. Trotzdem müssen Nutzerinnen hohen Aufwand betreiben um den Kubernetes-Cluster produktiv einsetzbar zu bekommen. Es fehlen eine Integration mit Amazon Route 53, Loadbalancer für Services, Absicherung der IAM-Policies für Compute-Nodes sowie das kontrollierte Management vorinstallierter Manifeste für Cluster-Networking. All diese Bestandteile müssen nachinstalliert, konfiguriert und in Einklang mit der eigenen AWS-Umgebung gebracht werden.

Unser Installer super-eks folgt dem “batteries included”-Ansatz und stellt obige Komponenten vorkonfiguriert bereit. Nutzerinnen müssen ihre Route53-Zone angeben und können umgehend Dienste auf den Kubernetes-Cluster ausliefern, die über das Internet erreichbar sind.

Welche Batterien?

EKS stellt zunächst nur das Kubernetes-Kernsystem bereit. Im Kubernetes-Ökosystem lassen sich Ziele auf unterschiedlichste Weise erreichen. Wir haben Komponenten ausgewählt und vorkonfiguriert, die zum einen als Standard in der Community gelten und zum anderen am besten zu AWS passen.

  • Für das DNS-Management setzen wir external-dns ein. Damit lassen sich Ingress oder Service per externem DNS (Amazon Route 53) ansprechen.
  • Logs sammeln wir in Amazon CloudWatch Logs mittels fluent-bit.
  • Für das Ingress-Management nutzen wir den AWS Load Balancer Controller.
  • Alle von super-eks verwalteten Services laufen auf einer dedizierten Node-Group. Für eure Workloads steht eine weitere, gehärtete Node-Group bereit.
  • Wo möglich (derzeit nur das Amazon VPC CNI plugin) verwenden wir gemanagte Cluster-Addons.

Wie funktioniert das?

super-eks basiert auf dem AWS Cloud Development Kit (kurz CDK), einem Werkzeug, um AWS-Infrastruktur mit Code zu beschreiben. Hier und hier haben wir uns schon eingehender mit dem CDK und seinen Vorzügen beschäftigt.

Um mit super-eks einen EKS-Cluster aufzusetzen, brauchen wir folgende Tools:

  • Eine konfigurierte AWS-Umgebung,
  • eine NodeJS-Installation,
  • kubectl um mit dem Kubernetes-Cluster zu interagieren,
  • Lust bzw keine Scheu vor TypeScript,
  • sowie einem Editor unserer Wahl

Zunächst legen wir ein neues Verzeichnis an.

mkdir super-eks-setup && cd super-eks-setup

Jetzt bootstrappen wir ein CDK-Projekt.

npx cdk init sample-app --language typescript

Außerdem muss CDK einmal euren Account bootstrappen. Dabei wird ein S3-Bucket angelegt.

npx cdk bootstrap

Nun installieren wir super-eks.

npm i @superluminar-io/super-eks

Außerdem wollen wir eine Amazon Route 53 HostedZone anlegen bzw importieren.

npm i @aws-cdk/aws-route53

Jetzt die Datei lib/super-eks-setup-stack.ts öffnen und folgenden Inhalt einfügen.

import * as cdk from '@aws-cdk/core';
import {HostedZone} from '@aws-cdk/aws-route53'
import {SuperEks} from '@superluminar-io/super-eks'

export class SuperEksSetupStack extends cdk.Stack {
    constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
        super(scope, id, props);

        // Assumes you already have a Route53 zone in your account
        const hostedZone = HostedZone.fromLookup(this, 'MyZone', {
            domainName: 'example.com' // Your domain goes here
        });

        // Setup super-eks
        const superEks = new SuperEks(this, 'hello-eks', {
            hostedZone: hostedZone,
        });

        // Add nginx installation for testing
        superEks.cluster.addHelmChart("nginx", {
            createNamespace: true,
            namespace: "nginx",
            repository: "https://charts.bitnami.com/bitnami",
            chart: "nginx",
            release: "nginx",
            version: "8.5.2",
            values: {
                ingress: {
                    enabled: true,
                    hostname: `nginx.${hostedZone.zoneName}`,
                    annotations: {
                        "kubernetes.io/ingress.class": "alb",
                        "alb.ingress.kubernetes.io/scheme": "internet-facing",
                        "alb.ingress.kubernetes.io/target-type": "ip",
                    },
                },
            },
        })
    }
}

Jetzt deployen wir die CDK-Anwendung, bzw. den CloudFormation-Stack.

npx cdk deploy

Nach einer Weile erscheint folgendes im Terminalfenster.

 ✅  SuperEksSetupStack

Outputs:
SuperEksSetupStack.EksClusterConfigCommandAEB22784 = aws eks update-kubeconfig --name EksCluster3394B24C-86f946f02a67416c80413e123d58b628 --region eu-central-1 --role-arn arn:aws:iam::123456789012:role/SuperEksSetupStack-EksClusterMastersRoleA746276-GNW143CGOXG7
SuperEksSetupStack.EksClusterGetTokenCommand53BD6035 = aws eks get-token --cluster-name EksCluster3394B24C-86f946f02a67416c80413e123d58b628 --region eu-central-1 --role-arn arn:aws:iam::123456789012:role/SuperEksSetupStack-EksClusterMastersRoleA746276-GNW143CGOXG7

Stack ARN:
arn:aws:cloudformation:eu-central-1:123456789012:stack/SuperEksSetupStack/06273460-660e-11eb-b4d9-06da4ef2f41a
✨  Done in 1757.52s.
✨  Done in 1757.79s.

Jetzt wollen wir uns mit dem Kubernetes-Cluster verbinden. Dazu müssen wir unsere kubeconfig anpassen.

aws eks update-kubeconfig --name EksCluster3394B24C-86f946f02a67416c80413e123d58b628 --region eu-central-1 --role-arn arn:aws:iam::123456789012:role/IntegrationTestsStack-EksClusterMastersRoleA746276-GNW143CGOXG7
Added new context arn:aws:eks:eu-central-1:123456789012:cluster/EksCluster3394B24C-86f946f02a67416c80413e123d58b628 to /home/super-eks/.kube/config

Und, funktioniert es?

kubectl get pods --all-namespaces

NAMESPACE      NAME                                            READY   STATUS    RESTARTS   AGE
dns            external-dns-7d4d69545d-r5w68                   1/1     Running   0          14m
logging        aws-for-fluent-bit-qwhwb                        1/1     Running   0          14m
logging        aws-for-fluent-bit-s7wnj                        1/1     Running   0          14m
ingress        aws-load-balancer-controller-5b9cbc5497-smfrt   1/1     Running   0          14m
kube-system    aws-node-lscgc                                  1/1     Running   0          18m
kube-system    aws-node-zfcdl                                  1/1     Running   0          18m
kube-system    coredns-59b69b4849-9gstn                        1/1     Running   0          25m
kube-system    coredns-59b69b4849-bssnr                        1/1     Running   0          25m
kube-system    kube-proxy-9sgtt                                1/1     Running   0          18m
kube-system    kube-proxy-r4gzg                                1/1     Running   0          18m
nginx          nginx-67cb444d48-lqzkg                          1/1     Running   0          14m

Voilà. Unser Cluster läuft.

Ab jetzt verfügbar!

super-eks steht ab jetzt auf GitHub sowie als NPM-Paket zur Verfügung. Zukünftige Erweiterungen sind bereits geplant:

  • Monitoring per Prometheus und CloudWatch
  • eine Backup-Lösung
  • vorkonfigurierte Autoskalierung
  • Integration mit Amazon Cognito zur Absicherung eurer Workloads
  • ein One-Click-CloudFormation-Installer, so lässt sich super-eks auch ohne CDK verwenden

Wir freuen uns über Feedback entweder per Mail oder direkt als GitHub Issue.

photo of Jan

Jan is Co-founder and Cloud Consultant at superluminar and AWS Certified Solutions Architect Professional. He writes here about AWS-specific topics. He can be found under the name @bracki on Twitter.