Secret

A Secret in Kubernetes stores confidential data (in key-value pairs).

They allow you to:

  • Keep sensitive info out of Pod specs and Docker images.

  • Inject secrets into Pods securely (as env vars or mounted files).

Types of Secrets

  • Opaque (default) → generic key-value secrets

  • docker-registry → for private container registry credentials

  • tls → for SSL certificates

  • service-account-token → automatically created for service accounts

Commands

Create Secret from literal values:

kubectl create secret generic <secret-name> \
  --from-literal=db_password=123456\
  --from-literal=api_key=abcd1234

Create Secret from a file:

kubectl create secret generic <secret-name> --from-file=cert.pem

Example

secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: mysecret
data:
  db_password: MTIzNDU2   # "123456" base64 encoded
  api_key: YWJjZDEyMzQ=   # "abcd1234" base64 encoded

How to use in Deployment example 1 (Individual env variables):

deployment.yaml
...
spec:
  template:
    ...
    spec:
      containers:
        - name: myapp-container
          image: nginx:1.25
          ports:
            - containerPort: 80
          env:
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysecret   # name of the Secret
                  key: db_password

How to use in Deployment example 2 (Injected as a volume):

deployment.yaml
...
spec:
  template:
    ...
    spec:
      containers:
        - name: myapp-container
          image: nginx:1.25
          ports:
            - containerPort: 80
          volumeMounts:
            - mountPath: /etc/secret
              name: secret-volume
              readOnly: true
      volumes:
        - name: secret-volume
          secret:
            secretName: mysecret

This will mount files inside /etc/secret/db_user and /etc/secret/db_pass.

Last updated