Amazon Web Services hat am 05. Juni 2018 in einer ersten Region in den USA seinen gemanagten Kubernetes Service EKS veröffentlicht. Anders als bei der Google Kubernetes Engine, muss der User bei EKS vergleichsweise viel selbst machen. Auch die Kosten für die Master Instanz unterscheiden sich deutlich. So entstehen bei Amazon alleine für den EKS Master gut und gerne mal 150$ pro Monat, wenn man den Dienst über mehrere Availabilty Zones verteilt. Tendenziell ist dies aber immer noch wesentlich günstiger wie der Bau eines eigenen Kubernetes Clusters. Allen voran hat Amazon viel Wert auf die Integration seiner bestehenden AWS Dienste gelegt. Ähnlich wie bei der Google Cloud kann man beispielsweise das Load Balancing über den Elastic Load Balancer von AWS abwickeln.
Bei den Usern und den Rollen muss Amazon in unseren Augen noch nachbessern. Ausgangspunkt für das Deployment unseres akka Clusters soll ein lauffähiger EKS Cluster und unser Beispielprojekt in akka sein, das ihr auf unserem github Profil findet.
Amazon Elastic Container Service for Kubernetes als Ausgangspunkt
Der Aufbau des EKS Clusters wird in diesem AWS Blogbeitrag sehr gut beschrieben. Man muss allerdings aufpassen, dass EKS nicht immer in der gesamten Region zur Verfügung ist. So mussten wir das von AWS vorgegebene CloudFormation anpassen, sodass EKS andere Availabilty Zones bei unserem Test verwendet. Auch für ein automatisches Deployment mithilfe von Jenkins oder Circle CI muss nachgebessert werden. Ihr müsst eure IAM Rolle, User oder Ressourcen über eine yaml Konfigurationsänderung bei Kubernetes hinzufügen. Dies wird hier beschrieben. Solltet ihr das Kubernetes Dashboard aktiviert haben könnt ihr es mit folgendem Shell Script starten:
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep eks-admin | awk '{print $1}') kubectl proxy # open http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
akka Cluster mit Kubernetes Service Discovery Sample
https://github.com/innFactory/akka-cluster-k8s
Auf github haben wir ein akka Cluster Beispielprojekt veröffentlicht. Es ist wie in der Dokumentation von Lightbend für das Deployment mit der sbt-reactive-app vorbereitet. Es enthält auch ein Shell Script für das Deployment des Clusters auf euren AWS EKS Cluster. Selbstverständlich könnt ihr das Sample auch auf einem Minikube laufen lassen.
minikube start eval $(minikube docker-env) sbt "deploy minikube" echo "http://$(minikube ip)/events"
Deployment
Zum Deployment benötigt ihr die Reactive CLI in der neuesten Version und ein Container Repository bei AWS. Bevor ihr mit sbt euren Docker Container erstellen könnt und diesen dann in euer AWS Repository pushen könnt, müsst ihr einen AWS Login durchführen.
aws ecr get-login --no-include-email
Mithilfe von sbt könnt ihr dann das Beispiel direkt auf euer AWS Container Repository pushen. Dazu müsst ihr in der build.sbt die entsprechend markierten Stellen anpassen. Danach könnt ihr euren lauffähigen Container mit „sbt docker:publish“ veröffentlichen.
Im Anschluss daran könnt ihr den soeben veröffentlichen Container auf euren Kubernetes Cluster deployen wie es Lightbend in seiner Kubernetes Orchestration Anleitung beschreibt. Ein passendes Deployment Shellscript ist im Sample enthalten. Dies müsst ihr auch wie kommentiert anpassen. Wichtig ist, dass die reactive-cli derzeit keinen AWS Login durchführen kann. Das heißt ihr müsst unbedingt das Flag –registry-use-local setzen, damit ihr keinen Authentication Error bekommt. Durch EKS haben eure Kubernetes Worker automatisch Zugriff auf eure AWS Container Repositorys und können die Instanzen dann entsprechend pullen, wenn die Images gültig sind. Lightbend arbeitet derzeit an einer Lösung für dieses Problem. Es kann aber mithilfe dieses Workarounds umgangen werden.
Wenn das Deployment funktioniert hat, versucht der Kubernetes Cluster nun ein akka Cluster mit 5 Nodes aufzubauen. Das Cluster Building wird bei EKS allerdings noch fehlschlagen, da ihr noch eine Konfiguration anpassen müsst, damit eure akka cluster pods an die Metadaten von Kubernetes kommen. Ohne diese Metadaten ist eine Clusterbildung nicht möglich. Ein normale akka-cluster Instanz würde allerdings schon fehlerfrei laufen.
Für das Cluster müsst ihr noch folgendes Kuberentes file mit kubectl einspielen:
kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "watch", "list"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: read-pods subjects: - kind: User name: system:serviceaccount:default:default roleRef: kind: Role name: pod-reader apiGroup: rbac.authorization.k8s.io
Nun könnt ihr das Deployment neustarten und es sollte sich innerhalb von kurzer Zeit ein valides akka Cluster über 5 Pods bilden.