ℹ️ Sørg for å ha installert nødvendig programvare som spesifisert her før du begynner.
I denne workshopen skal du lage en Kubernetes-operator som inneholder et API for å skalere workloads basert åpningstider. Dette kan være nyttig for å spare kostnader ved å redusere antall pods i perioder hvor det er lite trafikk. Målet med denne workshopen er å gi deg en forståelse av hvordan en operator fungerer, og hvordan du kan lage en enkel operator selv.
Merk at det finnes allerede ulike måter å skalere instanser av applikasjoner på, f.eks. ved å skalere etter CPU/minne (HPA/VPA), basert på eventer med KEDA, eller ved å bruke egne metrikker.
Dette er et skjelett for operatoren, basert på Operator SDK (og kubebuilder) samt egne erfaringer.
.
├── .dockerignore
├── .gitignore
├── .golangci.yml # (Valgfri) anbefalt linting
├── .run # JetBrains run configurations
├── .vscode # Visual Studio Code run configurations
├── Dockerfile
├── LICENSE
├── Makefile # Ulike prekonfigurerte "common" tasks
├── api # Her defineres din CRD (API) mot konsumenter
│ └── v1alpha1 # API-versjon
│ ├── businesshoursscaler_types.go # Typer for API'et ditt
│ ├── groupversion_info.go # Registrering av v1alpha1 inn under en API group ("apps.k8s.bekk.no")
│ └── zz_generated.deepcopy.go # Autogenerert
├── bin # Diverse tooling, samt kompilert versjon av operatoren
├── cmd # Konvensjon: putt det man ønsker skal være en standalone executable som en mappe her
│ └── bekk-ws-operator # Navnet på din operator
│ └── main.go # Entrypoint
├── codegen.go # Flagging til kompilatoren/go tooling vedr. kodegenerering
├── config # Autogenererte ressurser (definisjoner)
│ ├── crd
│ │ └── apps.k8s.bekk.no_businesshoursscalers.yaml # [autogen] Deploybar og delbar CRD. Kan brukes til lokal validering i editor.
│ └── rbac
│ └── role.yaml # [autogen] En rolle som inneholder det som trengs for at operatoren skal fungere.
├── go.mod # Go-dependencies. Som package.json eller pom.xml.
├── go.sum # De faktiske dependenciene i bruk. Som package-lock.json.
├── internal # En pakke som aldri vil bli eksponert for andre prosjekter (etter navnekonvensjon)
│ └── controller # Ulike controllere (n=1 for vår del)
│ └── businesshoursscaler_controller.go # Forretningslogikken din
├── readme.md
├── sample # Ting å teste manuelt med
│ ├── 01_ns.yaml
│ ├── 02_deployment.yaml
│ └── 03_bhs.yaml
├── tests # Deklarative manifest-baserte tester
│ ├── config.yaml # Config for Chainsaw
│ ├── [tester i egne mapper]
├── tools.go # Tools for codegen/testing
└── workshop.md # Denne filen
- Start med å klone repoet og åpne i din favoritt-editor/IDE.
git clone https://github.com/bekk/k8s-operator-workshop.git
- Sett opp et lokalt Kubernetes-cluster for lokal utvikling
# Bruk kind til å lage et lokalt cluster (som Docker-containere på din maskin) make setup-local # Bytt til det nye clusteret kubectl config use-context kind-workshop --namespace=bekk-ws-operator-system
Benytt en av de ferdige konfigurasjonene for enten VSCode eller IntelliJ/GoLand. Hvis ikke kan du kjøre:
# Generer CRD/RBAC-regler og putt de inn i clusteret, før operatoren kjøres opp lokalt
make run-local
# Kjør tester (uten å kjøre opp operatoren, slik at du kan debugge)
make test
# Kjør tester (og operatoren)
make run-test
# Kjøre enkelttester (uten operator)
make test-single dir=tests/some-example-test
# Kjøre enkelttester (med operator)
make run-test TEST_DIR=tests/some-example-test
Har du lyst på et cleant cluster?
kind delete cluster --name workshop && make setup-local
I mappen api/v1alpha1
finner du businesshoursscaler_types.go
some inneholder API'et du eksponerer til andre.
Definer felter for når applikasjonen skal skalere opp og når den skal skalere ned. Det er også å nødvendig å vite hvilken applikasjon (Deployment
-ressurs) som skal skaleres. Hva annet trenger du? 🤔
Tips: Se på annotasjoner for f.eks. validering og dokumentasjonen for kubebuilder.
Åpne controlleren din i internal/controller/businesshoursscaler_controller.go
. Her er det funksjonen Reconcile(ctx context.Context, req ctrl.Request)
som skal fylles ut.
Ting å tenke på når det kommer til implementasjon:
- Finnes
BusinessHoursScaler
objektet ditt når controlleren din får requesten? - Kubernetes, Go og tid kan være en spennende kombinasjon
- RBAC for andre ressurser
Ressurser:
En vanlig måte å kommunisere tilstand på i Kubernetes er ved å sende events. Dette kan være nyttig for å gi informasjon til brukere, eller brukes i feilsøkingsøyemed.
Bruk en EventRecorder
til å si ifra om at man har skalert et Deployment
og når det ikke går bra (feilscenarier). Hva er viktig å få med for å gi verdi?
Man kan skrive tester for alt, og på forskjellige nivåer. I denne workshopen skal vi skrive deklarative tester på manifest-nivå. Dvs. at man kjører opp operatoren, applyer et manifest og asserter på at nye ressuer har kommet til/eksisterende har endret seg etc. Til dette bruker vi Chainsaw.
Se tests/
for konfigurasjon og eksempeltest.
💡Tenk spesielt på hvordan du skal manipulere tid i testene.
Man kan få mange metrikker ut av boksen. Finn ut av hvordan man kan eksponere en egen HTTP-port med Prometheus-metrikker.
- Ta høyde for tidssoner (hvis du ikke har måttet gjøre dette tidligere)
- Definer en egen metrikk og observer at den blir eksponert
- Se om du kan få med deg hvis noen manuelt endrer på et
Deployment
, slik at du kan overstyre automatisk etter åpningstid.