Kubernetes Secrets vs ConfigMaps

71

Ich habe Kubernetes Geheimnisse auf dem neuesten Stand verwendet. Jetzt haben wir auch ConfigMaps.

Was ist der bevorzugte Weg nach vorne - Geheimnisse oder Konfigurationskarten?

PS Nach einigen Iterationen haben wir uns bei folgender Regel stabilisiert:

  • configMaps sind pro Lösungsdomäne (können von Microservices innerhalb der Domäne gemeinsam genutzt werden, sind jedoch letztendlich Konfigurationseinträge für einen bestimmten Zweck).

  • Geheimnisse werden über Lösungsdomänen hinweg geteilt und repräsentieren normalerweise Systeme oder Datenbanken von Drittanbietern

Evgeny Minkevich
quelle

Antworten:

140

Ich bin der Autor dieser beiden Funktionen. Die Idee ist, dass Sie:

  1. Verwenden Sie Geheimnisse für Dinge, die tatsächlich geheim sind, wie API-Schlüssel, Anmeldeinformationen usw.
  2. Verwenden Sie ConfigMaps für nicht geheime Konfigurationsdaten

In Zukunft wird es wahrscheinlich einige Unterscheidungsmerkmale für Geheimnisse wie Rotation oder Unterstützung für das Sichern der geheimen API mit HSMs usw. geben. Im Allgemeinen mögen wir absichtsbasierte APIs, und die Absicht ist definitiv anders für geheime Daten als für einfache alte Konfigurationen.

Hoffentlich hilft das.

Paul Morie
quelle
5
Eine hoffentlich klärende Frage. Denn es scheint, als würden Geheimnisse immer noch als einfacher Text (base64) gespeichert, so dass die Benennung im Moment etwas irreführend sein könnte, wenn Sie mich seitdem fragen. Oder könnten Sie das näher erläutern? Ich stimme zu, dass die absichtsbasierte API der richtige Weg ist.
Tomas Jansson
19
Ist es möglich, ein Geheimnis in einer Konfigurationszuordnung zu verwenden? Es ist durchaus üblich, dass eine Anwendungskonfigurationsdatei sowohl geheime als auch nicht geheime Daten enthält. Zum Beispiel enthält die tomcat server.xml sowohl Portnummern (nicht geheim) als auch das Kennwort zum Herunterfahren (geheim) ... Es wäre schön, das als einzelne Ressource darzustellen ...
Lucas
1
Sollte jede Verbindungszeichenfolge ein eigenes Geheimnis sein, oder sollte ich so etwas wie ein "ConnectionStrings" -Geheimnis haben, das alle enthält?
SG
3
@PaulMorie, am Ende habe ich ein Dienstprogramm geschrieben, das die Yamswurzeln zusammenführt, um meinen Bedürfnissen gerecht zu werden. Daher versorgen wir unsere Container mit einem ConfigMap-Yaml mit allen nicht geheimen Werten und einem Secret Yaml mit den geheimen Werten. Verwenden Sie dies dann, um sie zusammenzuführen und als einzelne Konfiguration darzustellen. Funktioniert hervorragend für sich oder mit anderen Tools (wie confd ) ...
Lucas
1
Das ist wirklich cool @Lucas, ich denke viele Leute würden sich dafür interessieren. Das solltest du irgendwann bei sig-apps zeigen!
Paul Morie
3

Sowohl ConfigMaps als auch Secrets speichern Daten als Schlüsselwertpaar. Der Hauptunterschied besteht darin, dass Secrets Daten im Base64- Format speichern, während ConfigMaps Daten im Klartext speichert .

Wenn Sie wichtige Daten wie Schlüssel, Kennwörter, Anmeldeinformationen für Dienstkonten, Datenbankverbindungszeichenfolge usw. haben, sollten Sie sich immer für Secrets und nicht für Configs entscheiden.

Wenn Sie eine Anwendungskonfiguration mit Umgebungsvariablen durchführen möchten, die Sie nicht geheim halten möchten, z. B. App-Thema, URL der Basisplattform usw., können Sie sich für ConfigMaps entscheiden

Mohsin
quelle
5
Wie schützt base64 die Geheimnisse? Es ist nur kinderleicht, kein Schutz.
Igor A. Melekhine
1
base64 ist überhaupt kein Schutz.
MEMark
1

Ein bemerkenswerter Unterschied in der Implementierung ist, dass kubectl apply -f:

  • ConfigMaps sind "unverändert", wenn sich die Daten nicht geändert haben.
  • Geheimnisse werden immer "konfiguriert" - auch wenn sich die Datei nicht geändert hat
Michael Cole
quelle