Kubernetes – Einblick in die Open Source Welt

Es ist mal wieder Zeit für was Neues. Nachdem ich mich ausgiebig mit Public Cloud Providern, Docker, Continuous Integration und Continuous Deployment beschäftigt habe fehlt noch eine Kleinigkeit.

Natürlich, die Container-Orchestrierung und wie der Titel schon sagt, im speziellen mit Kubernetes. Wenn man sich mit diesen Themen beschäftigt landet man schnell bei einigen weitergehenden Themen wie zum Beispiel Terraform, Ansible, Python und GoLang. Diese findet man eigentlich überall vor.

Kubernetes selbst ist in Go geschrieben. Installationshelfer sind in Python oder Go geschrieben und einige Projekte stellen komplexe Infrastrukturen in Form von Terraform Konfigurationen und Ansible Playbooks bereit.

Die Masse dieser Programme, Konfigurationen und Helfer sind Open Source, eine ideale Welt zum lernen also. Mit Go hab ich mich schon seit etwas längerem beschäftigt und mir verschieden Programme angeschaut und natürlich auch fleissig selbst in die Tasten gehackt. Infrastructure as a Code ist mir auch geläufig, als Entwickler hat man aber meist wenig damit zu tun. All diese Tools sind aber hervorragend geeignet um einfach alles zu automatisieren. Also genau mein Geschmack.

Die letzten Tage habe ich mich hauptsächlich mit der automatisierten Installation eines Kubernetes Clusters in Public Clouds beschäftigt.
Hier kommt dann eine ordentliche Portion Gemischtes auf dem Schreibtisch.

Als erstes die Infrastruktur als Code, hier bietet Kubespray ein ordentliche Packung an Terraform Konfigurationen und Ansible Playbooks an. Mit ein paar Befehlen und Konfigurationen lässt sich so auf Amazon eine gut geplante Infrastruktur erstellen. Insgesamt dürften es 37 Ressourcen sein die bei einem Bastion – Master – Node Cluster zusammen kommen.

Dann muss Kubernetes noch auf den Master und die Nodes installiert werden. Das geht wunderbar mit Ansible und Kubespray. Man kann das ganze natürlich auch mit Kubeadm lösen und sein Cluster einrichten. Oft sind es mehrere kleine Schritte, bis alles läuft. Bei manchen Lösungen muss man aber auch einzelne Schritte öfters wiederhohlen, um zum Beispiel die Nodes einzurichten. Ander brauchen sehr viel Bootstrap bis alle Anforderungen erfüllt sind, um rund zu laufen und das leider auch auf mehreren Severn.

Es kommt aber immer etwas dazu, um das ganze noch mehr zu vereinfachen. Wenn man viel vereinfacht bleibt natürlich auch viel Wissen auf der Strecke. Um das zu vermeiden habe ich angefangen dort einzusteigen wo die Vereinfachung beginnt, denn dann muss man das ganze Wissen aufbauen um am Ende eine To Go Lösung zu erhalten die weiteren Nutzern die Arbeit abnimmt. Gerade im beruflichen Alltag fehlt einem die Zeit sich intensiv mit dem Gesamten Thema zu beschäftigen und benötigt nur eine schnelle, einfache und sichere Lösung.

Ideal wäre es, ein Konsolen Befehl einzutippen, sich eine Tasse Kaffee zu hohlen, sich kurz noch mit den Kollegen auszutauschen und beim zurück kommen an den Schreibtisch ist das Kubernetes Cluster produktiv einsetzbar. Klar man kann sogar einfach den Konsolen Befehl von automatisierten Task ausführen lassen.
Als Beispiel könnte Jenkins ein Kubernetes Cluster zum testen hochfahren, nötige Applikation als Pods starten, alle nötigen Tests durchlaufen und am ende das Cluster wieder abbauen.

Klingt nach einem tollen Gedanken. Stop, genau das hab ich doch heute schon mindestens 12 mal gemacht, nennt mich Jenkins 🙂

Tatsächlich gibt es bereits die Möglichkeiten und auch eine Auswahl, an Operation Systems, auf die ich gern mein Cluster aufbauen möchte. Ob CoreOS, CentOS oder Ubuntu ist nur eine Frage der Konfigurationsdatei ebenso welche Cloud ich nutzen möchte. Ob nun Public wie AWS, Google Cloud, Azure oder Private Clouds wie Openstack. Natürlich bleiben die Server im Rechenzentrum auch nicht unberücksichtigt und es gibt eine Bare-Metal Installation.

Schaut euch mal die verschiedenen Lösungen an und entscheidet für Euch was am besten zu euren Anforderungen passt. Ich hab mich für TK8 entschieden und bin hier fleißig dabei Code zu produzieren.

Da ich nun wieder mehr Zeit habe und intensiver mit den Themen arbeiten werde, kommen in den nächsten Wochen noch einige Inhalte rund um das Thema und auch endlich wieder YouTube Videos 🙂

Als bleibt am Ball, folgt meinem Blog oder dem YouTube Channel!

