Zum Hauptinhalt springen

Konfigurationsebenen

Eine Deploio-Applikation kann über viele verfügbare Optionen angepasst werden. Diese Optionen können auf unterschiedlichen Konfigurationsebenen definiert werden. Alle Konfigurationsebenen werden am Ende in einer spezifischen Reihenfolge zusammengeführt, wodurch die endgültige Konfiguration der Applikation bestimmt wird. Die folgenden Sektionen geben einen Überblick über das verwendete Konfigurationssystem.

Verfügbare Konfigurationsebenen

Die nachfolgend aufgeführten Konfigurationsstufen (geordnet nach Relevanz) sind verfügbar:

  • Applikations-Konfiguration
  • YAML-Konfiguration in Git
  • Projektkonfiguration
  • Organisationskonfigursation
  • Globale Standardkonfiguration

Um die finale Konfiguration der Applikation zu erhalten, werden alle Ebenen von oben nach unten zusammengeführt. Optionen, welche auf höheren Ebenen gesetzt wurden, überschreiben dabei die Werte welche auf niedrigeren Stufen definiert wurden. Die endgültige Konfiguration wird dann dem neuesten Release der Applikation angehangen.

config merging

Applikations-Konfiguration

Die Konfiguration, welche direkt auf der Deploio-Applikation vorgenommen wird, entspricht der Konfiguration mit der höchsten Relevanz. Sie wird "Applikations-Konfiguration" gennant. Alle Optionen/Werte, welche auf den unteren Ebenen definiert werden, können durch die "Applikations-Konfiguration" überschrieben werden.

Sie können die Applikations-Konfiguration mithilfe von nctl anzeigen:

$> nctl get app go -o yaml
kind: Application
apiVersion: apps.nine.ch/v1alpha1
metadata:
name: go
spec:
forProvider:
...
config:
size: mini
env:
- name: MYDATABASE
value: test
port: null
replicas: null
...

Der Inhalt der Applikations-Konfiguration kann unter dem YAML-Schlüssel spec.forProvider.config gefunden werden. Im obigen Beispiel wird eine Applikationsgrösse von "mini" gesetzt. Zusätzlich wurde eine Umgebungsvariable definiert. Die "port"-Option der Konfiguration wurde auf null gesetzt, was bedeutet, dass dieser Wert durch tiefer liegende Konfigurationsebenen überschrieben werden kann. Das Gleiche gilt für den Wert des "replicas"-Feldes.

Änderungen an der Applikations-Konfiguration können über unser CLI nctl (nctl update app) oder über https://cockpit.nine.ch durchgeführt werden.

YAML-Konfiguration in Git

Die Konfiguration kann auch über eine Datei namens .deploio.yaml angewandt werden. Diese Datei können Sie direkt neben Ihrem Applikations-Quellcode im Versionsverwaltungssystem Git ablegen. Unser Build-System prüft den Applikationscode auf die Existenz dieser Datei, um sie bei Bedarf auszulesen.

size: micro
port: 5678
replicas: 1
env:
- name: RESPONSE_TEXT
value: "Hello from a Go Deploio app!"

Wie bereits weiter oben erwähnt, kann die direkte "Applikations-Konfiguration" die Werte, welche in der .deploio.yaml-Datei spezifiziert wurden, überschreiben.

Eine aktuelle Liste mit allen Feldern, welche in der .deploio.yaml-Datei verwendet werden können, finden Sie in unserer API Dokumentation.

Projekt-Konfiguration

Mithilfe von Projekten können Resourcen in verschiedene logische Einheiten gegliedert werden. Neben Resourcen wie on-demand-Datenbanken oder Kubernetes- Clustern können Projekte auch Deploio-Applikationen beinhalten. Zusätzlich kann pro Projekt eine Konfiguration gesetzt werden, welche für alle Deploio- Applikationen im Projekt gilt. Dies wird "Projekt-Konfiguration" genannt. Die Projekt-Konfiguration für Deploio-Applikationen kann mit dem Befehl nctl create config erstellt weden.

$ nctl create config --env=RAILS_ENV=dev -p acme-dev

Das obige Beispiel erstellt eine Konfiguration im Projekt acme-dev und definiert dabei eine Umgebungsvariable RAILS_ENV mit dem Wert "dev". Alle im Projekt acme-dev erstellten Applikationen haben nun eine Umgebungsvariable namens RAILS_ENV definiert. Der Wert der Umgebungsvariable kann noch auf höheren Konfigurations-Ebenen überschrieben werden.

