Managing Secrets

1. Creating Generic Secret

kubectl create secret generic db \
  --from-literal=username=app \
  --from-literal=password='S3cr3t!'
SourceFlag
Literal--from-literal=K=V
File--from-file=key=path
Env file--from-env-file=.env

2. Creating TLS Secret

kubectl create secret tls www-tls \
  --cert=server.crt --key=server.key
KeyContent
tls.crtPEM-encoded cert (and chain)
tls.keyPEM-encoded private key

3. Creating Docker Registry Secret

kubectl create secret docker-registry ghcr \
  --docker-server=ghcr.io \
  --docker-username=USER \
  --docker-password=TOKEN \
  --docker-email=u@x.com
spec:
  imagePullSecrets:
  - { name: ghcr }

4. Encoding Secret Data

echo -n 'S3cr3t!' | base64                    # encode
echo 'UzNjcjN0IQ==' | base64 -d                # decode
FieldFormat
dataBase64-encoded
stringDataPlain text (encoded by apiserver)

5. Listing Secrets

kubectl get secrets
kubectl get secret db -o jsonpath='{.data.password}' | base64 -d
ColumnMeaning
TYPEOpaque, kubernetes.io/tls, etc.
DATANumber of keys

6. Describing Secret Details

Note: describe hides values; use get -o yaml with appropriate RBAC for inspection.
ActionRBAC verb
List nameslist on secrets
Read valuesget on secrets (restrict!)

7. Using Secrets as Environment Variables

env:
- name: DB_PASS
  valueFrom: { secretKeyRef: { name: db, key: password } }
envFrom:
- secretRef: { name: app-secrets }
Warning: Secrets in env may leak via process listings or logs. Prefer file mounts when feasible.

8. Mounting Secrets as Volumes

volumes:
- name: tls
  secret:
    secretName: www-tls
    defaultMode: 0400
volumeMounts:
- { name: tls, mountPath: /etc/tls, readOnly: true }
BehaviorDetail
tmpfsStored in RAM (no disk)
Auto-update~minute sync (no env)

9. Using imagePullSecrets

apiVersion: v1
kind: ServiceAccount
metadata: { name: default }
imagePullSecrets:
- { name: ghcr }
WhereScope
Pod specPer-pod
ServiceAccountAll pods using that SA

10. Updating Secrets

kubectl create secret generic db \
  --from-literal=password='NewP@ss' \
  --dry-run=client -o yaml | kubectl apply -f -
kubectl rollout restart deploy/web
StrategyEffect
Volume mountAuto-updates (~minute)
Env varRequires pod restart
Stakater ReloaderAuto rollout on Secret/CM change

11. Understanding Secret Types

TypeUse
OpaqueGeneric (default)
kubernetes.io/tlsTLS cert/key
kubernetes.io/dockerconfigjsonRegistry auth
kubernetes.io/basic-authusername/password
kubernetes.io/ssh-authSSH private key
kubernetes.io/service-account-tokenSA token (mostly auto)
bootstrap.kubernetes.io/tokenBootstrap tokens

12. Deleting Secrets

kubectl delete secret db
kubectl delete secret -l env=dev
Warning: Enable encryption-at-rest (EncryptionConfiguration with AES-CBC/KMS) for true secret protection in etcd.