Skip to main content

🔄 Reloader

info

For spÞrsmÄl om Reloader, kontakt Team Tilgangsstyring via #gen-tilgangsstyring pÄ Slack.

NÄr en ConfigMap eller Secret endres, vil ikke pods som allerede kjÞrer nÞdvendigvis plukke opp endringen av seg selv. MiljÞvariabler leses kun inn nÄr containeren starter, og mange applikasjoner leser konfigurasjonsfiler bare ved oppstart. For at endringen skal fÄ effekt mÄ det i sÄ fall rulles ut nye pods.

SKIP har Reloader installert i alle clustere. Reloader fÞlger med pÄ ConfigMap- og Secret-ressurser, og kan starte en ny utrulling av applikasjonen din nÄr en ressurs den bruker endres. Utrullingen skjer som en rolling update, pÄ samme mÄte som ved enhver annen endring.

Et alternativ til Reloader for configmaps og secrets du selv definerer navnet pÄ, er Ä legge til en kort hash av innholdet i navnet. NÄr innholdet endres, endres ogsÄ navnet. Siden Application refererer til ressursen ved navn gir dette en diff i Application-manifestet, som fÞrer til en ny utrulling ved sync i Argo. Se Alternativ: hash i navnet pÄ configmaps og secrets.

Et annet alternativ er Ä montere configmaps og secrets som filer med filesFrom, og la applikasjonen lese innholdet fra fil fortlÞpende i stedet for kun ved oppstart. Kubernetes oppdaterer monterte filer automatisk nÄr ressursen endres, vanligvis innen et minutt, slik at applikasjonen kan plukke opp endringen uten en ny utrulling. Merk at dette ikke gjelder filer som er montert med subPath.

Ta i bruk Reloader​

Reloader styres med annotasjoner. For en Skiperator-Application legger du disse under spec.podSettings.annotations.

Det finnes tre mÄter Ä bruke Reloader pÄ. Alle tre krever at du legger til en annotasjon pÄ Application, mens én av metodene i tillegg krever annotasjon pÄ ConfigMap- og Secret-ressursene som skal trigge utrulling:

MetodeAnnotasjon pÄ ApplicationRulles ut ved
SĂžk og matchreloader.stakater.com/searchendring i en ConfigMap eller Secret applikasjonen bruker, gitt at denne er annotert med reloader.stakater.com/match
Automatiskreloader.stakater.com/autoendring i en ConfigMap eller Secret applikasjonen bruker
Spesifikke ressurserconfigmap.reloader.stakater.com/reload / secret.reloader.stakater.com/reloadendring i en av de navngitte ressursene

Sþk og match​

Med reloader.stakater.com/search rulles applikasjonen bare ut pÄ nytt nÄr en ressurs den bruker endres, og denne ressursen selv er annotert med reloader.stakater.com/match: "true".

apiVersion: skiperator.kartverket.no/v1alpha1
kind: Application
metadata:
name: foo-backend
spec:
image: ghcr.io/kartverket/foo-backend:1.2.3
port: 8080
envFrom:
- configMap: foo-backend-config
podSettings:
annotations:
reloader.stakater.com/search: "true"
---
apiVersion: v1
kind: ConfigMap
metadata:
name: foo-backend-config
annotations:
reloader.stakater.com/match: "true"
data:
LOG_LEVEL: info

Secrets fra Azurerator og Digdirator er allerede annotert med reloader.stakater.com/match, sÄ det eneste du trenger er reloader.stakater.com/search pÄ applikasjonen din. For secrets fra External Secrets kan du legge pÄ annotasjonen via spec.target.template.metadata.annotations i ExternalSecret-ressursen.

Automatisk​

Med reloader.stakater.com/auto rulles applikasjonen ut pÄ nytt nÄr en hvilken som helst ConfigMap eller Secret som applikasjonen refererer til endres, uavhengig av om ressursen selv er annotert med reloader.stakater.com/match: "true". Har applikasjonen bÄde reloader.stakater.com/auto og reloader.stakater.com/search, er det auto som gjelder.

apiVersion: skiperator.kartverket.no/v1alpha1
kind: Application
metadata:
name: foo-backend
spec:
image: ghcr.io/kartverket/foo-backend:1.2.3
port: 8080
envFrom:
- configMap: foo-backend-config
- secret: foo-backend-secrets
podSettings:
annotations:
reloader.stakater.com/auto: "true"

