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.
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.