Helsesjekker i Kubernetes
Bakgrunnâ
Helsesjekker i kubernetes er en veldig viktig del av mikrotjeneste-arkitekturen, og det er derfor lurt Ä sette seg litt inn i hensikten og funksjonen til de ulike helse-endepunktene man kan konfigurere. Det finnes mange mÄter Ä konfigurere disse pÄ, alt i fra helt egenlagde endepunkter til ferdige rammeverk som eksponerer dette automatisk.
I hovedsak finnes det tre typer prober som kubernetes opererer med:
- Liveness probe - Sjekker om containeren kjÞrer og fungerer, hvis ikke sÄ restarter kubernetes containeren
- Readiness probe - Brukes for Ä bestemme om en pod en klar for Ä ta i mot trafikk. En pod er klar nÄr alle containere i poden er klare.
- Startup probe - Hvis denne er konfigurert sÄ avventer kubernetes med liveness og readiness til dette endepunktet svarer. Dette kan brukes for Ä gi trege containere noe mer tid til Ä starte opp.
Det finnes flere mÄter Ä sette opp helsesjekker pÄ, som f.eks. kommandoer, HTTP-requests, TCP-requests og gRPC-requests. Den aller vanligste mÄten er Ä konfigurere et endepunkt (f.eks /health, /liveness) i applikasjonen som svarer pÄ HTTP-requests, og spesifisere dette som en del av pod-spesifikasjonen.
Litt mer om helsesjekker generelt: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
Det er viktig Ä merke seg at man ikkemÄbenytte seg av alle disse helsesjekkene, men man bÞr ta et bevisst valg om det er hensiktsmessig eller ikke. Sjekk den lenken her for Ä en oversikt over hva man bÞr gjÞre: https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#when-should-you-use-a-liveness-probe
Skiperatorâ
De aller fleste som har applikasjoner pÄ SKIP benytter Skiperator for Ä forenkle oppsettet rundt applikasjonen. I Skiperator-manifestet kan man konfigurere helsesjekker pÄ samme mÄte man ville gjort for en vanilla-pod i kubernetes. Detaljer rundt dette stÄr i dokumentasjonen for Skiperator . Se under ApplicationSpec
og Liveness
/ Readiness
/ Startup
.
Sikkerhetshensynâ
Det er noen fallgruver Ä vÊre klar over, sÄ denne siden skal prÞve Ä gi en oversikt over hvordan man typisk bÞr konfigurere dette pÄ en sikker og god mÄte.
Hvis man ikke konfigurerer applikasjonen sin riktig kan man i verste fall ende opp med Ä eksponere de samme endepunktene som kubernetes bruker internt ut pÄ internett. Et enkelt /health endepunkt som svarer med HTTP 200 OK, gjÞr ikke sÄ stor skade. Et feilkonfigurert management-endepunkt derimot kan eksponere interne miljÞvariabler, debug-info og minnedump.
Ta en titt pÄ fÞlgende flytskjema fÞr du gÄr videre, og gÄ til det punktet som gjelder deg
UndersĂžke hva som eksponeres som standardâ
En veldig vanlig mÄte Ä lÞse helsejsekker pÄ nÄr man bruker Spring Boot er Ä benytte seg av sub-prosjektet Spring Boot Actuator .
For Ă„ ta det i bruk trenger man bare Ă„ legge til fĂžlgende for Maven-prosjekt (pom.xml)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
Eller dette hvis man bruker Gradle (build.gradle)
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}
Rammeverket setter automatisk opp endepunktet /actuator/health
som en trygg default (gjelder versjon 2 og hÞyere av Spring Boot). NÄr man starter opp en Spring-applikasjon i kubernetes vil Spring Boot Actuator ogsÄ automatisk tilgjengeliggjÞre /actuator/health/liveness
og /actuator/health/readiness
som man benytte for helsesjekker. For Ă„ teste disse manuelt kan du legge til management.endpoint.health.probes.enabled=true
i application.properties
.
Disse endepunktene kan du sÄ bruke i Skiperator-manifestet:
apiVersion: skiperator.kartverket.no/v1alpha1
kind: Application
metadata:
name: some-backend
namespace: yournamespace
spec:
# Ăvrig konfigurasjon
liveness:
path: /actuator/health/liveness
port: 8080
failureThreshold: 3
timeout: 1
initialDelay: 3
readiness:
path: /actuator/health/readiness
port: 8080
failureThreshold: 3
timeout: 1
initialDelay: 5
Det er viktig Ă„ merke seg fĂžlgende notat:
Konfigurasjon som management.endpoints.web.exposure.include=*
frarÄdes ettersom det eksponerer alle endepunkt som er skrudd pÄ. I sÄ fall mÄ man passe pÄ Ä sette management.endpoints.enabled-by-default=false
og manuelt skru pÄ de man Þnsker Ä bruke.
Ănsker man Ă„ eksponere ytterligere endepunkt , som f.eks. Ă„ eksponere /info
for Ä presentere informasjon om bygget eller lignende er det tryggere Ä eksplisitt man gjÞre det pÄ denne mÄten i application.properties
:
management.endpoint.info.enabled=true
management.endpoint.health.enabled=true
management.endpoints.web.exposure.include=health,info
Savner du ditt rammeverk? Legg det til da vel
Eksponer endepunktene pĂ„ dedikert port uten serviceâ
Her vil det variere litt hvordan man gÄr frem avhengig av om man bruker et rammeverk eller ikke, siden prosessen i containeren mÄ lytte pÄ ekstra port.
FÞrst mÄ man velge seg en port, f.eks. 8081, og sÄ eksponere denne i Dockerfile. I dette eksempelet vil 8080 vÊre applikasjonsporten, og 8081 management/helseporten.
EXPOSE 8080 8081
Deretter mÄ man konfigurere management-porten i application.properties pÄ fÞlgende mÄte:
management.server.port=8081
management.endpoint.info.enabled=true
management.endpoint.health.enabled=true
management.endpoints.web.exposure.include=health,info
Skiperator-manifestet vil vÊre helt likt, men man insturerer kubernetes til Ä gjÞre helsesjekkene pÄ en annen port.
apiVersion: skiperator.kartverket.no/v1alpha1
kind: Application
metadata:
name: some-backend
namespace: yournamespace
spec:
port: 8080
# Ăvrig konfigurasjon
liveness:
path: /actuator/health/liveness
port: 8081
failureThreshold: 3
timeout: 1
initialDelay: 3
readiness:
path: /actuator/health/readiness
port: 8081
failureThreshold: 3
timeout: 1
initialDelay: 5
Eksponer endepunktene pĂ„ dedikert port med serviceâ
For Ăžyeblikket kan man ikke spesifisere hvilken port man skal tillate trafikk til via skiperator sin accessPolicy
Hvis man har behov for at en annen applikasjon skal kunne nÄ endepunktet pÄ en annen port mÄ man gjÞre ytterligere konfigurasjon. Man bÞr ta en ekstra vurdering pÄ om det er hensiktmessig Ä eksponere denne typen informasjon via actuator-endepunkter.
Sett opp konfigurasjonen pÄ samme mÄte som punktet over, men manifestet vil nÄ inkludere spesifikasjon for ekstra porter og tilgangssstyring.
apiVersion: skiperator.kartverket.no/v1alpha1
kind: Application
metadata:
name: some-backend
namespace: yournamespace
spec:
port: 8080
additionalPorts:
- name: actuator
port: 8081
protocol: TCP
# .. Ăžvrig konfigurasjon
liveness:
path: /actuator/health/liveness
port: 8081
failureThreshold: 3
timeout: 1
initialDelay: 3
readiness:
path: /actuator/health/readiness
port: 8081
failureThreshold: 3
timeout: 1
initialDelay: 5
accessPolicy:
inbound:
rules:
- application: some-frontend
port: 8081 # Ikke mulig akkurat nÄ