Kubernetes Secrets

Secrets in Kubernetes speichern vertrauliche Daten wie Passwörter, API-Keys, und Zertifikate.

Base64-kodiert (nicht verschlüsselt!), sollten mit Encryption-at-Rest geschützt werden.


Secret erstellen

# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
data:
  # Base64-kodiert
  username: YWRtaW4=        # admin
  password: c2VjcmV0MTIz    # secret123
# Base64 kodieren
echo -n "admin" | base64
echo -n "secret123" | base64

# Aus Literal
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password=secret123

# Aus Datei
kubectl create secret generic tls-secret \
  --from-file=tls.key \
  --from-file=tls.crt

# TLS Secret
kubectl create secret tls tls-secret \
  --cert=tls.crt \
  --key=tls.key

# Docker Registry Secret
kubectl create secret docker-registry regcred \
  --docker-server=registry.example.com \
  --docker-username=user \
  --docker-password=pass

# Secrets anzeigen
kubectl get secrets
kubectl describe secret db-secret
# Values sind versteckt!

# Secret anzeigen (dekodiert)
kubectl get secret db-secret -o jsonpath='{.data.password}' | base64 -d

Secret Types

# Opaque (Standard)
type: Opaque

# TLS Certificate
type: kubernetes.io/tls

# Docker Registry
type: kubernetes.io/dockerconfigjson

# Basic Auth
type: kubernetes.io/basic-auth

# SSH Auth
type: kubernetes.io/ssh-auth

# Service Account Token
type: kubernetes.io/service-account-token

Secret in Pod verwenden

Als Umgebungsvariablen

apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
  - name: app
    image: myapp:v1
    env:
    - name: DB_USERNAME
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: username
    - name: DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: db-secret
          key: password

Als Volume

apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
  - name: app
    image: myapp:v1
    volumeMounts:
    - name: secrets
      mountPath: /etc/secrets
      readOnly: true

  volumes:
  - name: secrets
    secret:
      secretName: db-secret

Resultat:

/etc/secrets/
├── username  (Inhalt: admin)
└── password  (Inhalt: secret123)

ImagePullSecrets

apiVersion: v1
kind: Pod
metadata:
  name: app
spec:
  containers:
  - name: app
    image: registry.example.com/myapp:v1
  imagePullSecrets:
  - name: regcred

Best Practices

Secret Security

1. Encryption at Rest

# K8s Secrets sind nur base64, nicht verschlüsselt!
# Aktiviere Encryption-at-Rest in kube-apiserver

2. RBAC verwenden

# Limitiere Secret-Zugriff
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: secret-reader
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get", "list"]

3. Externe Secret Management

4. Nie in Git committen!

# ❌ Schlecht
git add secret.yaml

# ✅ Gut: Sealed Secrets, SOPS

Zusammenfassung

Kubernetes Secrets

  • Confidential: Passwörter, Keys, Tokens
  • Base64: Nicht verschlüsselt!
  • Types: Opaque, TLS, Docker Registry
  • Als Env: Umgebungsvariablen
  • Als Volume: Files in /etc/secrets
  • RBAC: Zugriff limitieren


Verwandte Konzepte