AWS NAT Gateway Timeout behaviour

In the last weeks I worked a lot with java netty sockets and run in half-open TCP connections. This mean the connection is only open on the client site but the server closed the connection.

I could not reproduce the issue in my local environment, refactor on the application source didn’t help me and so I burned down a lot of hours to get a stable connection to the socket server without success.

After a while we go down to TCP Level to get more information what happened.

The environment with this issue was on AWS in a private network with a NAT gateway.

The Socket Server send a connection timeout after 15 seconds with a TCP-FIN. This goes throw the AWS NAT-gateway and send a TCP-RST to the application server. In this case the application server believes the connection is established, but it isn’t.

It could be fixed with change the NAT Gateway to a NAT Instance on AWS which will send also the TCP-FIN or add the application server connected directly to the public network.

Add the end there was also some other issues with the NAT Gateway and long-time timeouts on Web-Socket level.

Some Links for more Information are here:

“Timeout behavior: When a connection times out, a NAT gateway returns an RST packet to any resources behind the NAT gateway that attempt to continue the connection (it does not send a FIN packet).”

Netty Github issue discussion

Half-open Connection on wikipedia

AWS Mail Server.

Zum verrückt werden …

Ich hab auf einer EC2 Instance einen Mailserver aufgesetzt der sich um die Emails der gerösteten Domains kümmern soll.

Dann Postfix und Dovecod konfiguriert. Das ist ja eigentlich recht simpel und schnell gemacht. Aber die Betonung liegt auf eigentlich. Nach ein paar Stunden Gefummel lief dann alles. Getestet hab ich dann in Outlook Email abrufen versenden Fehler frei.
Okay noch eine testmail an mein Google Account.   (Stellt euch den Sound von Zonk vor).

Relay Fehler… narf wtf!!!

Okay nach Stunden länger suche und etlichen Thread rund um das Thema sowie versuche gelesenes zu verwenden, die aber mit meinem Problem nichts zu tun hatten.. zumindest weiß ich das jetzt.

Das Problem ist der Reverse DNS Eintrag. Dieser muss bei Amazon extra beantragt werden. Solang dieser fehlt können keine E-Mails versendet werden.

Großes Kino

Bekomme einen #Minecraft #Server ge­#spon­sert

Da heute der Tag der Tage ist und es diesen Blog nun seit 7 Jahren gibt hab ich mir überlegt den Lesern was zurück zu geben. Nach 7 Jahren voll von Kram mit dem ich mich in der IT Welt beschäftige passt es natürlich wenn ich was auspacke was genau damit zu tun hat.

Da es aktuell in meinem Blog um ECS, AWS, Docker und Minecraft geht, gibt es jetzt von mir für einen Leser einen 10 Slot Minecraft Server für 3 Monate gesponsert.

Nun zur Teilnahme.
Da ich nicht einfach wild irgendeinem Abonnenten den Server aufdrücken will der diesen vielleicht nicht mal braucht haben auch neue Leser eine Chance verdient. Daher habe ich mir ein paar Vorraussetzungen überlegt. Hier also die Vorraussetzungen:

Um als glücklicher MinecraftServer Inhaber zu enden verfolgt ihr mich einfach auf den verschiedenen Portalen. Gern könnt ihr Posten Twittern Kommentieren und Eure verschiedenen Profile miteinander verlinken.
Folgt meinem Blog und teilt diesen Beitrag.
Folgt meiner Minecraft Seite auf Facebook
Folgt meinem Youtube Kanal
Folgt mir auf Twitch
Folgt mir auf Twitter

Wenn ihr das gemacht habt, habe ich schon mal die Möglichkeit Euch irgendwie zu erreichen 🙂 Damit alle eine Chance haben läuft das ganze bis zum Freitag dem 01.05.2015. An diesem Tag werde ich den gewinner ermitteln und die Server Informationen verschicken. Ihr könnt auch noch Eure Freunde und Bekannte einladen für Euch zu folgen und mit Posten Twittern Kommentieren auf Euch zu verweisen.

Ich freu mich auf eine rege Teilnahme.

Docker und Amazon Container Service

Ein Wochenende voller WTF ist vorbei. Themen des Wochenendes waren Dicker, AWS und die blaue Wolke (Cloud) .

Zuerst hab ich viel Zeit verbracht mich intensiver mit Docker zu beschäftigen. Zu allererst Docker Registry: Man logt sich mit Hilfe des Befehls „docker login“ ein und kann nun seine Container ins docker hub schieben. Dazu benutzt man den Befehl „docker push myApp“. Und tada das repository wurde auf docker hub angelegt. Jetzt liegen dort als … Was genau.. die lokal gebauten Container. Blöd nur das zum Beispiel mein railo Container der eine Webseite birgt den Source Code von meinem lokalen Windows Platte gezogen hat. Dieser fehlt nun. Also kein Source Code im Container.

Was nun?

Lesen Lesen Lesen Lesen Lesen wtf Lesen Lesen ahhhh :