Organisations-Konfiguration

In jeder Organisation existiert ein Projekt, welches den Namen der Organisation selbst trägt. Dieses Projekt kann nicht entfernt werden und dient als Standard- Projekt. Erstellt man eine Deploio-Projekt-Konfiguration in diesem Standardprojekt, so spricht man von der Organisations-Konfiguration. Die Organisations-Konfiguration wird von allen Deploio-Applikationen genutzt, egal in welchem Projekt sich die Applikation befindet. Die Erstellung einer Organisations-Konfiguration ähnelt der einer Projekt-Konfiguration. Es muss lediglich der Organisationsname als Projektname verwendet werden.

$ nctl create config --size=mini -p acme

Das obige Beispiel definiert eine Organisations-Konfiguration für die Organisation acme, welche eine Applikationsgrösse von "mini" definiert. Diese Applikationsgrösse wird von allen Deploio-Applikationen genutzt werden (egal in welchem Projekt sich diese befinden), solange keine höhere Konfigurationsebene die Einstellung überschreibt.

Globale Standardkonfiguration

Jedes Konfigurationsfeld besitzt einen globalen Standardwert, welcher genutzt wird, falls keine Konfigurationsebene einen Wert für das Feld definiert. Die entsprechenden Werte können in unseren API- Definitionen nachgeschaut werden. Sie werden in der Variablen DefaultConfig gespeichert.

Details der Konfigurationszusammenführung

Konfigurationsfelder mit Einzelwerten (wie beispielsweise "size" oder "port") werden direkt von höheren Konfigurationsebenen überschrieben. Definiert beispielsweise eine Projekt-Konfiguration den Wert "mini" für das Feld "size", so kann eine einzelne Applikation von diesem Wert abweichen, indem sie einen anderen Wert in der Applikations-Konfiguration oder der YAML-Konfiguration in Git spezifiziert.

Umgebungsvariablen werden über einen anderen Mechanismus zusammengeführt. Variablen welche, in einer höheren Konfigurationsebene definiert wurden, werden zu denen hinzugefügt, welche in tieferen Ebenen deklariert sind. Falls Umgebungsvariablen mit dem gleichen Namen in mehreren Ebenen definiert wurden, so gewinnt der Wert der höchsten Konfigurationsebene. Es ist derzeitig nicht möglich, Umgebungsvariablen zu entfernen, welche in tieferen Konfigurationsebenen definiert wurden.

Betrachten der zusammengeführten Konfiguration

Die zusammengeführte Konfiguration kann dem aktuellen Release der Applikation entnommen werden.

$ nctl get app go -o yaml

kind: Application
apiVersion: apps.nine.ch/v1alpha1
metadata:
name: go
...
status:
atProvider:
latestRelease: finer-penance-sd78n
...

Der Name des aktuellen Releases befindet sich im YAML-Schlüssel status.atProvider.latestRelease.

Nun kann die zusammengeführte Konfiguration für dieses Release wiederum mittels nctl angezeigt werden.

$ nctl get release finer-penance-sd78n -o yaml

kind: Release
apiVersion: apps.nine.ch/v1alpha1
metadata:
name: finer-penance-sd78n
...
spec:
forProvider:
configuration:
size:
size: mini
origin: application
env:
- value:
name: RESPONSE_TEXT
value: Hello from a Go Deploio app!
origin: git
- value:
name: MYDATABASE
value: test
origin: application
port:
value: 5678
origin: git
replicas:
value: 1
origin: git
enableBasicAuth:
value: false
origin: default
...

Sie können die Konfiguration dem YAML-Schlüssel spec.forProvider.configuration entnehmen. Dabei wird für jedes Feld der Konfiguration die Ebene angezeigt, in welcher der Wert spezifiziert wurde (Feld origin). Im obigen Beispiel wurde die Umgebungsvariable RESPONSE_TEXT in der Datei .deploio.yaml definiert (YAML-Git-Konfiguration), währenddessen die Umgebungsvariable MYDATABASE direkt der Applikations-Konfiguration entspringt. Ein Wert für Basic-Authentifizierung wurde nicht extra gesetzt, wodurch der globale Standardwert genutzt wird.