Ønsker du bare Ä fÞlge med pÄ én type ressurs kan du bruke configmap.reloader.stakater.com/auto: "true" eller secret.reloader.stakater.com/auto: "true" i stedet.

Enkeltressurser kan unntas fra automatisk reloading med configmaps.exclude.reloader.stakater.com/reload og secrets.exclude.reloader.stakater.com/reload, som tar en kommaseparert liste med navn:

podSettings:
annotations:
reloader.stakater.com/auto: "true"
secrets.exclude.reloader.stakater.com/reload: "foo-backend-secrets"

Spesifikke ressurser​

Hvis du bare vil at endringer i enkelte ressurser skal fÞre til en ny utrulling, kan du liste dem opp eksplisitt. Verdien er en kommaseparert liste med navn pÄ configmaps eller secrets i samme namespace.

apiVersion: skiperator.kartverket.no/v1alpha1
kind: Application
metadata:
name: foo-backend
spec:
image: ghcr.io/kartverket/foo-backend:1.2.3
port: 8080
envFrom:
- configMap: foo-backend-config
- configMap: foo-backend-feature-flags
- secret: foo-backend-secrets
podSettings:
annotations:
configmap.reloader.stakater.com/reload: "foo-backend-config,foo-backend-feature-flags"
secret.reloader.stakater.com/reload: "foo-backend-secrets"

Alternativ: hash i navnet pĂ„ configmaps og secrets​

For configmaps og secrets som du definerer selv i ditt apps-repo, finnes det et alternativ som ikke krever Reloader: Ä legge til en kort hash av innholdet i navnet pÄ ressursen. NÄr innholdet endres, endres ogsÄ navnet. Siden Application-manifestet refererer til ressursen ved navn, gir dette en diff i Application-manifestet, som igjen medfÞrer utrulling av applikasjonen.

Den gamle ressursen bÞr ikke slettes fÞr den nye er rullet ut. Uten den vil gamle pods som restarter underveis i utrullingen, eller hvis du ruller tilbake, peke pÄ en ressurs som ikke finnes lenger, og feile med CreateContainerConfigError. Ved bruk av manuell sync i Argo CD vil gamle ressurser kun fjernes dersom du huker av for "Prune" ved sync. Med autosync i Argo CD er prune skrudd pÄ som standard, og den gamle ressursen slettes da i samme sync som den nye opprettes. Dersom du foretrekker autosync i produksjon kan det derfor vÊre lurt Ä legge sync-opsjonen PruneLast=true pÄ ressursen, slik at Argo CD venter med Ä slette den til resten av syncen er fullfÞrt og ressursene er healthy. Se eksempelet nedenfor.

Metoden beskrevet over fungerer bare for ressurser der innholdet ligger i apps-repoet, og du selv kan styre navnet. For hemmeligheter som hentes fra Google Secret Manager eller opprettes av andre (f.eks. en operator, som Azurerator, Digdirator med mer), mÄ du bruke Reloader.

Eksempel med Jsonnet​

local appName = 'foo-backend';

local configData = {
LOG_LEVEL: 'info',
FEATURE_X_ENABLED: 'true',
};

// Legger til de fĂžrste 7 tegnene av en md5-hash av innholdet i navnet
local withHash(name, data) =
name + '-' + std.substr(std.md5(std.toString(data)), 0, 7);

local configMapName = withHash(appName + '-config', configData);

[
{
apiVersion: 'v1',
kind: 'ConfigMap',
metadata: {
name: configMapName,
annotations: {
'argocd.argoproj.io/sync-options': 'PruneLast=true',
},
},
data: configData,
},
{
apiVersion: 'skiperator.kartverket.no/v1alpha1',
kind: 'Application',
metadata: {
name: appName,
},
spec: {
image: 'ghcr.io/kartverket/foo-backend:1.2.3',
port: 8080,
envFrom: [
{ configMap: configMapName },
],
},
},
]

Dette genererer en ConfigMap med navnet foo-backend-config-d38b68a, som Application refererer til i envFrom. Endres LOG_LEVEL til debug, blir navnet i stedet foo-backend-config-a8dbbff, og bÄde ConfigMap og Application fÄr en diff:

spec:
envFrom:
- - configMap: foo-backend-config-d38b68a
+ - configMap: foo-backend-config-a8dbbff
tip

Bruker du ArgoKit v2 kan du fÄ hash i navnet med addHashToName=true, f.eks. i withConfigMapAsEnv(name, data, addHashToName=true) eller argokit.k8s.configMap.new(name, data, addHashToName=true). Se ArgoKit v2.