MĂ€rk. tĂ”lge.: K8s-ĂŒsteemide YAML-konfiguratsioonide arvu suurenemisega kasvab vajadus nende automatiseeritud kontrollimise jĂ€rele. Artikli autor on mitte ainult kogunud olemasolevaid lahendusi sellele probleemile, vaid vaadanud ka, kuidas need töötavad konkreetselt Deploymenti nĂ€itel. See on olnud vĂ€ga informatiivne neile, keda see teema huvitab.

TL;DR: Artikkel vÔrdleb kuut staatilist tööriista Kubernetes'i YAML-failide kontrollimiseks ja hindamiseks vastavuses parimate praktika ja nÔuetega.
Kubernetes'e töökoormused mÀÀratakse tavaliselt YAML-dokumentidena. Ăks YAML'i probleemidest on piirangute vĂ”i suhete mÀÀramine manifesteerimisfailide vahel.
Mis juhtub, kui peame veenduma, et kÔik klastrisse juurutatavad pildid tulevad usaldusvÀÀrsest registrist?
Kuidas vÀltida Deploymentide saatmist klastrisse, mille jaoks ei ole mÀÀratud PodDisruptionBudget'e?
Statilise testimise integreerimine vÔimaldab tuvastada vigu ja poliitikate rikkomisi arenduse varases staadiumis. Seega suurenevad ressursside mÀÀratlemise Ôiguse ja turvalisuse tagatised ning tÔenÀosus, et tootmiskoormused jÀrgivad parimaid praktikaid.
Kubernetes YAML-failide staatilise kontrolli ökosĂŒsteem jaguneb jĂ€rgmistesse kategooriatesse:
- API valideerijad. Selle kategooria tööriistad kontrollivad YAML-manifesti vastavust Kubernetes API-serveri nÔuetele.
- Valmis testijad. Selle kategooria tööriistad tulevad koos valmis testidega, mis kontrollivad turvalisust, vastavust parimatele praktikatele jne.
- Kohandatud valideerijad. Selles kategoorias olevad tööriistad vÔimaldavad luua kohandatud teste erinevates keeltes, nÀiteks Rego ja Javascript.
Selles artiklis kirjeldame ja vÔrreldame kuut erinevat tööriista:
- kubeval;
- kube-score;
- config-lint;
- copper;
- conftest;
- Polaris.
Noh, alustame!
Deploymentide kontrollimine
Enne kui hakkame tööriistu vÔrreldama, loome aluse, millel neid testida.
Allpool toodud manifest sisaldab mitmeid vigu ja parimate praktikate rikkumisi: kui palju neist leiate?
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector:
matchLabels:
app: http-echo
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo(base-valid.yaml)
Kasutame seda YAML-faili erinevate tööriistade vÔrdlemiseks.
Ălaltoodud manifest
base-valid.yamlja muud selles artiklis olevad manfestid on saadaval .
Manifest kirjeldab veebirakendust, mille pĂ”hieesmĂ€rk on vastata sĂ”numiga âHello Worldâ pordile 5678. Seda saab juurutada jĂ€rgmise kĂ€suga:
kubectl apply -f hello-world.yamlJa nii saab kontrollida selle toimimist:
kubectl port-forward svc/http-echo 8080:5678NĂŒĂŒd minge aadressile ja kinnitage, et rakendus töötab. Kuid kas see jĂ€rgib parimaid praktikaid? Kontrollime.
1. Kubeval
Kubevali aluseks On see idee, et kÔik suhtlemine Kubernetesega toimub lÀbi selle REST API. TeisisÔnu, saab kasutada API skeemi, et kontrollida, kas antud YAML vastab sellele. Vaadakem nÀidet.
kubeval on saadaval projekti veebilehel.
Originaali kirjutamise ajal oli saadaval versioon 0.15.0.
PĂ€rast installimist toome sisse eelpoolmainitud manifesti:
$ kubeval base-valid.yaml
PASS - base-valid.yaml sisaldab kehtivat Deployment'i (http-echo)
PASS - base-valid.yaml sisaldab kehtivat Service'i (http-echo)Edu korral lÔpetab kubeval töö exit-koodiga 0. Seda saab kontrollida jÀrgmiselt:
$ echo $?
0Proovime nĂŒĂŒd kubeval'i teise manifestiga:
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo(kubeval-invalid.yaml)
Kas suudate probleemile visuaalselt tÀhelepanu pöörata? KÀivitame:
$ kubeval kubeval-invalid.yaml
WARN - kubeval-invalid.yaml sisaldab kehtetut Deployment'i (http-echo) - selector: selector on vajalik
PASS - kubeval-invalid.yaml sisaldab kehtivat Service'i (http-echo)
# kontrollime tagastatud koodi
$ echo $?
1Ressurss ei lÀbi kontrolli.
Deployment'id, mis kasutavad API versiooni apps/v1, peavad sisaldama selektorit, mis vastab pod'i mĂ€rgisele. Ălaltoodud manifest ei sisalda selektorit, seetĂ”ttu teatas kubeval veast ja lĂ”petas mitte nullkoodiga.
Huvitav, mis juhtub, kui kÀivitada kubectl apply -f selle manifestiga?
Nojah, proovime:
$ 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=falseJust see viga, mille eest kubeval hoiatab. Selle parandamiseks vÔib lisada selektori:
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector: # !!!
matchLabels: # !!!
app: http-echo # !!!
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo(base-valid.yaml)
Tööriistade, nagu kubeval, eelis on see, et taolist viga saab tuvastada varakult juurutamise tsĂŒklis.
Lisaks ei ole nende kontrollide jaoks klastrisse ligipÀÀs vajalik: neid saab teha offline.
Kubeval kontrollib vaikimisi ressursse vastavuses kÔige uuema Kubernetes API skeemiga. Siiski vÔib enamikul juhtudel olla vajalik, et kontrollida vastavust konkreetse Kubernetes'i versiooniga. Selleks saab kasutada flagi --kubernetes-version:
$ kubeval --kubernetes-version 1.16.1 base-valid.yamlPange tÀhele, et versioon peab olema esitatud vormingus Major.Minor.Patch.
Ăksikasjaliku versioonide nimekirja, mille jaoks kontroll on saadaval, leiate , mida kubeval kasutab valideerimiseks. Kui soovite kĂ€ivitada kubeval offline, laadige skeemid alla ja mĂ€rkige nende kohaliku asukoha flagi abil --schema-location.
Kubeval suudab töötada ka kaustade ja stdin-iga, lisaks individuaalsetele YAML-failidele.
Samuti integreerub Kubeval hÔlpsasti CI-pipeline'i. Need, kes soovivad testida enne manifestide saatmist klastrisse, saavad rÔÔmuga teada, et kubeval toetab kolme vÀljundivormingut:
- Tavaline tekst;
- JSON;
- Test Anything Protocol (TAP).
Ja igat vormingut saab kasutada vĂ€ljundi edasise analĂŒĂŒsi jaoks, et koostada soovitud tulemuste kokkuvĂ”te.
Ăks kubevali puudustest on see, et ta ei oska hetkel kontrollida Custom Resource Definitions (CRD-de) vastavust. Kuid kubevali saab konfigureerida .
Kubeval on suurepÀrane tööriist ressursside kontrollimiseks ja hindamiseks; kuid tasub rÔhutada, et testi edukas lÀbimine ei garantii, et ressurss jÀrgib parimaid tavasid.
NĂ€iteks mitte-juurĂŒksuse mĂ€rgi kasutamine latest konteineris ei vasta parimatele tavasid. Kuid kubeval ei pea seda veaks ega teata sellest. See tĂ€hendab, et selline YAML-i kontroll lĂ”peb ilma hoiatusteta.
Aga mis siis, kui on vaja hinnata YAML-i ja tuvastada rikkumisi, nĂ€iteks mĂ€rki latest? ĐаĐș ĐżŃĐŸĐČĐ”ŃĐžŃŃ YAML-ŃаĐčĐ» ĐœĐ° ŃĐŸĐŸŃĐČĐ”ŃŃŃĐČОД Đ»ŃŃŃĐžĐŒ ĐżŃаĐșŃĐžĐșĐ°ĐŒ?
2. Kube-score
analĂŒĂŒsib YAML-i manifeste ja hindab neid sisseehitatud testide pĂ”hjal. Need testid valitakse turvatoimingute ja parimate tavade soovituste alusel, nĂ€iteks:
- Konteineri kĂ€itamine mitte juurĂŒksusena.
- Podi tervisekontrollide olemasolu.
- Ressursside nÔudmiste ja piirangute seadmine.
Testi tulemused on jÀrgmised: OK, HOIATUS ja KRITILINE.
Kube-score'i saab proovida veebis vÔi installida kohapeal.
Kuna originaali kirjutamise ajal oli kube-score'i uusim versioon 1.7.0.
Proovime seda meie manifeste. base-valid.yaml:
$ kube-score score base-valid.yaml
apps/v1/Deployment http-echo
[CRITICAL] Mahuti pilti silt
· http-echo -> Pilt, mille silt on viimane
Soovitatav on kasutada fikseeritud silti, et vÀltida juhuslikku uuendamist.
[CRITICAL] Pod NetworkPolicy
· Podil ei ole vastavat vÔrgupoliitikat
Looge NetworkPolicy, mis sihib seda podi.
[CRITICAL] Pod Probes
· Mahuti puudub readinessProbe
ReadinessProbe'i tuleks kasutada, et nÀidata, millal teenus on valmis liiklust vastu vÔtma.
Ilma selleta riskib pod saada tÀhelepanu enne, kui see on kÀivitatud. Seda kasutatakse ka
uuenduste ajal ning see vÔib vÀltida seisakut, kui rakenduse uus versioon ebaÔnnestub.
Lisainformatsioon: https://github.com/zegl/kube-score/blob/master/README_PROBES.md
[CRITICAL] Mahuti turvakonfiguratsioon
· http-echo -> Mahutil puudub konfigureeritud turvakonfiguratsioon
MÀÀrake securityContext, et kÀivitada konteiner turvalisemas kontekstis.
[CRITICAL] Mahuti ressursid
· http-echo -> CPU piirangut ei ole seadistatud
Ressursipiirangud on soovitatavad, et vÀltida ressursi DDOSi. MÀÀrake resources.limits.cpu
· http-echo -> MÀlu piirangut ei ole seadistatud
Ressursipiirangud on soovitatavad, et vÀltida ressursi DDOSi. MÀÀrake resources.limits.memory
· http-echo -> CPU soovi ei ole seadistatud
Ressursitaotlused on soovitatavad, et tagada rakenduse kÀivitamine ja töötamine ilma
kokku kukkumiseta. MÀÀrake resources.requests.cpu
· http-echo -> MÀlu soovi ei ole seadistatud
Ressursitaotlused on soovitatavad, et tagada rakenduse kÀivitamine ja töötamine ilma kokku kukkumiseta.
MÀÀrake resources.requests.memory
[CRITICAL] Rakendusel on PodDisruptionBudget
· Sobivat PodDisruptionBudgetit ei leitud
Soovitatav on defineerida PodDisruptionBudget, et vÀltida ootamatuid seisakuid Kubernetes
hooldustööde ajal, nĂ€iteks node'i tĂŒhjendamisel.
[WARNING] Rakendusel on host PodAntiAffinity
· Rakendusel ei ole seadistatud host podAntiAffinity't
Soovitatav on seada podAntiAffinity, mis takistab mitmete rakenduse podide ajakava samale node'ile. See suurendab kÀttesaadavust, kui node muutub kÀttesaamatuks.YAML lÀbib kubevali kontrollid, samas kui kube-score toob vÀlja jÀrgmised puudused:
- Valmiduse kontrolle ei ole seadistatud.
- Puuduvad CPU ja mĂ€lu ressursidele mÀÀratud requestâid ja limitâid.
- Pod katkestamise eelarveid ei ole mÀÀratud.
- Puuduvad eraldi olemasolu reeglid (anti-affinity) maksimaalse kÀttesaadavuse suurendamiseks.
- Konteiner töötab rootâi Ă”igustes.
KÔik need on asjakohased mÀrkused puudustest, mis tuleb kÔrvaldada, et Deployment oleks tÔhusam ja usaldusvÀÀrsem.
Meeskond kube-score esitab teavet loetavas vormis, sealhulgas kĂ”ik tĂŒĂŒpi rikkumised HOIATUS ja KRITILINE, mis aitab vĂ€ga arendamise kĂ€igus.
Soovijad, kes soovivad seda tööriista kasutada CI-pipe'i osana, saavad kasutada kompaktselt vÀljastamist lipuga --output-format ci (siinjuures vÀljastatakse ka testid koos tulemusega OK):
$ kube-score score base-valid.yaml --output-format ci
[HEA] http-echo apps/v1/Deployment
[HEA] http-echo apps/v1/Deployment
[KRIT] http-echo apps/v1/Deployment: (http-echo) CPU piirang ei ole seadistatud
[KRIT] http-echo apps/v1/Deployment: (http-echo) MĂ€lupiirang ei ole seadistatud
[KRIT] http-echo apps/v1/Deployment: (http-echo) CPU nÔue ei ole seadistatud
[KRIT] http-echo apps/v1/Deployment: (http-echo) MÀlunÔue ei ole seadistatud
[KRIT] http-echo apps/v1/Deployment: (http-echo) Pilt, millel on uusim silt
[HEA] http-echo apps/v1/Deployment
[KRIT] http-echo apps/v1/Deployment: Podil ei ole sobivat veebipoliitikat
[KRIT] http-echo apps/v1/Deployment: konteineril puudub readinessProbe
[KRIT] http-echo apps/v1/Deployment: (http-echo) Kontaineril pole seadistatud turvekonteksti
[KRIT] http-echo apps/v1/Deployment: Sobivat PodDisruptionBudgetit ei leitud
[HOIATUS] http-echo apps/v1/Deployment: Juhtimine ei ole seadistatud
[HEA] http-echo v1/Service
[HEA] http-echo v1/Service
[HEA] http-echo v1/Service
[HEA] http-echo v1/ServiceNagu kubeval, tagastab kube-score nullist erineva vÀljakoodiga, kui leidub test, mis lÔppes veaga KRITILINE. Samuti on vÔimalik aktiveerida sarnane töötlemine ka HOIATUS.
Lisaks on vÔimalik kontrollida ressursse vastavuses erinevate API versioonidega (nagu kubeval). Kuid see teave on 'hardcode'itud ise kube-score'i: teistsugust Kubernetes'i versiooni valida ei ole vÔimalik. Selline piirang vÔib osutuda suureks probleemiks, kui plaanite klastrit uuendada vÔi kui teil on mitu klastrit erinevate K8s versioonidega.
Pange tÀhele, et ettevÔtte pakkumisega seda vÔimalust rakendada.
Lisainfo kube-score kohta leiate .
Kube-score testid on suurepÀrane vahend parimate praktikate rakendamiseks, kuid mis siis, kui on vajalik testi muuta vÔi lisada oma reegleid? Kahjuks ei ole seda vÔimalik teha.
Kube-score ei ole laiendatav: sellele ei saa lisada poliitikaid ega kohandada neid.
Kui on vajalik kirjutada kohandatud teste ettevÔtte heakskiidetud poliitikate kontrollimiseks, saate kasutada mÔnda jÀrgmistest neljast tööriistast: config-lint, copper, conftest vÔi polaris.
3. Config-lint
Config-lint on YAML, JSON, Terraform, CSV ja Kubernetes manifestide konfiguratsioonifailide valideerimise tööriist.
Selle saab paigaldada projekti veebilehelt.
Praegune vĂ€ljaanne originaali kirjutamise hetkel â 1.5.0.
Config-lint ei sisalda sisse ehitatud teste Kubernetes manifestide kontrollimiseks.
Iga testi lÀbiviimiseks on vajalik luua vastavad reeglid. Need kirjutatakse YAML-failidesse, mida nimetatakse 'reeglistikeks' (rulesets), ja neil on jÀrgmine struktuur:
version: 1
description: Reeglid Kubernetes spetsiifiliste failide jaoks
type: Kubernetes
files:
- "*.yaml"
rules:
# reeglite nimekiri(rule.yaml)
Uurime seda lÀhemalt:
- VĂ€li
typemĂ€rgib, millist konfiguratsioonitĂŒĂŒpi config-lint kasutada. K8si manifestide jaoks on see alatiKubernetes. - VĂ€ljal
filesnende failide kÔrval saab mÀÀrata ka kausta. - VÀli
ruleson ette nÀhtud kasutaja testide mÀÀramiseks.
Oletame, et soovite veenduda, et Deployment'is olevad pildid laaditakse alati usaldusvÀÀrsest registrist, nÀiteks my-company.com/myapp:1.0. config-lint'i reegel, mis sellist kontrolli teostab, nÀeb vÀlja jÀrgmine:
- id: MY_DEPLOYMENT_IMAGE_TAG
severity: FAILURE
message: Deployment peab kasutama kehtivat pildimÀrki
resource: Deployment
assertions:
- every:
key: spec.template.spec.containers
expressions:
- key: image
op: starts-with
value: "my-company.com/"(rule-trusted-repo.yaml)
Iga reegel peab sisaldama jÀrgmisi atribuute:
idâ reegli unikaalne identifikaator;severityâ vĂ”ib olla FAILURE, HOIATUS ja NON_COMPLIANT;messageâ reegli rikkumise korral kuvatakse selle rea sisu;resourceâ ressurssi tĂŒĂŒp, millele seda reeglit rakendatakse;assertionsâ tingimuste loetelu, mida hinnatakse antud ressursi suhtes.
Ălaltoodud reeglites assertion nimetusega kontrollib, et kĂ”ik konteinerid Deployment'is (key: spec.templates.spec.containers) kasutavad usaldusvÀÀrseid pilte (st, mis algavad my-company.com/).
TÀielik reeglistik nÀeb vÀlja jÀrgmine:
versioon: 1
kirjeldus: Kubernetes'i spetsifikatsioonifailide reeglid
tĂŒĂŒp: Kubernetes
failid:
- "*.yaml"
reeglid:
- id: DEPLOYMENT_IMAGE_REPOSITORY # !!!
tÔsidus: FAILURE
sÔnum: Deployment peab kasutama kehtivat pildirepositooriumi
ressurss: Deployment
vÀidete:
- iga:
vÔtme: spec.template.spec.containers
vÀljendid:
- vÔtme: image
op: algab
vÀÀrtus: "my-company.com/"(ruleset.yaml)
Selle testi katsetamiseks salvestame selle nimega check_image_repo.yaml. KĂ€ivitame kontrolli faili ĂŒle base-valid.yaml:
$ config-lint -rules check_image_repo.yaml base-valid.yaml
[
{
"AssertionMessage": "Iga vÀide ebaÔnnestub: ja vÀide ebaÔnnestub: pilt ei alga my-company.com/-ga",
"Category": "",
"CreatedAt": "2020-06-04T01:29:25Z",
"Filename": "test-data/base-valid.yaml",
"LineNumber": 0,
"ResourceID": "http-echo",
"ResourceType": "Deployment",
"RuleID": "DEPLOYMENT_IMAGE_REPOSITORY",
"RuleMessage": "Deployment peab kasutama kehtivat pildirepositooriumi",
"Status": "FAILURE"
}
]Kontroll ebaĂ”nnestus. NĂŒĂŒd kontrollime jĂ€rgmist manifesti, millel on Ă”ige pildirepositoorium:
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector:
matchLabels:
app: http-echo
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: my-company.com/http-echo:1.0 # !!!
args: ["-text", "hello-world"]
ports:
- containerPort: 5678(image-valid-mycompany.yaml)
KĂ€ivitame sama testi eespool toodud manifestiga. Probleeme ei tuvastatud:
$ config-lint -rules check_image_repo.yaml image-valid-mycompany.yaml
[]Config-lint â arene, mis vĂ”imaldab luua kohandatud teste Kubernetes YAML-manifestide kontrollimiseks YAML DSL-i abil.
Aga mida teha, kui on vajalik keerulisem loogika ja testid? Kas YAML vÔimalused ei ole selle jaoks liiga piiratud? Mis oleks, kui saaksime testid luua tÀisvÀÀrtuslikus programmeerimiskeeles?
4. Copper
â see on raamistik manustamisretseptide valideerimiseks kohandatud testide abil (sarnane config-lintâile).
Kuid see erineb viimasest selle poolest, et ei kasuta testide kirjeldamiseks YAML-i. Selle asemel saab testid luua JavaScriptis. Copper pakub raamatukogu, mis sisaldab mitmeid pÔhivahendeid, mis aitavad lugeda teavet Kubernetes objektide kohta ja teatada vigadest.
Copperi installimiseks vajalikud sammud leiate .
2.0.1 â see on uusim versioon sellest utiliidist artikli kirjutamise ajal.
Nagu config-lint, ei oma ka Copper sisseehitatud teste. Kirjutame ĂŒhe. Las see kontrollib, et vĂ€ljastused kasutavad konteinerit piltide jaoks ainult usaldusvÀÀrsetest hoidlatest nagu my-company.com.
Looge fail check_image_repo.js jÀrgnevate sisu kujul:
$$.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)
}
});
}
});NĂŒĂŒd, et kontrollida meie manifesti base-valid.yaml, kasutage kĂ€sku 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 failedOn selge, et copper vĂ”imaldab keerukamaid teste â nĂ€iteks kontrollida ingressi manifestides domeeninimesid vĂ”i tagasi lĂŒkata pod'e, mis töötavad privileeritud reĆŸiimis.
Copperis on mitmeid utiliite:
DockerImageloeb mÀÀratud sisendfaili ja loob objekti jĂ€rgmiste atribuutidega:nameâ pildi nimi,tagâ pildi silt,registryâ pildiregister,registry_urlâ protokoll (https://) ja pildiregister,fqinâ pildi tĂ€ielik asukoht.
- Function
findByNameaitab leida ressursi mÀÀratud tĂŒĂŒbi (kind) ja nime (name) pĂ”hjal sisendfailist. - Function
findByLabelsaitab leida ressursi mÀÀratud tĂŒĂŒbi (kind) ja markerite (labels).
KÔikide saadavalolevate utiliitide kohta saate lugeda .
Vaikimisi laadib see kogu sisendi YAML-faili muutujasse $$ ja muudab selle skriptidele kergesti kÀttesaadavaks (tuttav meetod neile, kellel on kogemusi jQuery-ga).
Copperi peamine eelis on selge: teil ei ole vaja Ôppida spetsiifilist keelt ja saate kasutada erinevaid JavaScripti vÔimalusi oma testide loomiseks, nagu stringide interpolatsioon, funktsioonid jne.
Samuti tasub mainida, et praegune Copperi versioon töötab JavaScripti mootoriga versioonis ES5, mitte ES6.
Ăksikasjad on saadaval .
Kuid kui te ei armasta JavaScripti ning eelistate keelt, mis on spetsiaalselt mÔeldud pÀringute koostamiseks ja poliitikate kirjeldamiseks, peaksite vaatama conftest'i.
5. Conftest
Conftest on konfiguratsioonide verifitseerimise raamistik. Sobib ka Kubernetes'i manifestide testimiseks/valideerimiseks. Testid on kirjutatud spetsialiseeritud pÀringute keeles .
Conftest'i saab installida , mis on toodud projekti veebilehel.
Kuna kirjutamise ajal oli originaalartikli kÔige uuem versioon 0.18.2.
Sarnaselt config-lint-ile ja copper-ile, conftest ei tule koos ĂŒhegi sisseehitatud testiga. Proovime seda ja kirjutame oma poliitika. Nagu eelmistes nĂ€idetes, kontrollime, kas konteineripildid pĂ€rinevad usaldusvÀÀrsest allikast.
Looge kataloog conftest-checks, ja selles â fail nimega check_image_registry.rego jĂ€rgnevate sisu kujul:
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])
}NĂŒĂŒd katsetame base-valid.yaml kaudu 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 failureTest ebaÔnnestus, kuna pildid pÀrinevad usaldusvÀÀrsest allikast.
Rego failis mÀÀrame ploki deny. Selle tĂ”evÀÀrtust kĂ€sitletakse rikkumisena. Kui plokke deny on mitu, kontrollib conftest neid ĂŒkshaaval ning ĂŒhe ploki tĂ”evÀÀrtus tĂ”lgendatakse rikkumisena.
Lisaks vaikimisi vĂ€ljundile toetab conftest JSON-i, TAP-i ja tabeliformaati â ÀÀrmiselt kasulik vĂ”imalus, kui on vaja integreerida aruanded olemasolevasse CI-pipeline'i. Soovitud formaati saab mÀÀrata lipuga --output.
Politikate hĂ”lbustamiseks on conftestis lipp --trace. See vĂ€ljastab jĂ€lgimise, kuidas conftest analĂŒĂŒsib esitatud poliitikafaile.
Conftesti poliitikaid saab avaldada ja nendega jagada OCI registrites (Open Container Initiative) artefaktidena.
Meeskonnad push ja pull vÔimaldavad artefakti avaldamist vÔi olemasoleva artefakti vÀljavÔtmist kaugregistrist. Proovime avaldada meie loodud poliitika kohaliku Docker registriga kasutades conftest push.
KĂ€ivitage kohalik Docker register:
$ docker run -it --rm -p 5000:5000 registryTeises terminalis minge varem loodud katalooge conftest-checks ja tee jÀrgmine kÀsk:
$ conftest push 127.0.0.1:5000/amitsaha/opa-bundle-example:latestKui kĂ€sk Ă”nnestus, nĂ€ete jĂ€rgmise tĂŒĂŒpi sĂ”numit:
2020/06/10 14:25:43 pushitud pakett koos digestiga: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609cNĂŒĂŒd looge ajutine kataloog ja kĂ€ivitage selles kĂ€sk conftest pull. See laadib alla paketi, mis loodi eelmise kĂ€suga:
$ cd $(mktemp -d)
$ conftest pull 127.0.0.1:5000/amitsaha/opa-bundle-example:latestAjutises kataloogis ilmub alamkataloog policy, sisaldades meie poliitikafaili:
$ tree
.
âââ policy
âââ check_image_registry.regoTeste saab lĂ€bi viia otse hoidlast:
$ conftest test --update 127.0.0.1:5000/amitsaha/opa-bundle-example:latest base-valid.yaml
..
EBA - base-valid.yaml - pilt 'hashicorp/http-echo' ei pÀrine tule my-company.com repositooriumist
2 testi, 1 lÀbis, 0 hoiatused, 1 ebaÔnnestumineKahjuks ei toeta DockerHub praegu. Nii et vÔiks öelda, et olete Ônnelik, kui kasutate (ACR) vÔi oma registrit.
Artefakti formaat on sama mis (OPA) paketidel, mis vÔimaldab kasutada conftest'i olemasolevate OPA paketist testide kÀivitamiseks.
Rohkem poliitikate jagamisest ja conftest`i muudest omadustest saab lugeda .
6. Polaris
Viimase tööriistana, millest juttu tuleb, on . (Me rÀÀkisime selle eelmise aasta esitlemisest juba â kommentaar tĂ”lkijalt.)
Polaris vĂ”ib paigaldada klastrisse vĂ”i kasutada kĂ€sureĆŸiimis. Nagu vĂ”ite arvata, vĂ”imaldab see analĂŒĂŒsida Kubernetes'i manifeste.
KĂ€sureĆŸiimis on saadaval sisseehitatud testid, mis katavad selliseid valdkondi nagu turvalisus ja parimad praktikad (nagu kube-score). Lisaks saab luua oma teste (nagu config-lint, copper ja conftest).
Teisis sĂ”nu, Polaris ĂŒhendab endas mĂ”lema kategooria tööriistade eelised: nii sisseehitatud kui ka kasutajapĂ”hised testid.
Polaris'i installimiseks kĂ€sureĆŸiimis jĂ€rgige .
Algse artikli kirjutamise ajal on saadaval versioon 1.0.3.
PÀrast installimise lÔpetamist saab polaris'e manifestiga kÀivitada base-valid.yaml jÀrgmist kÀsku kasutades:
$ polaris audit --audit-path base-valid.yamlSee genereerib JSON-formaadis rea, mis sisaldab ĂŒksikasjalikku teavet sooritatud testide ja nende tulemustega. VĂ€ljundil on jĂ€rgmine struktuur:
{
"PolarisOutputVersion": "1.0",
"AuditTime": "0001-01-01T00:00:00Z",
"SourceType": "Path",
"SourceName": "test-data/base-valid.yaml",
"DisplayName": "test-data/base-valid.yaml",
"ClusterInfo": {
"Version": "unknown",
"Nodes": 0,
"Pods": 2,
"Namespaces": 0,
"Controllers": 2
},
"Results": [
/* pikk loetelu */
]
}TÀielik vÀljund on saadaval .
Nagu kube-score, tuvastab ka Polaris probleemid valdkondades, kus manifest ei vasta parimatele praktikale:
- Pod'ide tervisekontrollid puuduvad.
- Konteineripiltide jaoks pole silte mÀÀratud.
- Konteiner töötab rootâi Ă”igustes.
- MÀlu ja CPU nÔuded ning limiidid pole mÀÀratud.
Iga testi puhul mÀÀratakse sĂ”ltuvalt selle tulemustest kriitilisuse tase: hoiatus vĂ”i oht. Ette teada saada rohkem olemasolevate sisseehitatud testide kohta, vĂ”tke ĂŒhendust .
Kui ĂŒksikasjad pole vajalikud, saate mÀÀrata lipu --format score. Sel juhul kuvab Polaris arvu vahemikus 1 kuni 100 â score (st. hinnang):
$ polaris audit --audit-path test-data/base-valid.yaml --format score
68Mida lÀhemal on hinnang 100-le, seda kÔrgem on vastavuse aste. Kui kontrollite kÀsku polaris audit, selgub, et see on vÔrdne 0.
Sundida polaris audit lÔpetama mitte-nullkoodiga saab kasutada kaht lippu:
- Lipp
--set-exit-code-below-scorevĂ”tab argumendiks piirdetĂ€hise vahemikus 1-100. Sel juhul lĂ”petab kĂ€sk exit-koodiga 4, kui skoor on madalam kui piirmÀÀr. See on vĂ€ga mugav, kui teil on mingi piirmÀÀr (ĂŒtleme, 75) ja vajate hoiatust, kui skoor langeb alla selle. - Lipp
--set-exit-code-on-dangertuleb kĂ€sk lĂ”petada koodiga 3, kui ĂŒkski danger-testidest ebaĂ”nnestub.
NĂŒĂŒd proovime luua kohandatud testi, mis kontrollib, kas pilt vĂ”etakse usaldusvÀÀrsest hoidlast. Kohandatud testid mÀÀratakse YAML formaadis ja test ise kirjeldatakse JSON Schema abil.
JĂ€rgmine YAML-i koodifragmendi kirjeldab uut testi, mida nimetatakse checkImageRepo:
checkImageRepo:
successMessage: Pildi registri kontroll on kehtiv
failureMessage: Pildi registri kontroll ei ole kehtiv
category: Pildid
target: Konteiner
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
pattern: ^my-company.com/.+$Vaadakem sellele lÀhemalt:
successMessageâ see rida kuvatakse, kui test Ă”nnestub;failureMessageâ see sĂ”num kuvatakse ebaĂ”nnestumise korral;categoryâ nĂ€itab ĂŒhte kategooriast:Pildid,Tervisekontrollid,Turvalisus,VĂ”rgustikjaRessursid;targetâ mÀÀrab tĂŒĂŒbi objekti (spec) millele test rakendub. VĂ”imalikud vÀÀrtused:Konteiner,PodvĂ”iKontroller;- Test ise mÀÀratakse objekti sees
skeemagaJSON skeemi abil. Antud testis on vÔtmesÔnapatternkasutatakse pildi allika vÔrdlemiseks nÔutud.
Eelnimetatud testi kÀivitamiseks on vajalik jÀrgmine Polaris konfiguratsioon:
checks:
checkImageRepo: danger
customChecks:
checkImageRepo:
successMessage: Pildi registri kontroll on kehtiv
failureMessage: Pildi registri kontroll ei ole kehtiv
category: Pildid
target: Konteiner
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
pattern: ^my-company.com/.+$(polaris-conf.yaml)
AnalĂŒĂŒsime faili:
- VĂ€ljal
checksmÀÀritellÀÀn testit ja niiden kriittisyystaso. Koska on suositeltavaa saada varoitus, kun kuva otetaan epÀluotettavasta lÀhteestÀ, asetamme tÀlle tasonoht. - Test ise
checkImageRepositten mÀÀritellÀÀn objektissacustomChecks.
Tallenna tiedosto nimellÀ custom_check.yaml. Nyt voit suorittaa polaris audit YAML-manifestilla, joka tarvitsee tarkistusta.
Testataan manifestimme base-valid.yaml:
$ polaris audit --config custom_check.yaml --audit-path base-valid.yamlMeeskond polaris audit suoritti vain ylle mÀÀritellyn kÀyttÀjÀtestin, eikÀ se onnistunut.
Jos korjaat kuvan my-company.com/http-echo:1.0, Polaris pÀÀttyy onnistuneesti. Muokattu manifesti on jo olemassa , joten voit tarkistaa edellisen komennon manifestista image-valid-mycompany.yaml.
Nyt kysymys kuuluu: miten kÀynnistÀÀ sisÀÀnrakennetut testit yhdessÀ kÀyttÀjÀtestien kanssa? Se on helppoa! Tarvitset vain lisÀtÀ sisÀÀnrakennettujen testien tunnisteet konfiguraatiotiedostoon. TÀllöin se saa seuraavan muodon:
kontrollid:
cpuRequestsMissing: hoiatus
cpuLimitsMissing: hoiatus
# Teised sisseehitatud kontrollid..
# ..
# kohandatud kontrollid
checkImageRepo: oht # !!!
kohandatudKontrollid:
checkImageRepo: # !!!
successMessage: Piltide register on kehtiv
failureMessage: Piltide register ei ole kehtiv
category: Pildid
target: Konteiner
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
pattern: ^my-company.com/.+$(config_with_custom_check.yaml)
TÀieliku konfiguratsioonifaili nÀide on saadaval .
Kontrolli manifeesti base-valid.yaml, kasutades sisseehitatud ja kohandatud teste, saab teha kÀsuga:
$ polaris audit --config config_with_custom_check.yaml --audit-path base-valid.yamlPolaris tĂ€iendab sisseehitatud teste kohandatud testidega, ĂŒhendades seelĂ€bi kahe maailma parimad kĂŒljed.
Teisest kĂŒljest vĂ”ib vĂ”imetus kasutada tugevamaid keeli, nagu Rego vĂ”i JavaScript, olla piirav tegur, mis takistab keerukamate testide loomist.
Lisainfot Polari kohta on saadaval .
KokkuvÔte
Kuigi on palju tööriistu Kubernetes YAML-failide kontrollimiseks ja hindamiseks, on oluline omada selget arusaama sellest, kuidas teste kavandatakse ja tehakse.
NÀiteks, kui vÔtta Kubernetes'i manifeestid, mis lÀbivad torujuhe, vÔiks kubeval olla sellise torujuhtme esimene samm. Ta jÀlgiks, kas objektide mÀÀratlemine vastab Kubernetes API skeemile.
PÀrast sellise kontrolli lÔpetamist vÔiks edasi liikuda keerukamate testide juurde, nagu standardite jÀrgimine ja spetsiifilised poliitikad. Siin tuleks kasuks kube-score ja Polaris.
Need, kellel on keerulised nÔuded ja vajadus teste pÔhjalikult kohandada, vÔiksid valida copperi, config-linti ja conftesti..
Conftest ja config-lint kasutavad YAML-i kasutajate testide mÀÀratlemiseks, samas kui copper pakub juurdepÀÀsu tĂ€isfunktsionaalsele programmeerimiskeelele, mis teeb selle ĂŒsna atraktiivseks valikuks.
Teisest kĂŒljest, kas tuleks kasutada ĂŒhte neist tööriistadest ja seega kirjutada kĂ”ik testid kĂ€sitsi, vĂ”i valida Polaris ja lisada sinna ainult vajalikud osad? Sellele kĂŒsimusele pole ĂŒheselt vastust..
Allolev tabel sisaldab lĂŒhikest ĂŒlevaadet igast tööriistast:
Tööriista
EesmÀrk
Puudused
Kasutajatestid
kubeval
Kontrollib YAML-manifestide vastavust konkreetse API skeemi versioonile.
Ei oska töötada CRD-dega.
Ei
kube-score
AnalĂŒĂŒsib YAML-manifeste parimate tavade jĂ€rgimise osas.
Ei saa valida oma Kubernetes API versiooni ressursside kontrollimiseks.
Ei
copper
YAML-manifestide jaoks kohandatud JavaScript-testide loomise ĂŒldine raamistik
Ei ole sisseehitatud teste. Piiratud dokumentatsioon
Jah
config-lint
YAML-ile integreeritud objektikeeltestide loomise ĂŒldine raamistik. Toetab erinevaid konfiguratsiooniformaate (nt Terraform)
Ei ole valmis teste. Sisseehitatud assertions ja funktsioonid vÔivad olla ebapiisavad
Jah
conftest
Rego (spetsialiseeritud pÀringute keel) abil oma testide loomise raamistik. Lubab jagada poliitikaid OCI pakettide kaudu
Ei ole sisseehitatud teste. Peab Ôppima Regot. Docker Hub ei toeta poliitikate avaldamist
Jah
Polaris
AnalĂŒĂŒsib YAML-manifeste standardsete parimate praktikate jĂ€rgimise osas. Lubab luua kohandatud teste JSON Schema abil
Testimise vÔimalused, mis pÔhinevad JSON Schemal, vÔivad olla ebapiisavad
Jah
Kuna need tööriistad ei sÔltu Kubernetes'i klastri juurdepÀÀsust, on nende paigaldamine lihtne. Need vÔimaldavad allikafaile filtreerida ja annavad pull request'ide autoritele kiire tagasiside.
P.S. tÔlkija mÀrkused
Lugege ka meie blogist:
- «»;
- «»;
- «».
Allikas: habr.com
