46 Secrets in Kubernetes

Secrets sind eine Möglichkeit, sensible Informationen wie Passwörter, OAuth Tokens und SSH Keys in Kubernetes zu speichern und zu verwalten. Sie werden verwendet, um vertrauliche Daten sicher und effizient innerhalb des Kubernetes Clusters an die Pods weiterzugeben.

46.1 Anwendungsfälle und Vorteile

Die primären Anwendungsfälle für Secrets umfassen:

Secrets bieten im Vergleich zu herkömmlichen Konfigurationsdateien oder Umgebungsvariablen einen höheren Sicherheitsgrad. Sie reduzieren das Risiko unbeabsichtigter Offenlegung sensibler Informationen.

46.2 Erstellung von Secrets

Secrets können imperativ über das kubectl Kommandozeilen-Tool oder deklarativ durch eine YAML-Konfigurationsdatei erstellt werden. Zum Beispiel:

kubectl create secret generic <secret-name> --from-literal=<key>=<value>

In einer YAML-Datei werden Secrets wie folgt definiert:

apiVersion: v1
kind: Secret
metadata:
  name: <secret-name>
type: Opaque
data:
  <key>: <base64-encoded-value>

Dabei ist zu beachten, dass die <base64-encoded-value> Werte Base64-kodiert sind, um Einhaltung des Formats zu gewährleisten.

46.3 Verwendung von Secrets

Secrets können in einem Pod auf verschiedene Weise genutzt werden:

46.3.1 Als Umgebungsvariable

Pods können Secrets als Umgebungsvariablen einbinden, so dass Anwendungen sie wie gewöhnliche Umgebungsvariablen nutzen können.

apiVersion: v1
kind: Pod
metadata:
  name: <pod-name>
spec:
  containers:
  - name: <container-name>
    image: <image-name>
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: <secret-name>
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: <secret-name>
            key: password

46.3.2 Über Volume Mounts

Secrets können als Volumes an den Pod angehängt und als Dateien im Container-Dateisystem eingesehen werden.

apiVersion: v1
kind: Pod
metadata:
  name: <pod-name>
spec:
  containers:
  - name: <container-name>
    image: <image-name>
    volumeMounts:
    - name: secret-volume
      mountPath: "/etc/secret"
      readOnly: true
  volumes:
  - name: secret-volume
    secret:
      secretName: <secret-name>

46.4 Sicherheit und Best Practices

Trotz der Verschlüsselung beim Speichern sollten Secrets sorgfältig gehandhabt werden:

Kubernetes speichert Secrets im etcd, einer verteilen Schlüssel-Wert-Datenbank, die bei den meisten Cluster-Einrichtungen standardmäßig verschlüsselt ist. Dies bietet eine zusätzliche Schutzschicht, aber die Sicherheitsmaßnahmen bei der Verwendung von Secrets sollten immer umfassend sein, um das Risiko einer Datenkompromittierung zu minimieren.

46.5 Beispiel

46.5.1 Secret Definition

Erstellen Sie zunächst das Secret db-credentials mit den Zugangsdaten für die Datenbank:

apiVersion: v1
kind: Secret
metadata:
  name: db-credentials
type: Opaque
data:
  user: c3FsYWRtaW4=  # base64 encoded 'sqladmin'
  pwd: aHJANDMkRUZyTA==  # base64 encoded 'hr@43$EFrL'

46.5.2 Pod Definition mit Umgebungsvariablen

Pod-Definition, die das Secret db-credentials als Umgebungsvariablen für einen Container verwendet:

apiVersion: v1
kind: Pod
metadata:
  name: backend-pod
spec:
  containers:
    - name: backend-container
      image: alpine
      command: ["sleep", "3600"]
      env:
        - name: DATABASE_USER
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: user
        - name: DATABASE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: pwd

46.5.3 Pod Definition mit Secret Volume Mount

Pod-Definition, die das Secret db-credentials als Volume einbindet:

apiVersion: v1
kind: Pod
metadata:
  name: frontend-pod
spec:
  containers:
  - name: frontend-container
    image: nginx
    volumeMounts:
    - name: config-volume
      mountPath: "/etc/config"
      readOnly: true
  volumes:
  - name: config-volume
    secret:
      secretName: db-credentials
      items:
      - key: user
        path: "credentials/username"
      - key: pwd
        path: "credentials/password"

In diesem Beispiel wird das Secret db-credentials als Volume config-volume an den Container frontend-container gebunden. Innerhalb des Containers werden die Zugangsdaten unter /etc/config/credentials/ als Dateien verfügbar gemacht.