Automatisches build repository mit github. Fast schon perfekt. also auf github den Source Code des docker container gepushed. Siehe da alle Infos sind im docker hub inklusive der dockerfile. Was fehlt jetzt immer noch der Source Code. 2 Optionen habe ich nun ohne groß zu Überlegen. Entweder den Code mit in das repository … Pfui … Ein eigenes Repository. Besser, also Code pushen docker File anpassen docker pushen. Start build. Sehr gut so geht’s.

Aber nicht das was mir vorschwebte. Am Rande, ich hab es auch bis jetzt noch nicht erreicht. Ich möchte die Container in AWS laufen lassen über den ACS. Mein Quellcode soll nicht in einem public Repro liegen. Dockerfiles auch nicht. Also Setup für ein Closed Projekt.

Ein weiterer Test den ich gemacht habe war das Docker File aus dem automatmischen repository zu ziehen und den Code als Zipfile von aws S3. Zugriff des S3 nur auf aws Ebene. Wtf build fehlgeschlagen… wtf wo findet der build statt? Etwa Auf docker? -.-

Also nächstes Ziel vielleicht ec2 instance fürs docker. s3 als docker register Speicher. Privates repro des Codes auf github mit public key der ec2.

Die nächsten Tage werde ich wohl hier noch am richtigen Entwurf arbeiten. Sobald das passt geht’s an die API. Wer will schon immer klicken.

Trotzdem Erfolge.

Der Spass darf natürlich nicht fehlen. Also habe ich die ACS mit minecraft getestet. Docker gebaut gepushed eingetragen und tada. Erstmal je Runde daddeln. Config anpassen bungecore dazu packen und 10 Server anschmeißen. Gut 10 laufen manuelles anpassen der ips etc… Ne danke morgen vielleicht 🙂 aber nun kann ich auf 10 Servern zocken.

WTF

Railo & Amazon EC2 Instanzen

Vor einiger Zeit habe ich mich mit der „on the Fly installation“ von Railo auf einer Amazon EC2 instanze beschäftigt. Dabei habe ich viele Ansätze für ein einfaches Setup gefunden, leider entsprach nichts davon meinen Vorstellungen.

Bei meinen Recherchen bemerkte ich, dass man einfach ein shell Script als UserData übergeben kann… endlose Möglichkeiten tun sich da auf.

Dabei bin ich auch über das railo_ec2 shell Script von @Amaroom gestolpert. Da die Version ein etwas altes Railo Paket installiert habe ich das Script kurzerhand geforkt und aktualisiert. Zu finden ist das ganze auf Github.com

Auch wenn sich das Script von selbst erklärt vielleicht ein paar Kommentare:

Der erste Befehl führt ein upgrade aus, so das die aws Linux Version auf dem neusten Stand gebracht wird.

Anschließend wird tomcat7 und git installiert und tomcat in den „autostart“ gepackt.

Nun wird das aktuelle Railo mit Curl gezogen und in den vorbereiteten Ordner verschoben und mit den Tomcat user und der Tomcat Gruppe versehen.

ab Zeile 43 wird ein wenig die Tomcat catalina config geändert. Hier werden der Pfad zu Railo gesetzt sowie mapping und welcome file definiert.

Zum Abschluss wird noch, zu demozwecken, eine index.cfm angelegt und tomcat gestartet.

Ab hier hat man nun frei Hand. Anstelle der index.cfm kann nun mit git clone ein Repositorie gezogen werden und in den webapps/ROOT ordner gelegt werden.
Ein Beispiel wäre:

git clone https://github.com/TiagoReis-Webdevit/demoCMS.git  /usr/share/tomcat7/webapps/ROOT

chown -R tomcat.tomcat /usr/share/tomcat7/webapps/ROOT/

um das TiagoReis demoCMS zu installieren.

Um sich den Ärger mit nicht gesetzten Passwörtern im Web-Admin zu ersparen kann eine entsprechend vorkonfigurierte railo-web.xml.cfm in den Ordner /usr/share/tomcat7/webapps/ROOT/WEB-INF/railo/ geladen werden.

Alternative und von mir bevorzugt kann auch eine server.xml, in der Serverpasswort und defaul web admin Passwort bereits gesetzt sind, in das Verzeichnis /usr/share/tomcat7/railo4/railo-server/context/ kopiert werden.
Vor dem ersten Aufruf des Railo Admins existiert dieser Ordner nicht und muss entsprechen mit mkdir angelegt werden.

Dort können auch Datenbanken und Mail Server installiert werden. Natürlich bietet sich hier auch die Nutzung der aws Dienste an. Ein awsWrapper ist hier zu finden, der ist etwas verbugt aber anpassbar. Ansonsten schreibe ich grad einen Wrapper der hier zu finden ist.

Und schon können x Passwort gesicherte Railo Instanzen mit einem Git Projekt gestartet werden. Um ein Update der Application auf die Server zu spielen braucht man nur noch alles ins git zu pushen und die neue Instanzen des alten Servers starten, nicht vergessen die alten zu terminieren. Mit einer AutoScalling Group benötigt man nur noch die terminierung der Instanzen.