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.
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.
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.
Secrets können in einem Pod auf verschiedene Weise genutzt werden:
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: passwordSecrets 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>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.
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'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: pwdPod-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.