K8s em Exemplos: Secrets

Secrets armazenam dados sensíveis: senhas, tokens, chaves. Codificados em base64 por padrão (não criptografados!). Em produção, habilite encryption at rest e considere gerenciadores externos como Vault ou AWS Secrets Manager.

secret.yaml

Secrets usam a API core v1. Valores em data devem ser codificados em base64. Use echo -n “password” | base64 para codificar.

apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  DB_PASSWORD: cGFzc3dvcmQ=
  API_KEY: c2VjcmV0LWtleQ==
secret-stringdata.yaml

Use stringData para evitar codificação base64 manual - Kubernetes codifica automaticamente. Você pode misturar data e stringData no mesmo Secret.

apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
stringData:
  DB_PASSWORD: "my-actual-password"
  API_KEY: "my-api-key"
  config.yaml: |
    database:
      host: postgres
      port: 5432
secret-types.yaml

Tipos de Secret fornecem estrutura e validação. Opaque é genérico. Tipos built-in incluem TLS, docker-registry, basic-auth e ssh-auth com chaves obrigatórias.

apiVersion: v1
kind: Secret
type: kubernetes.io/tls
metadata:
  name: tls-secret
data:
  tls.crt: <base64-cert>
  tls.key: <base64-key>
---
apiVersion: v1
kind: Secret
type: kubernetes.io/basic-auth
stringData:
  username: admin
  password: secret123
pod-secret-env.yaml

Injete secrets como variáveis de ambiente. Mesmo padrão de ConfigMaps. Use optional: true para permitir startup do Pod se o secret não existir.

spec:
  containers:
    - name: app
      envFrom:
        - secretRef:
            name: app-secrets
            optional: true
      env:
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: app-secrets
              key: DB_PASSWORD
pod-secret-volume.yaml

Monte secrets como arquivos. Arquivos são armazenados em tmpfs (RAM, não disco). Defina permissões apropriadas com defaultMode. Use items para montar chaves específicas.

spec:
  containers:
    - name: app
      volumeMounts:
        - name: certs
          mountPath: /etc/ssl/certs
          readOnly: true
  volumes:
    - name: certs
      secret:
        secretName: tls-certs
        defaultMode: 0400
        items:
          - key: tls.crt
            path: server.crt
terminal

Secrets de docker registry autenticam pulls de imagens de registries privados. Crie com kubectl ou declarativamente.

$ kubectl create secret docker-registry regcred \
    --docker-server=ghcr.io \
    --docker-username=user \
    --docker-password=token
secret/regcred created

Referencie no spec do Pod com imagePullSecrets. Também pode ser anexado a uma ServiceAccount para uso automático.

spec:
  imagePullSecrets:
    - name: regcred
  containers:
    - name: app
      image: ghcr.io/org/private-app:v1
encryption-config.yaml

Encryption at rest protege Secrets no etcd. Sem ela, Secrets são apenas base64-encoded (facilmente decodificados). Configure EncryptionConfiguration no API server.

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
      - secrets
    providers:
      - aescbc:
          keys:
            - name: key1
              secret: <base64-32-byte-key>
      - identity: {}
terminal

Boas práticas: use RBAC para restringir acesso a Secrets, evite commit no Git (use sealed-secrets), rotacione credenciais regularmente. Secrets são namespaced.

$ kubectl get secret app-secrets -o yaml
apiVersion: v1
kind: Secret
data:
  DB_PASSWORD: cGFzc3dvcmQ=
...

$ kubectl get secret app-secrets \
    -o jsonpath='{.data.DB_PASSWORD}' | base64 -d
password

$ kubectl get secrets --all-namespaces
NAMESPACE   NAME          TYPE     DATA   AGE
default     app-secrets   Opaque   2      5m
kube-system coredns       Opaque   0      30d

Índice | GitHub | Use as setas do teclado para navegar |