đ Reloader
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:
| Metode | Annotasjon pÄ Application | Rulles ut ved |
|---|---|---|
| SĂžk og match | reloader.stakater.com/search | endring i en ConfigMap eller Secret applikasjonen bruker, gitt at denne er annotert med reloader.stakater.com/match |
| Automatisk | reloader.stakater.com/auto | endring i en ConfigMap eller Secret applikasjonen bruker |
| Spesifikke ressurser | configmap.reloader.stakater.com/reload / secret.reloader.stakater.com/reload | endring 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
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.