Secret variations with Flux
There are several different ways to utilize Kubernetes secrets when using Flux and SOPS, here’s a breakdown of some common methods.
I will not be covering how to integrate SOPS into Flux for that be sure to check out the Flux documentation on integrating SOPS
Example Secret
apiVersion: v1
kind: Secret
metadata:
name: application-secret
namespace: default
stringData:
AWESOME_SECRET: "SUPER SECRET VALUE"
Method 1: envFrom
Use
envFrom
in a deployment or a Helm chart that supports the setting, this will pass all secret items from the secret into the containers environment.
envFrom:
- secretRef:
name: application-secret
View example Helm Release and corresponding Secret.
Method 2: env.valueFrom
Similar to the above but it's possible with
env
to pick an item from a secret.
env:
- name: WAY_COOLER_ENV_VARIABLE
valueFrom:
secretKeyRef:
name: application-secret
key: AWESOME_SECRET
View example Helm Release and corresponding Secret.
Method 3: spec.valuesFrom
The Flux HelmRelease option
valuesFrom
can inject a secret item into the Helm values of aHelmRelease
- Does not work with merging array values
- Care needed with keys that contain dot notation in the name
valuesFrom:
- targetPath: config."admin\.password"
kind: Secret
name: application-secret
valuesKey: AWESOME_SECRET
View example Helm Release and corresponding Secret.
Method 4: Variable Substitution with Flux
Flux variable substitution can inject secrets into any YAML manifest. This requires the Flux Kustomization configured to enable variable substitution. Correctly configured this allows you to use
${GLOBAL_AWESOME_SECRET}
in any YAML manifest.
apiVersion: v1
kind: Secret
metadata:
name: cluster-secrets
namespace: flux-system
stringData:
GLOBAL_AWESOME_SECRET: "GLOBAL SUPER SECRET VALUE"
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
# ...
spec:
# ...
decryption:
provider: sops
secretRef:
name: sops-age
postBuild:
substituteFrom:
- kind: Secret
name: cluster-secrets
View example Fluxtomization, Helm Release, and corresponding Secret.
Final Thoughts
-
For the first three methods consider using a tool like stakater/reloader to restart the pod when the secret changes.
-
Using reloader on a pod using a secret provided by Flux Variable Substitution will lead to pods being restarted during any change to the secret while related to the pod or not.
-
The last method should be used when all other methods are not an option, or used when you have a “global” secret used by a bunch of YAML manifests.