Working with Projected Volumes

1. Understanding Projected Volumes

Combine multiple volume sources (Secrets, ConfigMaps, downwardAPI, SA tokens) into a single directory.

Source TypeUse
secretPick keys from Secret
configMapPick keys from ConfigMap
downwardAPIPod metadata as files
serviceAccountTokenBound, audience-scoped token
clusterTrustBundle NEWCluster CA bundle (1.29+)

2. Projecting Secrets

volumes:
- name: all
  projected:
    sources:
    - secret:
        name: tls
        items:
        - { key: tls.crt, path: certs/server.crt }
        - { key: tls.key, path: certs/server.key, mode: 0400 }

3. Projecting ConfigMaps

- configMap:
    name: app-config
    items: [{ key: app.properties, path: config/app.properties }]
PropertyDetail
pathRelative file path inside volume
modeOctal permissions

4. Projecting Service Account Tokens

- serviceAccountToken:
    audience: vault
    expirationSeconds: 3600
    path: vault/token
FieldEffect
audienceRestrict token validity scope
expirationSecondsMin 600; auto-rotated

5. Projecting Downward API

- downwardAPI:
    items:
    - { path: meta/labels,      fieldRef: { fieldPath: metadata.labels } }
    - { path: meta/annotations, fieldRef: { fieldPath: metadata.annotations } }
    - { path: meta/pod_name,    fieldRef: { fieldPath: metadata.name } }
fieldRef.fieldPathExposes
metadata.namePod name
metadata.namespaceNamespace
metadata.uidPod UID
status.podIPPod IP
spec.nodeNameScheduled node

6. Configuring Token Expiration

SettingDetail
expirationSecondsToken TTL (min 600)
Auto-refreshkubelet rotates before expiry

7. Setting Token Audience

AudienceUse
apiKubernetes API (default)
vaultHashiCorp Vault JWT auth
sts.amazonaws.comAWS IRSA
custom.example.comCustom OIDC RP

8. Combining Multiple Sources

Example: All-in-one projected volume

volumes:
- name: app-meta
  projected:
    sources:
    - configMap: { name: app-config }
    - secret:    { name: db-creds }
    - downwardAPI:
        items: [{ path: pod-name, fieldRef: { fieldPath: metadata.name } }]
    - serviceAccountToken:
        audience: vault
        path: vault-token
RuleDetail
Path conflictsDetected at pod admission
Sub-pathsUse path with sub-dirs

9. Using Projected Volumes for mTLS

volumes:
- name: identity
  projected:
    sources:
    - clusterTrustBundle: { name: cluster-ca, path: ca.crt }
    - serviceAccountToken: { audience: spire, path: spire-token }

10. Debugging Projected Volumes

CheckCommand
kubectl exec POD -- ls -lR /mnt/projVerify files present
kubectl describe podMount errors in events
kubectl get cm/secretVerify source objects exist