Jekyll2022-06-01T09:16:36+02:00https://www.dhoppe.it/feed.xmldhoppe IT CONSULTINGBeratung, Betrieb und Schulungen in den Bereichen Backup, Hochverfügbarkeit, Konfigurationsmanagement, Logging, Mailserver, Monitoring, Virtualisierung und Webserver.Dennis HoppeConsul - Entdecken und Konfigurieren von Services2015-02-09T00:00:00+01:002015-02-09T00:00:00+01:00https://www.dhoppe.it/posts/2015/02/09/consul-entdecken-und-konfigurieren-von-services<p>Mit Hilfe von <a href="https://consul.io" title="Consul" rel="nofollow" target="_blank">Consul</a> ist es möglich die
Bereiche <em>Service Discovery</em>, <em>Health Checking</em> und <em>Key/Value Store</em>
miteinander zu kombinieren. Während <em>Service Discovery</em> ermittelt, von welchen
Nodes ein Service wie zum Beispiel Web zur Verfügung gestellt wird, prüft
<em>Health Checking</em> in welchem Zustand sich die einzelnen Nodes befinden. Davon
abhängig entscheidet <em>Service Discovery</em>, ob die betreffende Node beim Routing
des Traffic berücksichtigt wird. Anschließend wird der <em>Key/Value Store</em>
genutzt, um intakte Nodes bei der dynamischen Konfiguration des Loadbalancer zu
berücksichtigen.</p>
<p>Mit dem Befehl <code class="language-plaintext highlighter-rouge">consul agent -bootstrap-expect 1 -data-dir /tmp/consul
-server</code> oder <code class="language-plaintext highlighter-rouge">consul agent -data-dir /tmp/consul</code> wird der <em>Agent</em> als
Server bzw. Client gestartet. Damit es nicht zum Ausfall, Datenverlust oder
Split Brain kommt, sollten drei bis fünf Server pro Rechenzentrum betrieben
werden. Die Kommunikation zwischen den Servern und den Clients erfolgt über das
Gossip-Protokoll von <a href="https://serfdom.io" title="Serf" rel="nofollow" target="_blank">Serf</a>, wobei die
Server und die Clients der einzelnen Rechenzentren einen LAN Pool bilden und die
Server aller Rechenzentren einen WAN Pool.</p>
<p>Die Konfiguration des <em>Agent</em> erfolgt im Verzeichnis <code class="language-plaintext highlighter-rouge">/etc/consul.d</code> und die
darin enthaltenen Dateien mit der Endung <code class="language-plaintext highlighter-rouge">.json</code> werden beim Start in
alphabetischer Reihenfolge geladen. Für den Fall, dass mehr als ein
Rechenzentrum betrieben wird, sollte die Kommunikation über das Gossip-Protokoll
und das RPC-Protokoll mit einem statischen Schlüssel bzw. TLS-Zertifikat
verschlüsselt werden. Damit der <em>Agent</em> nach dem Neustart einer Node automatisch
gestartet wird, muss ein Init-Skript erstellt und in den betreffenden Runlevel
aufgenommen werden.</p>
<p>Eine Interaktion mit den Servern ist über mehrere Schnittstellen möglich. Der
Befehl <code class="language-plaintext highlighter-rouge">consul join 192.168.56.20</code> nutzt zum Beispiel das RPC-Protokoll, um
eine Node in den Cluster aufzunehmen. Während der Befehl <code class="language-plaintext highlighter-rouge">curl
localhost:8500/v1/catalog/nodes</code> die HTTP API nutzt, um die Mitglieder eines
Cluster aufzulisten, verwendet der Befehl <code class="language-plaintext highlighter-rouge">dig @localhost -p 8600
server01.node.consul</code> das DNS Interface, um die IP-Adresse einer bestimmten
Node zu ermitteln.</p>
<p>Obwohl <a href="https://www.chef.io" title="Chef" rel="nofollow" target="_blank">Chef</a> und
<a href="https://puppet.com" title="Puppet" rel="nofollow" target="_blank">Puppet</a> eine ähnliche Funktionalität
bieten, ist Consul in der Lage schneller auf neue oder fehlerhafte Nodes zu
reagieren. Denn das Intervall, mit dem die <a href="https://learn.hashicorp.com/consul/developer-discovery/health-checks" title="Consul - Health Checks" rel="nofollow" target="_blank">Health
Checks</a> durchgeführt werden, beträgt oft
nur einige Sekunden und nicht 30 Minuten. Außerdem kann <code class="language-plaintext highlighter-rouge">consul exec [options]
[-|command...]</code> genutzt werden, um die Nodes nach Name, Service oder Tag zu
filtern und dort einen Befehl auszuführen.</p>
<p>Zum Schluss möchte ich noch auf ein paar Projekte verweisen:</p>
<ul>
<li><a href="https://github.com/hashicorp/envconsul" title="Envconsul" rel="nofollow" target="_blank">Envconsul</a> wird genutzt, um die Daten
von Consul als Umgebungsvariable zur Verfügung zu stellen und beim Start eines
Dienstes zu berücksichtigen.</li>
<li><a href="https://github.com/hashicorp/consul-template" title="Consul Template" rel="nofollow" target="_blank">Consul Template</a> wird genutzt, um die
Daten von Consul an eine Template Engine zu übergeben und anschließend einen
Neustart des Dienstes durchzuführen.</li>
<li><a href="https://learn.hashicorp.com/consul/getting-started/ui" title="Consul - Web UI" rel="nofollow" target="_blank">Consul Web UI</a> wird verwendet, um den
Status der einzelnen Nodes, Services, Key/Value Paare und ACL zu erhalten.
Eine Darstellung pro Rechenzentrum ist ebenfalls möglich.</li>
<li>
<p>Das Puppet Modul von <a href="https://github.com/solarkennedy/puppet-consul" title="Puppet Modul" rel="nofollow" target="_blank">Kyle Anderson</a>
wird benötigt, um Consul zu installieren und anschließend als Server oder
Client inkl. Services zu konfigurieren.</p>
</li>
</ul>Dennis HoppeMit Hilfe von Consul ist es möglich die Bereiche Service Discovery, Health Checking und Key/Value Store miteinander zu kombinieren. Während Service Discovery ermittelt, von welchen Nodes ein Service wie zum Beispiel Web zur Verfügung gestellt wird, prüft Health Checking in welchem Zustand sich die einzelnen Nodes befinden. Davon abhängig entscheidet Service Discovery, ob die betreffende Node beim Routing des Traffic berücksichtigt wird. Anschließend wird der Key/Value Store genutzt, um intakte Nodes bei der dynamischen Konfiguration des Loadbalancer zu berücksichtigen.Terraform - Infrastruktur als Code2015-02-02T00:00:00+01:002015-02-02T00:00:00+01:00https://www.dhoppe.it/posts/2015/02/02/terraform-infrastruktur-als-code<p>Mit Hilfe von <a href="https://terraform.io" title="Terraform" rel="nofollow" target="_blank">Terraform</a> ist es möglich
die Infrastruktur für einzelne Anwendungen oder ganze Rechenzentren als Code zu
beschreiben, zu versionieren und bei Bedarf für andere Projekte
wiederzuverwenden.</p>
<p>Die Konfiguration der einzelnen Ressourcen erfolgt in Dateien, wie zum Beispiel
<code class="language-plaintext highlighter-rouge">example.tf</code> und Variablen werden in der Datei <code class="language-plaintext highlighter-rouge">variables.tf</code>
gespeichert. Sensible Daten sollten jedoch in der Datei <code class="language-plaintext highlighter-rouge">terraform.tfvars</code>
ausgelagert und von der Versionierung ausgeschlossen werden.</p>
<p>Der Befehl <code class="language-plaintext highlighter-rouge">terraform plan</code> erstellt einen sogenannten <em>Execution Plan</em>.
Dieser zeigt, welche Änderungen beim Ausführen des Befehls <code class="language-plaintext highlighter-rouge">terraform apply</code>
vorgenommen werden. Grün, Gelb und Rot stehen jeweils für neue, veränderte oder
gelöschte Ressourcen.</p>
<p>Mit dem Befehl <code class="language-plaintext highlighter-rouge">terraform apply</code> wird die zuvor definierte Infrastruktur
erstellt und deren Status in der Datei <code class="language-plaintext highlighter-rouge">terraform.tfstate</code> gespeichert. Ein
Blick in die Datei oder der Befehl <code class="language-plaintext highlighter-rouge">terraform show</code> geben Auskunft über den
aktuellen Status und die jeweiligen Metadaten.</p>
<p>Da es sich um eine deklarative Konfiguration handelt, ist Terraform in der Lage,
Abhängigkeiten zu erkennen und diese bei der Ausführung zu berücksichtigen bzw.
einzelne Ressourcen parallel zu erstellen.</p>
<p>Für den Fall einer Demo oder einer Entwicklungsumgebung kann die Infrastruktur
mit dem Befehl <code class="language-plaintext highlighter-rouge">terraform destroy</code> auch wieder gelöscht werden.</p>
<p>Obwohl <a href="https://aws.amazon.com/de/" title="Amazon Web Services" rel="nofollow" target="_blank">Amazon Web Services</a> mit
<a href="https://aws.amazon.com/de/cloudformation/" title="Amazon Web Services - CloudFormation" rel="nofollow" target="_blank">CloudFormation</a> eine ähnliche
Funktionalität bietet, besticht Terraform durch seine Vielzahl von
<a href="https://terraform.io/docs/providers/index.html" title="Terraform - Provider" rel="nofollow" target="_blank">Providern</a>. Dadurch ist es zum Beispiel
möglich, die Infrastruktur auf einen anderen Provider zu migrieren oder sogar
mehrere Provider gleichzeitig zu nutzen.</p>
<p>Zum Schluss möchte ich noch auf die verschiedenen
<a href="https://terraform.io/docs/provisioners/index.html" title="Terraform - Provisioner" rel="nofollow" target="_blank">Provisioner</a> verweisen, mit deren Hilfe
Dateien kopiert oder Befehle ausgeführt werden können. Die Installation
zusätzlicher Software oder die Anbindung an Konfigurationsmanagement Tools wie
zum Beispiel <a href="https://www.chef.io" title="Chef" rel="nofollow" target="_blank">Chef</a> oder
<a href="https://puppet.com" title="Puppet" rel="nofollow" target="_blank">Puppet</a> sind also auch kein Problem.</p>Dennis HoppeMit Hilfe von Terraform ist es möglich die Infrastruktur für einzelne Anwendungen oder ganze Rechenzentren als Code zu beschreiben, zu versionieren und bei Bedarf für andere Projekte wiederzuverwenden.