Kubernetes YAML-bekragtiging teen beste praktyke en beleide
Let wel. vertaal.: Met die groei in die aantal YAML-konfigurasies vir K8s-omgewings, word die behoefte aan outomatiese verifikasie daarvan meer en meer dringend. Die skrywer van hierdie resensie het nie net bestaande oplossings vir hierdie taak gekies nie, maar het ook gekyk na hoe dit werk deur die voorbeeld van Ontplooiing te gebruik. Dit blyk baie insiggewend te wees vir diegene wat in hierdie onderwerp belangstel.
TL; DR: Hierdie artikel vergelyk ses statiese gereedskap vir die validering en evaluering van Kubernetes YAML-lêers teen beste praktyke en vereistes.
Kubernetes-werkladings word tipies gedefinieer in die vorm van YAML-dokumente. Een van die probleme met YAML is die moeilikheid om perke of verhoudings tussen manifeslêers te stel.
Wat as ons moet seker maak dat alle beelde wat na die groepering ontplooi is, van 'n betroubare register kom?
Hoe om te verhoed dat ontplooiings na die groep gestuur word wat nie PodDisruptionBudgets gestel het nie?
Statiese toetsintegrasie laat jou toe om foute en beleidsoortredings in die ontwikkelingstadium op te spoor. Dit verhoog die versekering dat hulpbrondefinisies korrek en veilig is, en verhoog die waarskynlikheid dat produksiewerkladings beste praktyke sal volg.
Die Kubernetes YAML statiese validering-ekosisteem kan in die volgende kategorieë verdeel word:
API Valideerders. Die gereedskap in hierdie kategorie bekragtig die YAML-manifes teen die vereistes van die Kubernetes API-bediener.
Klaar toetsers. Gereedskap uit hierdie kategorie kom met klaargemaakte toetse vir sekuriteit, voldoening aan beste praktyke, ens.
Pasgemaakte valideerders. Lede van hierdie kategorie laat jou toe om pasgemaakte toetse in verskeie tale te skep, soos Rego en Javascript.
In hierdie artikel sal ons ses verskillende instrumente beskryf en vergelyk:
kubeval;
kube-telling;
config-lint;
koper;
stryd;
polaris.
Wel, kom ons begin!
Gaan ontplooiings na
Voordat ons nutsmiddels begin vergelyk, kom ons skep 'n basis waarop ons dit kan toets.
Die manifes hieronder bevat 'n aantal foute en teenstrydighede met beste praktyke: hoeveel kan jy vind?
Ons sal hierdie YAML gebruik om verskillende instrumente te vergelyk.
Bogenoemde manifesteer base-valid.yaml en ander manifestasies uit hierdie artikel kan gevind word in Git-bewaarplekke.
Die manifes beskryf 'n webtoepassing wie se hooftaak is om te reageer met 'n "Hello World"-boodskap op poort 5678. Dit kan met die volgende opdrag ontplooi word:
kubectl apply -f hello-world.yaml
En so - om die werk na te gaan:
kubectl port-forward svc/http-echo 8080:5678
Gaan nou na http://localhost:8080 en bevestig dat die toepassing loop. Maar volg dit beste praktyke? Kom ons kyk.
1. Kubeval
Die kern van kubeval lê die idee dat enige interaksie met Kubernetes plaasvind deur sy REST API. Met ander woorde, jy kan 'n API-skema gebruik om te kyk of 'n gegewe YAML daaraan voldoen. Kom ons kyk na 'n voorbeeld.
$ kubeval kubeval-invalid.yaml
WARN - kubeval-invalid.yaml contains an invalid Deployment (http-echo) - selector: selector is required
PASS - kubeval-invalid.yaml contains a valid Service (http-echo)
# проверим код возврата
$ echo $?
1
Die hulpbron is nie bekragtig nie.
Ontplooiings met behulp van die API-weergawe apps/v1, moet 'n kieser insluit wat by die peul se etiket pas. Die manifes hierbo sluit nie 'n kieser in nie, so kubeval het 'n fout aangemeld en met 'n nie-nul-kode verlaat.
Ek wonder wat gebeur as jy hardloop kubectl apply -f met hierdie manifes?
Wel, kom ons probeer:
$ kubectl apply -f kubeval-invalid.yaml
error: error validating "kubeval-invalid.yaml": error validating data: ValidationError(Deployment.spec):
missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors,
turn validation off with --validate=false
Presies die fout waaroor kubeval gewaarsku het. Jy kan dit regmaak deur 'n kieser by te voeg:
Die voordeel van gereedskap soos kubeval is dat hierdie foute vroeg in die ontplooiingsiklus opgespoor kan word.
Daarbenewens vereis hierdie kontroles nie toegang tot die groepering nie: dit kan vanlyn uitgevoer word.
By verstek kontroleer kubeval hulpbronne teen die nuutste Kubernetes API-skema. In die meeste gevalle moet u egter teen 'n spesifieke Kubernetes-vrystelling bekragtig. Jy kan dit met die vlag doen --kubernetes-version:
Let daarop dat die weergawe in die formaat moet wees Major.Minor.Patch.
Vir 'n lys weergawes waarvoor verifikasie ondersteun word, verwys na JSON-skema op GitHub, wat kubeval vir validering gebruik. As jy kubeval vanlyn wil laat loop, laai die skemas af en spesifiseer hul plaaslike ligging met behulp van die vlag --schema-location.
Benewens individuele YAML-lêers, kan kubeval ook met gidse en stdin werk.
Daarbenewens integreer Kubeval maklik in die CI-pyplyn. Diegene wat toetse wil uitvoer voordat manifeste na die groep gedruk word, sal bly wees om te weet dat kubeval drie uitvoerformate ondersteun:
Gewone teks;
JSON;
Toets enigiets-protokol (TAP).
En enige van die formate kan gebruik word om die uitvoer verder te ontleed om 'n opsomming van die resultate van die verlangde soort te vorm.
Een van die nadele van kubeval is dat dit nie tans kyk vir Custom Resource Definitions (CRD's) nie. Kubeval kan egter gekonfigureer word ignoreer hulle.
Kubeval is 'n wonderlike hulpmiddel vir validering en evaluering van hulpbronne; dit moet egter beklemtoon word dat die slaag van die toets nie waarborg dat die hulpbron aan beste praktyke voldoen nie.
Gebruik byvoorbeeld die merker latest in 'n houer voldoen nie aan beste praktyke nie. Kubeval beskou dit egter nie as 'n fout nie en rapporteer dit nie. Dit wil sê, validering van so YAML sal sonder waarskuwing voltooi word.
Maar wat as jy YAML moet evalueer en oortredings soos die etiket moet opspoor latest? Hoe om 'n YAML-lêer te bekragtig teen beste praktyke?
2. Kube-telling
Kube-telling ontleed YAML-manifeste en evalueer dit teen ingeboude toetse. Hierdie toetse word gekies op grond van sekuriteitsaanbevelings en beste praktyke, soos:
Begin 'n houer nie as wortel nie.
Beskikbaarheid van peulgesondheidsondersoeke.
Stel versoeke en limiete vir hulpbronne.
Die toets lei tot drie resultate: OK, WAARSKUWING и KRITIESE.
Kube-telling kan aanlyn probeer word of plaaslik geïnstalleer word.
Ten tyde van die skryf van die oorspronklike artikel is die nuutste weergawe van kube-score 1.7.0.
Kom ons toets dit op ons manifes base-valid.yaml:
$ kube-score score base-valid.yaml
apps/v1/Deployment http-echo
[CRITICAL] Container Image Tag
· http-echo -> Image with latest tag
Using a fixed tag is recommended to avoid accidental upgrades
[CRITICAL] Pod NetworkPolicy
· The pod does not have a matching network policy
Create a NetworkPolicy that targets this pod
[CRITICAL] Pod Probes
· Container is missing a readinessProbe
A readinessProbe should be used to indicate when the service is ready to receive traffic.
Without it, the Pod is risking to receive traffic before it has booted. It is also used during
rollouts, and can prevent downtime if a new version of the application is failing.
More information: https://github.com/zegl/kube-score/blob/master/README_PROBES.md
[CRITICAL] Container Security Context
· http-echo -> Container has no configured security context
Set securityContext to run the container in a more secure context.
[CRITICAL] Container Resources
· http-echo -> CPU limit is not set
Resource limits are recommended to avoid resource DDOS. Set resources.limits.cpu
· http-echo -> Memory limit is not set
Resource limits are recommended to avoid resource DDOS. Set resources.limits.memory
· http-echo -> CPU request is not set
Resource requests are recommended to make sure that the application can start and run without
crashing. Set resources.requests.cpu
· http-echo -> Memory request is not set
Resource requests are recommended to make sure that the application can start and run without crashing.
Set resources.requests.memory
[CRITICAL] Deployment has PodDisruptionBudget
· No matching PodDisruptionBudget was found
It is recommended to define a PodDisruptionBudget to avoid unexpected downtime during Kubernetes
maintenance operations, such as when draining a node.
[WARNING] Deployment has host PodAntiAffinity
· Deployment does not have a host podAntiAffinity set
It is recommended to set a podAntiAffinity that stops multiple pods from a deployment from
being scheduled on the same node. This increases availability in case the node becomes unavailable.
YAML slaag kubeval-tjeks, terwyl kube-telling dui op die volgende tekortkominge:
Gereedheidskontroles is nie opgestel nie.
Daar is geen versoeke en limiete vir SVE en geheue hulpbronne nie.
Peulontwrigtingbegrotings nie gestel nie.
Daar is geen reëls vir afsonderlike bestaan nie (anti-affiniteit) om beskikbaarheid te maksimeer.
Die houer loop as wortel.
Al hierdie is redelike opmerkings oor tekortkominge wat aangespreek moet word sodat Ontplooiing meer doeltreffend en betroubaar kan word.
Span kube-score voer inligting uit in 'n mens-leesbare vorm, insluitend alle oortredings van die tipe WAARSKUWING и KRITIESEwat baie help tydens ontwikkeling.
Diegene wat hierdie instrument as deel van 'n CI-pyplyn wil gebruik, kan meer saamgeperste uitset met behulp van die vlag aktiveer --output-format ci (in hierdie geval word toetse met die resultaat ook vertoon OK):
$ kube-score score base-valid.yaml --output-format ci
[OK] http-echo apps/v1/Deployment
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU limit is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Memory limit is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU request is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Memory request is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Image with latest tag
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: The pod does not have a matching network policy
[CRITICAL] http-echo apps/v1/Deployment: Container is missing a readinessProbe
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Container has no configured security context
[CRITICAL] http-echo apps/v1/Deployment: No matching PodDisruptionBudget was found
[WARNING] http-echo apps/v1/Deployment: Deployment does not have a host podAntiAffinity set
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service
Soortgelyk aan kubeval, gee kube-telling 'n nie-nul uittreekode terug wanneer daar 'n toets is wat misluk. KRITIESE. Jy kan ook soortgelyke verwerking aktiveer vir WAARSKUWING.
Daarbenewens is dit moontlik om hulpbronne teen verskillende API-weergawes na te gaan (soortgelyk aan kubeval). Hierdie inligting is egter 'hardkodeer' in die kube-telling self: jy kan nie 'n ander weergawe van Kubernetes kies nie. Hierdie beperking kan 'n groot probleem word as jy van plan is om jou cluster op te gradeer of as jy verskeie clusters met verskillende weergawes van K8's het.
Let asseblief daarop dat het reeds 'n probleem met 'n voorstel om hierdie geleentheid te implementeer.
Meer inligting oor kube-telling kan gevind word by amptelike webwerf.
Kube-telling-toetse is 'n wonderlike hulpmiddel vir die implementering van beste praktyke, maar wat as jy veranderinge aan die toets moet maak of pasgemaakte reëls moet byvoeg? Helaas, dit kan nie gedoen word nie.
Kube-telling is nie uitbreibaar nie: jy kan nie beleide daarby voeg of dit aanpas nie.
As jy pasgemaakte toetse wil skryf om te kyk na maatskappybeleide, kan jy een van die volgende vier instrumente gebruik: config-lint, koper, confest of polaris.
3.Config-lint
Config-lint is 'n instrument vir die validering van YAML, JSON, Terraform, CSV-konfigurasielêers en Kubernetes-manifeste.
Jy kan dit installeer met behulp van instruksies op die projekwebwerf.
Die huidige vrystelling teen die tyd van die skryf van die oorspronklike artikel is 1.5.0.
Config-lint sluit nie ingeboude toetse in om Kubernetes-manifeste te valideer nie.
Om enige toetse uit te voer, moet jy die toepaslike reëls skep. Hulle is geskryf in YAML-lêers genaamd "reëlstelle" (reëls), en het die volgende struktuur:
version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
- "*.yaml"
rules:
# список правил
(rule.yaml)
Kom ons bestudeer dit van naderby:
Veld type spesifiseer watter tipe konfigurasie config-lint sal gebruik. Vir K8s manifesteer dit is altydKubernetes.
In die veld files bykomend tot die lêers self, kan jy 'n gids spesifiseer.
Veld rules is bedoel vir die opstel van gebruikerstoetse.
Kom ons sê jy wil seker maak dat beelde in 'n ontplooiing altyd afgelaai word vanaf 'n betroubare bewaarplek soos my-company.com/myapp:1.0. 'n Config-lint-reël wat hierdie kontrole doen, sal soos volg lyk:
- id: MY_DEPLOYMENT_IMAGE_TAG
severity: FAILURE
message: Deployment must use a valid image tag
resource: Deployment
assertions:
- every:
key: spec.template.spec.containers
expressions:
- key: image
op: starts-with
value: "my-company.com/"
(rule-trusted-repo.yaml)
Die volgende eienskappe moet vir elke reël gespesifiseer word:
id - unieke identifiseerder van die reël;
severity - Kan wees VERSUIM, WAARSKUWING и ONVOLDOENDE;
message - as die reël oortree word, word die inhoud van hierdie reël vertoon;
resource — die tipe hulpbron waarop hierdie reël van toepassing is;
assertions - 'n lys van toestande wat met betrekking tot hierdie hulpbron geëvalueer sal word.
In die reël hierbo assertion genoem every kontroleer dat alle houers in Deployment'e (key: spec.templates.spec.containers) gebruik vertroude beelde (d.w.s. dié wat begin met my-company.com/).
Config-lint is 'n vooruitskouende raamwerk wat jou toelaat om pasgemaakte toetse te skep om Kubernetes YAML-manifeste met YAML DSL te valideer.
Maar wat as meer komplekse logika en toetse vereis word? Is YAML-vermoëns nie te klein daarvoor nie? Wat as jy toetse in 'n volwaardige programmeertaal kan skep?
4. Koper
Koper V2 is 'n raamwerk vir die validering van manifeste deur gebruik te maak van pasgemaakte toetse (soortgelyk aan config-lint).
Dit verskil egter van laasgenoemde deurdat dit nie YAML gebruik om toetse te beskryf nie. In plaas daarvan kan toetse in JavaScript geskryf word. Koper verskaf 'n biblioteek met verskeie basiese gereedskapom inligting oor Kubernetes-voorwerpe te help lees en foute aan te meld.
Die volgorde van stappe om Copper te installeer kan gevind word in amptelike dokumentasie.
2.0.1 is die nuutste weergawe van hierdie hulpprogram ten tyde van die skryf van die oorspronklike artikel.
Soos config-lint, het Copper geen ingeboude toetse nie. Kom ons skryf een. Laat hom seker maak dat implementerings houerbeelde uitsluitlik van betroubare bewaarplekke soos my-company.com.
Skep 'n lêer check_image_repo.js met die volgende inhoud:
$$.forEach(function($){
if ($.kind === 'Deployment') {
$.spec.template.spec.containers.forEach(function(container) {
var image = new DockerImage(container.image);
if (image.registry.lastIndexOf('my-company.com/') != 0) {
errors.add_error('no_company_repo',"Image " + $.metadata.name + " is not from my-company.com repo", 1)
}
});
}
});
Nou om ons manifes te toets base-valid.yaml, gebruik die opdrag copper validate:
$ copper validate --in=base-valid.yaml --validator=check_image_tag.js
Check no_company_repo failed with severity 1 due to Image http-echo is not from my-company.com repo
Validation failed
Dit is duidelik dat meer komplekse toetse met koper uitgevoer kan word - byvoorbeeld die kontrolering van domeinname in Ingress-manifeste of die verwerping van peule wat in bevoorregte modus loop.
Verskeie nutsfunksies is in Copper ingebou:
DockerImage lees die gespesifiseerde invoerlêer en skep 'n voorwerp met die volgende eienskappe:
name - naam van die beeld,
tag - beeld tag,
registry - beeld register
registry_url - protokol (https://) en 'n beeldregister,
fqin — die volledige ligging van die prent.
Funksie findByName help om 'n hulpbron volgens 'n gegewe tipe te vind (kind) en naam (name) vanaf die invoerlêer.
Funksie findByLabels help om 'n hulpbron volgens die gespesifiseerde tipe te vind (kind) en etikette (labels).
Alle beskikbare nutsfunksies kan gevind word hier.
By verstek laai dit die hele YAML-invoerlêer in 'n veranderlike $$ en maak dit beskikbaar vir skrifte ('n bekende tegniek vir diegene met jQuery-ervaring).
Die grootste voordeel van Copper is voor die hand liggend: jy hoef nie 'n gespesialiseerde taal aan te leer nie en jy kan verskeie JavaScript-kenmerke gebruik om jou eie toetse te skep, soos stringinterpolasie, funksies, ens.
Daar moet ook op gelet word dat die huidige weergawe van Copper met die ES5-weergawe van die JavaScript-enjin werk, nie ES6 nie.
As jy egter nie 'n groot aanhanger van JavaScript is nie en 'n taal verkies wat spesifiek vir navrae en beleide beskryf word, moet jy die stryd ondersoek.
5. Wedstryd
Confetest is 'n raamwerk om konfigurasiedata na te gaan. Ook geskik om Kubernetes-manifeste te toets/verifieer. Toetse word beskryf deur 'n gespesialiseerde navraagtaal te gebruik Rego.
Jy kan conftest installeer met instruksiesop die projekwebwerf gelys.
Ten tyde van die skryf van die oorspronklike artikel is die nuutste weergawe beskikbaar 0.18.2.
Soortgelyk aan config-lint en koper, kom confetest sonder enige ingeboude toetse. Kom ons probeer dit en skryf ons eie beleid. Soos in die vorige voorbeelde, sal ons kyk of die houerbeelde van 'n betroubare bron geneem is.
Skep 'n gids conftest-checks, en daarin - 'n lêer met die naam check_image_registry.rego met die volgende inhoud:
package main
deny[msg] {
input.kind == "Deployment"
image := input.spec.template.spec.containers[_].image
not startswith(image, "my-company.com/")
msg := sprintf("image '%v' doesn't come from my-company.com repository", [image])
}
Kom ons toets nou base-valid.yaml deur conftest:
$ conftest test --policy ./conftest-checks base-valid.yaml
FAIL - base-valid.yaml - image 'hashicorp/http-echo' doesn't come from my-company.com repository
1 tests, 1 passed, 0 warnings, 1 failure
Die toets het soos verwag misluk omdat die beelde van 'n onbetroubare bron afkomstig is.
In die Rego-lêer definieer ons 'n blok deny. Die waarheid daarvan word as 'n oortreding beskou. As blokke deny veelvuldige, confetest kontroleer hulle onafhanklik, en die waarheid van enige van die blokke word as 'n oortreding hanteer.
Benewens die verstekafvoer, ondersteun conftest JSON-, TAP- en tabelformaat - 'n baie nuttige kenmerk as jy verslae in 'n bestaande CI-pyplyn moet insluit. Jy kan die verlangde formaat met die vlag instel --output.
Om beleidontfouting te vergemaklik, het confetest 'n vlag --trace. Dit druk 'n spoor van hoe conftest die gespesifiseerde beleidlêers ontleed.
strydbeleide kan gepubliseer en gedeel word in OCI (Open Container Initiative) registers as artefakte.
Команды push и pull laat jou toe om 'n artefak te publiseer of 'n bestaande artefak uit 'n afgeleë register te haal. Kom ons probeer om die beleid wat ons geskep het na die plaaslike Docker-register te publiseer conftest push.
Begin plaaslike Docker-register:
$ docker run -it --rm -p 5000:5000 registry
In 'n ander terminale, gaan na die gids wat jy vroeër geskep het conftest-checks en voer die volgende opdrag uit:
As die opdrag suksesvol was, sal jy 'n boodskap soos hierdie sien:
2020/06/10 14:25:43 pushed bundle with digest: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609c
Skep nou 'n tydelike gids en voer die opdrag daarin uit conftest pull. Dit sal die pakket wat deur die vorige opdrag geskep is, daarin aflaai:
$ cd $(mktemp -d)
$ conftest pull 127.0.0.1:5000/amitsaha/opa-bundle-example:latest
'n Subgids sal in die tydelike gids verskyn policy, wat ons beleidlêer bevat:
$ tree
.
└── policy
└── check_image_registry.rego
Toetse kan direk vanaf die bewaarplek uitgevoer word:
$ conftest test --update 127.0.0.1:5000/amitsaha/opa-bundle-example:latest base-valid.yaml
..
FAIL - base-valid.yaml - image 'hashicorp/http-echo' doesn't come from my-company.com repository
2 tests, 1 passed, 0 warnings, 1 failure
Ongelukkig word DockerHub nog nie ondersteun nie. So ag jouself gelukkig as jy gebruik Azure Container Registry (ACR) of jou eie register.
Artefakformaat is dieselfde as Maak Polisagent-pakkette oop (OPA), wat jou toelaat om confetest te gebruik om toetse uit bestaande OPA-pakkette uit te voer.
Die laaste hulpmiddel wat in hierdie artikel bespreek sal word, is Polaris. (Sy verlede jaar se aankondiging het ons reeds vertaal - ongeveer. vertaal.)
Polaris kan in 'n groep geïnstalleer word of in opdragreëlmodus gebruik word. Soos jy dalk geraai het, laat dit jou toe om Kubernetes-manifeste staties te ontleed.
Wanneer in die opdragreëlmodus uitgevoer word, is ingeboude toetse beskikbaar wat gebiede soos sekuriteit en beste praktyke dek (soortgelyk aan kube-telling). Daarbenewens kan jy jou eie toetse skep (soos in config-lint, koper en confest).
Met ander woorde, Polaris kombineer die voordele van beide kategorieë gereedskap: met ingeboude en pasgemaakte toetse.
Soos kube-telling, identifiseer Polaris kwessies waar die manifes nie beste praktyke volg nie:
Peulgesondheidsondersoeke ontbreek.
Geen merkers gespesifiseer vir houerprente nie.
Die houer loop as wortel.
Request'y en limit'y vir geheue en SVE word nie gespesifiseer nie.
Elke toets, afhangende van sy resultate, word 'n mate van kritiek toegeken: waarskuwing of gevaar. Om meer te wete te kom oor die beskikbare ingeboude toetse, verwys na dokumentasie.
As besonderhede nie nodig is nie, kan jy 'n vlag spesifiseer --format score. In hierdie geval sal Polaris 'n getal in die reeks van 1 tot 100 - uitvoer telling (d.w.s. evaluering):
Hoe nader die telling aan 100 is, hoe hoër is die mate van voldoening. As jy die uitgangkode van die opdrag nagaan polaris audit, dit blyk dat dit gelyk is aan 0.
krag polaris audit Jy kan verlaat met 'n nie-nul kode deur twee vlae te gebruik:
vlag --set-exit-code-below-score neem as 'n argument 'n drempelwaarde in die reeks 1-100. In hierdie geval sal die opdrag eindig met 'n uittreekode van 4 as die telling onder die drempel is. Dit is baie handig wanneer jy 'n sekere drempelwaarde het (sê 75) en jy wil gewaarsku word as die telling onder daal.
vlag --set-exit-code-on-danger sal veroorsaak dat die opdrag met kode 3 uitgaan as een van die gevaartoetse misluk.
Kom ons probeer nou om 'n pasgemaakte toets te skep wat kyk of die prent uit 'n betroubare bewaarplek geneem is. Gebruikerstoetse word in YAML-formaat gespesifiseer, en die toets self word beskryf met behulp van JSON-skema.
Die volgende YAML-brokkie beskryf 'n nuwe toets genaamd checkImageRepo:
checkImageRepo:
successMessage: Image registry is valid
failureMessage: Image registry is not valid
category: Images
target: Container
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
pattern: ^my-company.com/.+$
Kom ons kyk nader daarna:
successMessage - hierdie reël sal vertoon word as die toets suksesvol voltooi is;
failureMessage - hierdie boodskap sal gewys word in geval van mislukking;
category - dui een van die kategorieë aan: Images, Health Checks, Security, Networking и Resources;
target--- definieer watter tipe voorwerp (spec) word die toets toegepas. Moontlike waardes: Container, Pod of Controller;
Die toets self word in die voorwerp gespesifiseer schema met behulp van JSON-skema. In hierdie toets word die sleutelwoord pattern gebruik om die beeldbron met die gewenste een te vergelyk.
Om die bogenoemde toets uit te voer, moet jy die volgende Polaris-konfigurasie skep:
In die veld checks toetse en hul vlak van kritiek word voorgeskryf. Aangesien dit wenslik is om gewaarsku te word wanneer 'n beeld van 'n onbetroubare bron geneem word, stel ons die vlak hier danger.
Die toets self checkImageRepo dan aan die voorwerp toegewys customChecks.
Stoor die lêer as custom_check.yaml. Nou kan jy hardloop polaris audit met 'n YAML-manifes wat bekragtiging vereis.
Span polaris audit het net die pasgemaakte toets hierbo gegee en dit het misluk.
As jy die beeld regmaak na my-company.com/http-echo:1.0, sal Polaris suksesvol voltooi. Manifes met veranderinge is reeds in bewaarplekkesodat jy die vorige opdrag op die manifes kan nagaan image-valid-mycompany.yaml.
Nou ontstaan die vraag: hoe om ingeboude toetse saam met pasgemaakte toetse uit te voer? Maklik! U hoef net die ingeboude toets-ID's by die konfigurasielêer te voeg. As gevolg hiervan sal dit die volgende vorm aanneem:
Polaris vul die ingeboude toetse aan met pasgemaakte toetse en kombineer sodoende die beste van albei wêrelde.
Aan die ander kant kan die onvermoë om kragtiger tale soos Rego of JavaScript te gebruik 'n beperkende faktor wees wat jou verhoed om meer gesofistikeerde toetse te skep.
Meer inligting oor Polaris is beskikbaar by projek webwerf.
Opsomming
Alhoewel daar baie instrumente is om Kubernetes YAML-lêers te valideer en te evalueer, dit is belangrik om 'n duidelike begrip te hê van hoe toetse ontwerp en uitgevoer sal word.
Byvoorbeeld, as jy Kubernetes-manifeste neem wat deur 'n pyplyn gaan, kan kubeval die eerste stap in so 'n pyplyn wees. Dit sal seker maak dat die objekdefinisies ooreenstem met die Kubernetes API-skema.
Sodra so 'n hersiening voltooi is, kan meer gesofistikeerde toetse voortgesit word, soos voldoening aan standaard beste praktyke en spesifieke beleide. Dit is waar kube-score en Polaris handig te pas sal kom.
Vir diegene wat komplekse vereistes het en hul toetse moet verfyn, sal koper, config-lint en confetest wonderlik wees..
Conftest en config-lint gebruik YAML om pasgemaakte toetse te definieer, terwyl koper jou toegang gee tot 'n volledige programmeertaal, wat dit 'n redelik aantreklike keuse maak.
Aan die ander kant, moet jy een van hierdie instrumente gebruik en dus al die toetse met die hand skep, of Polaris verkies, en net wat nodig is daarby voeg? Daar is geen enkele antwoord op hierdie vraag nie.
Die tabel hieronder bevat 'n kort beskrywing van elke instrument:
Tool
lot
Beperkings
Gebruikerstoetse
kubeval
Valideer YAML-manifeste teen 'n spesifieke API-skemaweergawe
Weet nie hoe om met CRD te werk nie
Geen
kube telling
Ontleed YAML manifesteer teen beste praktyke
Jy kan nie jou weergawe van die Kubernetes API vir hulpbronvalidering kies nie
Geen
koper
Generiese raamwerk vir die skep van pasgemaakte JavaScript-toetse vir YAML-manifeste
Daar is geen ingeboude toetse nie. Skaars dokumentasie
Ja
config-lint
Algemene raamwerk vir die skep van toetse in 'n domeinspesifieke taal wat in YAML ingebed is. Ondersteun verskeie konfigurasieformate (bv. Terraform)
Daar is geen klaargemaakte toetse nie. Ingeboude bewerings en funksies is dalk nie genoeg nie
Ja
stryd
'n Raamwerk vir die skep van jou eie toetse in Rego ('n gespesialiseerde navraagtaal). Laat beleiddeling via OCI-bundels toe
Daar is geen ingeboude toetse nie. Jy moet Rego leer. Docker Hub word nie ondersteun wanneer beleide gepubliseer word nie
Ja
Polaris
Ontleed YAML manifesteer teen standaard beste praktyke. Laat jou toe om jou eie toetse te skep deur JSON-skema te gebruik
JSON Skema-gebaseerde toetsvermoëns is dalk nie genoeg nie
Ja
Aangesien hierdie gereedskap nie afhanklik is van toegang tot die Kubernetes-kluster nie, is dit maklik om te installeer. Hulle laat jou toe om bronlêers te filtreer en gee vinnige terugvoer om versoekouteurs op projekte te trek.