Secrets

Auf dieser Seite werden das Secret-Objekt in Kubernetes und seine Verwendung in Google Kubernetes Engine (GKE) beschrieben.

Was ist ein Secret?

Secrets sind sichere Objekte, die vertrauliche Daten wie Passwörter, OAuth-Token und SSH-Schlüssel in Ihren Clustern speichern. Das Speichern sensibler Daten in Secrets ist sicherer als ConfigMaps im Klartext oder in Pod-Spezifikationen. Mithilfe von Secrets können Sie steuern, wie sensible Daten verwendet werden, und das Risiko verringern, dass die Daten nicht autorisierten Nutzern zugänglich gemacht werden.

Mit einem von Ihnen in Cloud KMS verwalteten Schlüssel können Sie Secrets auch auf der Anwendungsebene verschlüsseln. Weitere Informationen finden Sie unter Verschlüsselung von Secrets auf Anwendungsebene.

Secret erstellen

Sie erstellen ein Secret mit kubectl create secret:

kubectl create secret type name data

Dabei gilt:

  • type kann einer der folgenden Werte sein:

    • generic: Erstellt ein Secret aus einer lokalen Datei, einem Verzeichnis oder einem Literalwert.
    • docker-registry: Erstellt ein dockercfg-Secret zur Verwendung mit einer Docker-Registry. Wird zur Authentifizierung bei Docker-Registrys verwendet.
    • tls: Erstellt ein TLS-Secret aus dem angegebenen Schlüsselpaar mit öffentlichem und privatem Schlüssel. Das Schlüsselpaar mit öffentlichem und privatem Schlüssel muss vorher vorhanden sein. Das Zertifikat für den öffentlichen Schlüssel muss PEM-codiert sein und mit dem angegebenen privaten Schlüssel übereinstimmen.

    Für die meisten Secrets verwenden Sie den Typ generic.

  • name ist der Name des Secrets, das Sie erstellen.

  • data kann Folgendes sein:

    • Ein Pfad zu einem Verzeichnis, das eine oder mehrere Konfigurationsdateien enthält und mit dem Flag --from-file oder --from-env-file angegeben wird
    • Schlüssel/Wert-Paare, die jeweils mit Flags vom Typ --from-literal angegeben werden

Weitere Informationen zu kubectl create finden Sie in der Referenzdokumentation.

Alternativ können Sie zum Erstellen eines Secrets ein Secret-Objekt in einer YAML-Manifestdatei definieren und mithilfe des folgenden Befehls bereitstellen:

kubectl create -f file-name.yaml

Ein Beispiel finden Sie unter Anmeldedaten mit Secrets sicher verteilen.

Aus Dateien

Verwenden Sie --from-file oder --from-env-file, um ein Secret aus einer oder mehreren Dateien zu erstellen. Die Datei muss im Klartextformat vorliegen, doch die Dateierweiterung spielt keine Rolle.

--from-file

Wenn Sie das Secret mit --from-file erstellen, entspricht der Wert des Secrets dem gesamten Inhalt der Datei. Wenn der Wert des Secrets mehrere Schlüssel/Wert-Paare enthält, verwenden Sie stattdessen --from-env-file.

Sie können eine einzelne Datei oder mehrere Dateien übergeben:

kubectl create secret type name --from-file /path/to/file --from-file /path/to/file2

Sie können auch ein Verzeichnis übergeben, das mehrere Dateien enthält:

kubectl create secret type name --from-file /path/to/directory

Mit dem folgenden Befehl wird beispielsweise aus den zwei Dateien username.txt und password.txt ein Secret mit dem Namen credentials erstellt. Als Schlüssel werden username.txt oder password.txt festgelegt:

kubectl create secret generic credentials --from-file ./username.txt --from-file ./password.txt

Die Secret-Werte in Kubernetes sind base64-codiert.

Durch Ausführung von kubectl get secret credentials -o yaml wird die folgende Ausgabe zurückgegeben:

apiVersion: v1
data:
  password.txt: MTIzNAo=
  username.txt: YWRtaW4K
kind: Secret
metadata:
  creationTimestamp: ...
  name: credentials
  namespace: default
  resourceVersion: "2011810"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: ...
type: Opaque

Standardmäßig ist der Schlüssel der Dateiname. Sie können den Schlüssel mithilfe der erweiterten Syntax für --from-file überschreiben:

kubectl create secret type name --from-file=key=/path/to/directory

Im folgenden Beispiel wird aus den zwei Dateien "username.txt" und "password.txt" ein Secret namens "credentials" erstellt und die Schlüssel werden auf username und password gesetzt, statt die Dateinamen zu verwenden:

kubectl create secret generic credentials --from-file=username=./username.txt --from-file=password=./password.txt

--from-env-file

Wenn Sie mehrere Schlüssel/Wert-Paare in ein einzelnes Secret laden möchten, speichern Sie die Schlüssel/Wert-Paare in einer oder mehreren Klartextdateien und laden Sie sie mit --from-env-file statt mit --from-file. Zum Laden mehrerer Dateien geben Sie das Flag einfach mehrmals an. Es gelten dieselben Einschränkungen wie bei --from-file.

Mit dem folgenden Befehl wird beispielsweise aus einer einzigen Datei namens credentials.txt, die mehrere Schlüssel/Wert-Paare enthält, ein Secret namens credentials erstellt:

# Each of these key-value pairs is loaded into the Secret
username=jane
password=d7xnNss7EGCFZusG

Die Secret-Werte in Kubernetes sind base64-codiert.

kubectl create secret generic credentials --from-env-file ./credentials.txt

Durch Ausführung von kubectl get secret credentials -o yaml wird die folgende Ausgabe zurückgegeben:

apiVersion: v1
data:
  password: ZDd4bk5zczdFR0NGWnVzRw==
  username: amFuZQ==
kind: Secret
metadata:
  creationTimestamp: 2019-06-04T15:39:27Z
  name: credentials
  namespace: default
  resourceVersion: "14507319"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: efce376b-86de-11e9-9742-42010a80022f
type: Opaque

Beschränkungen

Nicht reguläre Dateien wie Symlinks, Geräte und Verbindungen werden von kubectl ignoriert. Unterverzeichnisse werden ebenfalls ignoriert. kubectl create secret durchsucht keine Unterverzeichnisse.

Aus Literalwerten

Verwenden Sie --from-literal, um ein Secret aus Literalwerten zu erstellen.

Mit dem folgenden Befehl wird beispielsweise ein generisches Secret namens literal-token mit zwei Schlüssel/Wert-Paaren erstellt:

kubectl create secret generic literal-token --from-literal user=admin --from-literal password=1234

Sie geben --from-literal für jedes Schlüssel/Wert-Paar an. Die Werte werden automatisch Base64-codiert.

Die Ausführung von kubectl get secret literal-token -o yaml gibt die folgende Ausgabe zurück.

apiVersion: v1
data:
  password: MTIzNA==
  user: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: ...
  name: literal-token
  namespace: default
  resourceVersion: "2012831"
  selfLink: /api/v1/namespaces/default/secrets/literal-token
  uid: ...
type: Opaque

Beachten Sie in der vorherigen Ausgabe, dass password und user base64-codiert sind. Die base64-Codierung ermöglicht die Verarbeitung der Informationen durch Anwendungen und Dienste, die bestimmte Zeichen nicht lesen können. Die base64-Codierung bietet keine Sicherheit.

Secret verwenden

Zum Verwenden eines Secrets für Ihre Arbeitslasten können Sie Umgebungsvariablen angeben, die auf die Werte des Secret verweisen oder ein Volume bereitstellen, das das Secret enthält.

Weitere Informationen zur Verwendung von Secrets finden Sie unter Secrets verwenden.

Weitere Informationen