MĂ€rkus tĂ”lke kohta.: K8s-keskkondade YAML-konfiguratsioonide arvu kasvuga muutub nende automatiseeritud kontrollimise vajadus ĂŒha olulisemaks. Selle ĂŒlevaate autor on mitte ainult valinud olemasolevad lahendused, vaid ka vaadanud, kuidas need töötavad, kasutades nĂ€iteks Deployment'i. TĂ”enĂ€oliselt on see vĂ€ga informatiivne neile, keda see teema huvitab.

TL;DR: Artiklis vÔrreldakse kuut staatilist tööriista Kubernetes YAML-failide kontrollimiseks ja hindamiseks parimate praktikate ja nÔuete jÀrgimise osas.
Kubernetes'e laadimised mÀÀratakse tavaliselt YAML-dokumentide kujul. Ăks suurimaid probleeme YAML-iga on piirangute vĂ”i manifestifailide vaheliste suhete mÀÀramise keerukus.
Mis siis, kui me peame veenduma, et kÔik klastrisse juurutatud pildid pÀrinevad usaldusvÀÀrsest registrist?
Kuidas vÀltida Deployment'ide saatmist klastrisse, mille jaoks ei ole mÀÀratud PodDisruptionBudgets?
Statistilise testimise integreerimine vÔimaldab avastada vigu ja poliitikate rikkumisi juba arenduse kÀigus. Nii suureneb ressursside mÀÀratlemise tÀpsuse ja ohutuse garantii ning tÔenÀosus, et tootmislaadimised jÀrgivad parimaid praktikaid.
Kubernetes'e YAML-failide staatilise kontrollimise ökosĂŒsteemi saab jagada jĂ€rgmistesse kategooriatesse:
- API- valideerijad. Selle kategooria tööriistad kontrollivad YAML-manifesti Kubernetes'e API-serveri nÔuete jÀrgimise poolest.
- Valmis testijad. Selle kategooria tööriistad tulevad koos valmis testidega, mis kÀsitlevad turvalisust, parimate praktikate jÀrgimist jne.
- Kohandatud valideerijad. Selle kategooria esindajad vÔimaldavad luua kohandatud teste erinevates keeltes, nÀiteks Regos ja Javascriptis.
Selles artiklis kirjeldame ja vÔrreldame kuut erinevat tööriista:
- kubeval;
- kube-score;
- config-lint;
- copper;
- conftest;
- Polaris.
Olgu, alustame siis!
Deployment'ide kontrollimine
Enne tööriistade vÔrdlemise alustamist loome aluse, millel me neid testime.
Allolev manifest sisaldab mitmeid vigu ja parimate praktikate jÀrgimise puudujÀÀke: kui palju neist suudad sina leida?
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-i erinevate tööriistade vÔrdlemiseks.
Ălaltoodud manifest
base-valid.yamlja muud selle artikli manifestid leiate .
Manifest kirjeldab veebirakendust, mille peamine ĂŒlesanne on vastata sĂ”numiga âHello Worldâ pordile 5678. Selle saab juurutada jĂ€rgmist kĂ€sku kasutades:
kubectl apply -f hello-world.yamlJa nĂŒĂŒd â kontrollige tööd:
kubectl port-forward svc/http-echo 8080:5678Mine nĂŒĂŒd aadressile ja kinnita, et rakendus töötab. Kuid kas see jĂ€rgib parimaid tavasid? Vaatame jĂ€rgi.
1. Kubeval
Kubevali aluseks on idee, et kĂ”ik suhtlemine Kubernetesega toimub lĂ€bi tema REST API. TeisisĂ”nu, saate kasutada API skeemi, et kontrollida, kas antud YAML sellele vastab. Vaatame kĂŒhendust. Originaali kirjutamise ajal oli saadaval versioon 0.15.0.
$ kubeval base-valid.yaml PASS - base-valid.yaml sisaldab kehtivat Deployment'i (http-echo) PASS - base-valid.yaml sisaldab kehtivat Service'i (http-echo)
Kui kÔik Ônnestub, lÔpetab kubeval töö exit-koodiga 0. Selle saab kontrollida jÀrgmisel viisil:
$ echo $? 0
NĂŒĂŒd katsetame kubeval 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.yamlKas saate palja silmaga probleemi mÀÀrata? KÀivitage:
$ kubeval kubeval-invalid.yaml
WARN - kubeval-invalid.yaml sisaldab kehtivat Deployment'i (http-echo) - selector: selector on vajalik
PASS - kubeval-invalid.yaml sisaldab kehtivat Service'i (http-echo)
# kontrollime tagastuskoode
$ echo $?
1(Ressurssi ei suudeta valideerida.)
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-null koodiga.
Huvitav, mis juhtub, kui kÀivitada kubectl apply -fselle manifestiga?
Huvitav, mis juhtub, kui tÀitmine kubectl apply -f selle manifestiga?
No nii, proovime siis;
$ 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, the error that kubeval warned about. You can fix it by adding a selector:
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)
Kubevali tööriistade eelis on see, et sarnaseid vigu saab tuvastada varases juurutamisfaasis.
Lisaks ei vaja nende kontrollide jaoks klastrisse pÀÀsu: neid saab teha ka offline.
Kubeval kontrollib vaikimisi ressursse vastavuses Kubernetes API kÔige uuema skeemiga. Kuid enamikul juhtudel vÔib teil olla vaja kontrollida vastavust konkreetse Kubernetes versiooniga. Seda saab teha lipuga --kubernetes-version:
$ kubeval --kubernetes-version 1.16.1 base-valid.yamlPange tÀhele, et versioon tuleb esitada formaadis Major.Minor.Patch.
To View the list of versions that are supported for validation, see , which kubeval uses for validation. If you need to run kubeval offline, download the schemas and specify their local location using the flag --schema-location.
Lisaks ĂŒksikutele YAML-failidele, saab kubeval töötada ka kataloogide ja stdin'iga.
Samuti integreerub Kubeval hÔlpsasti CI-pipeline'iga. Need, kes soovivad teste enne manifestide saatmist klastrisse lÀbi viia, on rÔÔmsad teada, et kubeval toetab kolme vÀljundiformaati:
- Tavaline tekst;
- JSON;
- Test Anything Protocol (TAP).
Ja ĂŒkskĂ”ik millist formaati saab kasutada vĂ€ljundi edasiseks töötlemiseks, et luua soovitud tulemuste kokkuvĂ”te.
Ăks kubevali puudustest on see, et praegu ei kontrolli see Custom Resource Definitions (CRDs) vastavust. Kuid kubeval'i saab seadistada .
Kubeval on suurepÀrane tööriist ressursside kontrollimiseks ja hindamiseks; tÔsi, on oluline rÔhutada, et testi edukas lÀbimine ei garanteeri, et ressurss vastab parimatele praktikatele.
NÀiteks sildi kasutamine latest Konteiner ei vasta parimaid tavasid. Kuid kubeval ei loe seda veaks ega teata sellest. See tÀhendab, et selline YAML-i kontroll lÔpeb ilma hoiatusteta.
Aga mis siis, kui peame hindama YAML-i ja tuvastama rikkumisi, nĂ€iteks sildi latest? ĐаĐș ĐżŃĐŸĐČĐ”ŃĐžŃŃ YAML-ŃаĐčĐ» ĐœĐ° ŃĐŸĐŸŃĐČĐ”ŃŃŃĐČОД Đ»ŃŃŃĐžĐŒ ĐżŃаĐșŃĐžĐșĐ°ĐŒ?
2. Kube-score
analĂŒĂŒsib YAML-i manifestide ja hindab neid sisseehitatud testide pĂ”hjal. Need testid valitakse turvalisuse ja parimate praktikate soovituste jĂ€rgi, nĂ€iteks:
- Konteineri kÀitamine ei ole root'i all.
- Pod-ide tervisekontrollide olemasolu.
- Ressursside request'ide ja limit'ide mÀÀramine.
Testi tulemuseks on kolm tulemust: OK, HOIATUS ja KRITILINE.
Kube-score'i saab proovida veebis vÔi installida seda kohalikult.
Originaalartikli kirjutamise ajal oli kube-score'i uusim versioon 1.7.0.
Proovime seda meie manifestil base-valid.yaml:
$ kube-score score base-valid.yaml
apps/v1/Deployment http-echo
[KRITILINE] Konteineri pildil silti
· http-echo -> Pilt, millel on viimane silt
Soovitatav on kasutada fikseeritud silti, et vÀltida juhuslikke vÀrskendusi
[KRITILINE] Pod NetworkPolicy
· Pod-il puudub vastav vÔrgupoliitika
Looge NetworkPolicy, mis suunab selle pod'i
[KRITILINE] Pod Probes
· Konteinerel puudub readinessProbe
ReadinessProbe'i tuleks kasutada, et nÀidata, millal teenus on valmis liiklust vastu vÔtma.
Ilma selleta riskib Pod liikluse saamisega enne, kui see on kÀivitatud. Seda kasutatakse ka vÀljaandmisel ning see vÔib Àra hoida seisakuid, kui uue rakenduse versioon ebaÔnnestub.
Rohkem teavet: https://github.com/zegl/kube-score/blob/master/README_PROBES.md
[KRITILINE] Konteineri turvakontekst
· http-echo -> Konteineril puudub konfigureeritud turvakontekst
MÀÀrake securityContext, et kÀitada konteinerit turvalisemas kontekstis.
[KRITILINE] Konteineri ressursid
· http-echo -> CPU piirangut ei ole seadistatud
Ressursipiirangud on soovitatavad, et vÀltida ressursi DDOS-i. MÀÀrake resources.limits.cpu
· http-echo -> MÀlupiirangut ei ole seadistatud
Ressursipiirangud on soovitatavad, et vÀltida ressursi DDOS-i. MÀÀrake resources.limits.memory
· http-echo -> CPU request'i ei ole seadistatud
Ressursi soovitused on soovitatavad, et veenduda, et rakendus saab kÀivituda ja töötada ilma kokku kukkumata. MÀÀrake resources.requests.cpu
· http-echo -> MÀlrequest'i ei ole seadistatud
Ressursi soovitused on soovitatavad, et veenduda, et rakendus saab kÀivituda ja töötada ilma kokku kukkumata.
MÀÀrake resources.requests.memory
[KRITILINE] Deployment'il puudub PodDisruptionBudget
· Vastavat PodDisruptionBudget'i ei leitud
Soovitatav on mÀÀrata PodDisruptionBudget, et vĂ€ltida ootamatuid seisakuid Kubernetes'e hooldusoperatsioonide ajal, nĂ€iteks sĂ”lme tĂŒhjendamisel.
[HOIATUS] Deployment'il on host PodAntiAffinity
· Deployment'il ei ole seadistatud host podAntiAffinity't
Soovitatav on seada podAntiAffinity, et takistada mitmete pod'ide paigutamist samasse sÔlme. See suurendab kÀttesaadavust juhul, kui sÔlm muutub kÀttesaamatuks.YAML lÀbib kubeval'i kontrolle, samas kui kube-score osutab jÀrgmistele puudustele:
- Tervisekontrollid ei ole seadistatud.
- CPU ja mÀlu jaoks puuduvad request'id ja limit'id.
- Pod disruption budgets ei ole mÀÀratud.
- Puuduvad eraldi eksistentsi reeglid (anti-affinity) maksimaalse kÀttesaadavuse saavutamiseks.
- Konteiner töötab root-kasutajana.
KÔik need on asjakohased mÀrkused puuduste kohta, mida tuleb kÔrvaldada, et Deployment muutuks tÔhusamaks ja usaldusvÀÀrsemaks.
Meeskond kube-score esitab teavet loetavas vormingus, sealhulgas kĂ”iki rikkumisi tĂŒĂŒbi HOIATUS ja KRITILINE, mis on arendamise ajal vĂ€ga abiks.
Soovijad kasutada seda tööriista CI-pipeline'is saavad lubada kompaktsemat vÀljundit, kasutades lippu --output-format ci (sel juhul kuvatakse ka testid tulemusega 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 piiri ei ole seatud
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) MĂ€lupiiri ei ole seatud
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU nÔuet ei ole seatud
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) MÀlenuhte nÔuet ei ole seatud
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Pilti ei ole seadistatud viimase mÀrgisega
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: Podil ei ole vastavat vÔrgupoliitikat
[CRITICAL] http-echo apps/v1/Deployment: Konteineril puudub readinessProbe
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Konteineril ei ole seadistatud turvakonteksti
[CRITICAL] http-echo apps/v1/Deployment: Ei leitud vastavat PodDisruptionBudget'i
[WARNING] http-echo apps/v1/Deployment: Deployment'il ei ole seadistatud host-podAntiAffinity't
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/ServiceSarnaselt kubeval'iga tagastab kube-score mitte-null vÀljumiskoodi, kui mÔni test lÔppeb veaga. KRITILINESarnast töötlemist saab lubada ka HOIATUS.
Lisaks on olemas vÔimalus kontrollida ressursse erinevate API versioonide vastavust (nagu ka kubeval puhul). Siiski, see teave on 'hardcode'itud ise kube-score'i: ei saa valida teist Kubernetes'i versiooni. Selline piirang vÔib olla suur probleem, kui kavatsete klastrit uuendada vÔi teil on mitu klastrit erinevate K8s versioonidega.
Pange tÀhele, et ettepanekuga selle vÔimaluse rakendamiseks.
Kube-score'ist saab rohkem teavet leida .
Kube-score testid on suurepÀrane tööriist parimate praktikate rakendamiseks, kuid mis siis, kui on vaja teha muudatusi testis vÔi lisada oma reeglid? Kahjuks ei ole see vÔimalik.
Kube-score ei ole laiendatav: poliitikaid ei saa lisada ega kohandada.
Kui on vaja kirjutada kohandatud teste poliitikate vastavuse kontrollimiseks, saab kasutada ĂŒhte 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 installimiseks saavad kasutada projekti veebilehelt.
Originaali kirjutamise hetkel on praegune versioon â 1.5.0.
Config-lint ei sisalda sisseehitatud teste Kubernetes'i manifestide kontrollimiseks.
Igaks testiks tuleb luua vastavad reeglid. Need salvestatakse YAML-failidesse, mida nimetatakse «reeglite komplektideks» (rulesets), ja neil on jÀrgmine struktuur:
version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
- "*.yaml"
rules:
# reeglite loend(rule.yaml)
Vaatame seda lÀhemalt:
- VĂ€li
typemÀÀra, millist tĂŒĂŒpi konfiguratsiooni config-lint kasutab. Kubernetes'i manifestide jaoks on see alatiKubernetes. - VĂ€ljal
filesnende failide kÔrval saab mÀÀrata ka kausta. - VÀli
ruleson mÔeldud kasutaja mÀÀratud testide mÀÀratlemiseks.
Oletame, et soovite veenduda, et pildid Deploymentâis laaditakse alati usaldusvÀÀrsest repositooriumist nagu my-company.com/myapp:1.0. Config-linti reegel sarnase kontrolli teostamiseks nĂ€eb vĂ€lja jĂ€rgmine:
- id: MY_DEPLOYMENT_IMAGE_TAG
severity: FAILURE
message: Deployment peab kasutama kehtivat pilditagumist
resource: Deployment
assertions:
- every:
key: spec.template.spec.containers
expressions:
- key: image
op: starts-with
value: "my-company.com/"(rule-trusted-repo.yaml)
Iga reegli puhul peavad olema mÀÀratud jÀrgmised atribuudid:
idâ unikaalne reegli identifikaator;severityâ vĂ”ib olla FAILURE, HOIATUS ja NON_COMPLIANT;messageâ reegli rikkumise korral kuvatakse selle rea sisu;resourceâ ressursitĂŒĂŒp, millele see reegel kehtib;assertionsâ loetelu tingimustest, mida hinnatakse antud ressursi suhtes.
Ălaltoodud reeglis assertion nimega kontrollib, et kĂ”ik konteinerid Deploymentâis (key: spec.templates.spec.containers) kasutaksid usaldusvÀÀrseid pilte (st need, mis algavad my-company.com/).
Kogu reeglite komplekt nÀeb vÀlja jÀrgmiselt:
version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
- "*.yaml"
rules:
- id: DEPLOYMENT_IMAGE_REPOSITORY # !!!
severity: FAILURE
message: Deployment peab kasutama kehtivat pildirepositooriumi
resource: Deployment
assertions:
- every:
key: spec.template.spec.containers
expressions:
- key: image
op: starts-with
value: "my-company.com/"(ruleset.yaml)
Selle testi katsetamiseks salvestame selle kui check_image_repo.yaml. KĂ€ivitame faili kontrollimiseks testimise base-valid.yaml:
$ config-lint -rules check_image_repo.yaml base-valid.yaml
[
{
"AssertionMessage": "Iga vÀljendus ebaÔnnestus: Ja vÀljendus ebaÔnnestus: pilt ei alga my-company.com/",
"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": "KĂ€ivitus peab kasutama kehtivat pildi tugiteenust",
"Status": "FAILURE"
}
]Kontroll lĂ”ppes ebaĂ”nnestumisega. NĂŒĂŒd vaatame jĂ€rgmist manifeste, kasutades Ă”iget pildi tugiteenust:
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 ĂŒlaltoodud manifeste kasutades. Probleeme ei leitud:
$ config-lint -rules check_image_repo.yaml image-valid-mycompany.yaml
[]Config-lint on perspektiivne raamistiku, mis vÔimaldab luua enda teste Kubernetes YAML-manifestide kontrollimiseks YAML DSL abil.
Aga mida teha, kui toimub keerulisem loogika ja testimised? Kas YAML vÔimalused ei ole selle jaoks liiga vÀikesed? Mida, kui saaks luua teste tÀisfunktsionaalses programmeerimiskeeles?
4. Copper
on raamistiku, mis valideerib manifeste kasutades kasutajate teste (nagu config-lint).
Erinevalt viimasest ei kasuta see teste kirjeldamisel YAML-i. Selle asemel saab teste luua JavaScriptis. Copper pakub raamatukogusid mitmete pÔhivahenditega, mis aitavad lugeda teavet Kubernetes objektide kohta ja aru anda vigadest.
Copperi installimise sammude jada leiab .
2.0.1 on see utiliidi kÔige uuem versioon originaalse artikli kirjutamise ajal.
Nagu config-lint, ei ole Copperil siserakendusi. Kirjutame ĂŒhe. Oletame, et see kontrollib, et kĂ€ivitused kasutavad konteineripilte ainult usaldusvÀÀrsetest tugiteenustest nagu my-company.com.
Looge fail check_image_repo.js jÀrjgnevate sisuga:
$$.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',"Pilt " + $.metadata.name + " ei ole my-company.com tugiteenusest", 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 lĂ€bi viia keerukamaid teste â nĂ€iteks kontrollida domeeninimesid Ingress'i manifesteerimisel vĂ”i tagasi lĂŒkata pod'e, mis töötavad privileege tasemel.
Copperis on erinevad teenusfunktsioonid:
DockerImageloeb mÀÀratud sisendfaili ja loob objekti jĂ€rgmiste atribuutidega:nimiâ pildi nimi,tagâ pildi silt,registryâ piltide register,registry_urlâ protokoll (https://) ja piltide register,fqinâ pildi tĂ€ielik asukoht.
- Funktsioon
findByNameaitab leida ressursi antud tĂŒĂŒbi (kind) ja nime (nimi) pĂ”hjal sisendfailist. - Funktsioon
findByLabelsaitab leida ressursi mÀÀratud tĂŒĂŒbi (kind) ja siltide (labels).
KÔigi kÀtte saadavate teenusfunktsioonidega saab tutvuda .
Seda laetakse vaikimisi kogu sisend-YAML-fail muutuja sisse $$ ja see on skriptidele kergesti kÀttesaadav (tuntud meetod neile, kes on töötanud jQuery'ga).
Copperi peamine eelis on ilmne: teil ei ole vaja omandada spetsialiseeritud keelt ja saate kasutada erinevaid JavaScripti vÔimalusi oma testide loomiseks, nagu stringide interpoleerimine, funktsioonid jne.
Oluline on mÀrkida, et Copperi praegune versioon töötab JavaScripti ES5 mootoriversiooniga, mitte ES6-ga.
Lisainfot leiate .
Kuid kui te ei armasta eriti JavaScripti ja eelistate keelt, mis on spetsiaalselt loodud pÀringute loomiseks ja poliitikate kirjeldamiseks, peaksite tÀhelepanu pöörama conftest'ile.
5. Conftest
Conftest on raamistik konfiguratsioonide kontrollimiseks. Sobib ka Kubernetes'i manifestide testimiseks/verifitseerimiseks. Testid on kirjeldatud spetsialiseeritud pÀringute keeles .
Conftest'i saab installida , mis on vÀlja toodud projekti lehel.
Kuna algse artikli kirjutamise ajal oli viimane kÀttesaadav versioon 0.18.2.
Sarnaselt config-lint'ile ja copper'ile, ei sisalda conftest mingeid sisseehitatud teste. Proovime seda ja kirjutame oma poliitika. Nagu eelmistel nÀidetel, kontrollime, kas konteinerite pildid pÀrinevad usaldusvÀÀrsest allikast.
Looge kataloog conftest-checks, ja sinna â fail nimega check_image_registry.rego jĂ€rjgnevate sisuga:
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 lĂ€bi 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 usaldamatust allikast.
Rego failis mÀÀratleme bloki deny. Selle tÔde loetakse rikkumiseks. Kui bloki deny on mitu, kontrollib conftest neid iseseisvalt ja mistahes bloki tÔde kÀsitletakse rikkumisena.
Lisaks vaikevĂ€ljundile toetab conftest JSON, TAP ja tabeliformaati â vĂ€ga kasulik omadus, kui soovite aruandeid integreerida olemasolevasse CI torustikku. Soovitud formaati saab mÀÀrata lipuga --output.
Poliitikate tĂ”rkeotsinguks on conftestis lipp --trace. See vĂ€ljastab jĂ€lgimise, kuidas conftest mÀÀratud poliitikafaile analĂŒĂŒsib.
Conftest poliitikaid saab avaldada ja jagada OCI-registreerimisĂŒksustes (Open Container Initiative) artefaktidena.
KÀsklused push ja pull lubavad artefakti avaldamist vÔi olemasoleva artefakti tÔmbamist kaugregistrist. Proovime avaldada loodud poliitika meie kohalikku Docker registreerimisse conftest push.
KĂ€ivitage kohalik Docker register:
$ docker run -it --rm -p 5000:5000 registryTeises terminalis liikuge varasema loomise kausta conftest-checks ja kÀivitage 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 teateid:
2020/06/10 14:25:43 pushed bundle with digest: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609cNĂŒĂŒd looge ajutine kaust ja kĂ€ivitage seal kĂ€sk conftest pull. See taandab selles loodud paketi:
$ cd $(mktemp -d)
$ conftest pull 127.0.0.1:5000/amitsaha/opa-bundle-example:latestAjutises kaustas ilmub alamkaust policy, mis sisaldab meie poliitikafaili:
$ tree
.
âââ policy
âââ check_image_registry.regoTestimiseks saab otse hoidlast:
$ 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 failureKahjuks ei toetata praegu DockerHub'i. Niisiis, looge endale Ônne, kui kasutate (ACR) vÔi oma kohalikke registerit.
Artefaktide formaat on sama mis (OPA), mis vÔimaldab conftesti kasutada testide kÀivitamiseks olemasolevatest OPA pakettidest.
Rohkem conftesti poliitikate jagamise ja teiste omaduste kohta leiate .
6. Polaris
Viimane tööriist, millest selles artiklis juttu tuleb, on . (Eelmise aasta teadaanne me â mĂ€rkus tĂ”lke kohta.)
Polarist saab paigaldada klastrisse vĂ”i kasutada kĂ€sureĆŸiimis. Nagu te juba arvasite, vĂ”imaldab see Kubernetes'i manifestide staatilist analĂŒĂŒsi.
KĂ€sureĆŸiimis on saadaval sisseehitatud testid, mis katab selliseid valdkondi nagu turvalisus ja parimad praktikad (sarnaselt kube-score'iga). Samuti saab luua oma teste (nagu config-lint, copper ja conftest).
TeisisĂ”nu, Polaris ĂŒhendab endas mĂ”lema kategooria tööriistade eelised: nii sisseehitatud kui ka kasutaja loodud testid.
Polari kĂ€sureĆŸiimis installimiseks jĂ€rgige .
OriginÄli artikli kirjutamise hetkel on saadaval versioon 1.0.3.
PĂ€rast installimise lĂ”petamist saab polarisâe manifesti kĂ€ivitada base-valid.yaml jĂ€rgmise kĂ€suga:
$ polaris audit --audit-path base-valid.yamlSee vĂ€ljastab JSON-formaadis rea, kus on ĂŒksikasjalik ĂŒlevaade tehtud testidest ja nende tulemustest. 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 nimekiri */
]
}TÀielik vÀljund on saadaval .
Nagu kube-score, tuvastab Polaris probleemid nendes valdkondades, kus manifest ei vasta parimatele praktikatele:
- Pod'i tervisekontrollid puuduvad.
- Konteineripiltide jaoks mÀrke ei ole mÀÀratud.
- Konteiner töötab root-kasutajana.
- MÀlu ja CPU jaoks ei ole mÀÀratud request'e ja limit'e.
Iga testile mÀÀratakse vastavalt sellele, millised on nende tulemused, kriitilisuse tase: warning vÔi danger. Lisateabe saamiseks olemasolevate sisseehitatud testide kohta pöörduge .
Kui detailid pole vajalikud, saate mÀÀrata lipu --format score. Sel juhul vĂ€ljendab Polaris numbrit vahemikus 1 kuni 100 â hinnang (st skoor):
$ polaris audit --audit-path test-data/base-valid.yaml --format score
68Mida lÀhemal hinnang 100-le, seda suurem on vastavusaste. Kui kontrollite kÀsu polaris audit, leiate, et see on 0.
Sundida polaris audit lÔpetama mittesnullkoodiga saab kahe lipu abil:
- Lipp
--set-exit-code-below-scorevĂ”tab argumentidena lĂ€vevÀÀrtuse vahemikus 1â100. Sel juhul lĂ”peb kĂ€sk vĂ€ljaandmise koodiga 4, kui hind jÀÀb allapoole lĂ€vevÀÀrtust. See on vĂ€ga kasulik, kui teil on mĂ”ni lĂ€vevÀÀrtus (ĂŒtleme 75) ja soovite saada hoiatust, kui hind langeb madalamale. - Lipp
--set-exit-code-on-dangertoob kaasa selle, et kĂ€sk lĂ”peb koodiga 3, kui ĂŒkski ohtlike testide seast ebaĂ”nnestub.
NĂŒĂŒd proovime luua kohandatud testi, mis kontrollib, kas pilt on saadud usaldusvÀÀrsest registrist. Kohandatud testid mÀÀratletakse YAML formaadis ja test ise kirjeldatakse JSON skeemi abil.
JĂ€rgmine YAML-koodi fragment kirjeldab uut testi, mida nimetatakse checkImageRepo:
checkImageRepo:
successMessage: Pildiregister on kehtiv
failureMessage: Pildiregister 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 lĂ”peb edukalt;failureMessageâ see sĂ”num kuvatakse, kui test ebaĂ”nnestub;categoryâ nĂ€itab ĂŒhte kategooriat:Pildid,Tervise Kontrollerid,Turve,VĂ”rgundusjaRessursid;targetâ mÀÀratleb, millisele objekti tĂŒĂŒbile (spec) test rakendub. VĂ”imalikud vÀÀrtused:Konteiner,PodvĂ”iKontroller;- Test ise mÀÀratakse objektis
schemakasutades JSON skeemi. KÀesolevas testis kasutatakse mÀrksÔnapatternpildi allika vÔrreldamiseks nÔutud vÀÀrtusega.
Eelneva testi kÀivitamiseks on vajalik jÀrgmise Polaris konfiguratsiooni loomine:
checks:
checkImageRepo: danger
customChecks:
checkImageRepo:
successMessage: Pildiregister on kehtiv
failureMessage: Pildiregister 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)
Vaatame faili:
- VĂ€ljal
checksmÀÀratlevad testid ja nende tÔsiduse taseme. Kuna on soovitav saada hoiatust, kui pilt saadakse usaldusvÀÀrsest allikast, mÀÀrame siia tasemedanger. - Test
checkImageRepomÀÀratakse seejÀrel objektiscustomChecks.
Salvesta fail nimega custom_check.yaml. NĂŒĂŒd saab kĂ€ivitada polaris audit YAML-maniifistiga, mis vajab kontrollimist.
Testime meie maniifisti base-valid.yaml:
$ polaris audit --config custom_check.yaml --audit-path base-valid.yamlMeeskond polaris audit kÀivitas ainult eespool mÀÀratud kohandatud testi ja see ebaÔnnestus.
Kui parandada pilti my-company.com/http-echo:1.0, Polaris lÔpetab edukalt. Muudetud maniifist on juba olemas , nii et saate kontrollida eelmist kÀsku manifestis image-valid-mycompany.yaml.
NĂŒĂŒd tekib kĂŒsimus: kuidas kĂ€ivitada sisseehitatud teste koos kasutaja loodud testidega? Kergesti! Lihtsalt lisage sisseehitatud testide ID-d konfiguratsioonifaili. SeetĂ”ttu nĂ€eb see vĂ€lja jĂ€rgmiselt:
checks:
cpuRequestsMissing: warning
cpuLimitsMissing: warning
# Teised sisseehitatud kontrollid..
# ..
# kasutaja loodud kontrollid
checkImageRepo: danger # !!!
customChecks:
checkImageRepo: # !!!
successMessage: Pildi register on kehtiv
failureMessage: Pildi register ei ole kehtiv
category: Pildid
target: Container
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Àidis on saadaval .
Kontrollige manifesti base-valid.yaml, kasutades sisseehitatud ja kasutaja loodud teste, saab kÀsklusega:
$ polaris audit --config config_with_custom_check.yaml --audit-path base-valid.yamlPolaris tÀiendab sisseehitatud teste kasutaja loodud testidega, kombineerides kahte maailma parimat.
Teisest kĂŒljest vĂ”ib arenenumate testide loomise takistuseks olla vĂ”imetus kasutada vĂ”imsamaid keeli nagu Rego vĂ”i JavaScript.
Lisainfot Polari kohta on saadaval .
Elulookirjeldus
Kuigi on mitmeid tööriistu Kubernetes YAML-failide kontrollimiseks ja hindamiseks, on oluline omada selget arusaama, kuidas teste projekteerida ja lÀbi viia.
NÀiteks, kui vÔtta Kubernetes'e manifeedid, mis lÀbivad torustiku, vÔiks kubeval olla esimene samm selles torustikus.See jÀlgiks, kas objektide mÀÀratlused vastavad Kubernetes'e API skeemile.
PÀrast sellist kontrollimist oleks vÔimalik liikuda keerukamate testide juurde, mis vastavad parimatele praktikatele ja konkreetsetele poliitikatele. Ja siin tuleksid appi kube-score ja Polaris.
Neile, kellel on keerukad nĂ”uded ja vajadus teste ĂŒksikasjalikult kohandada, sobivad copper, config-lint ja conftest..
Conftest ja config-lint kasutavad kasutaja loodud testide mÀÀramiseks YAML-i, samas kui copper pakub juurdepÀÀsu tĂ€isfunktsionaalsele programmeerimiskeelele, mis muudab selle ĂŒsna atraktiivseks valikuks.
Kuid kĂŒsimus on, kas kasutada mĂ”nda neist tööriistadest ja seega luua kĂ”ik testid kĂ€sitsi, vĂ”i eelistada Polaris't ning kirjutada sinna vaid vajalikud osad? Sellele kĂŒsimusele ei ole ĂŒheselt mĂ”istetavat vastust..
Allpool tabel sisaldab iga tööriista lĂŒhikirjeldust:
Tööriist
EesmÀrk
Puudused
Kasutajatestid
Kubeval'i paigaldusjuhised on saadaval projekti veebilehel.
Kontrollib YAML-manifeste vastavust kindla API skeemi versioonile
Ei oska töötada CRD-dega
Ei
kube-score
AnalĂŒĂŒsib YAML-manifeste vastavust parimatele praktikatele
Ei saa valida oma Kubernetes API versiooni ressursside kontrollimiseks
Ei
copper
Ăksnes raamistik oma JavaScript-testide loomiseks YAML-manifeste jaoks
Pole sisseehitatud teste. Piiratud dokumentatsioon
Jah
config-lint
Ăksnes raamistik testide loomiseks objekti-orienteeritud keeles, mis on sisseehitatud YAML-i. Toetab erinevaid konfiguratsiooniformaate (nt Terraform)
Pole valmis teste. Sisseehitatud vÀiteid ja funktsioone vÔib olla liiga vÀhe
Jah
conftest
Raamistik oma testide loomiseks Rego-s (spetsialiseeritud pÀringute keel). Lubab jagada poliitikaid OCI paketina
Pole sisseehitatud teste. Tuleb Ôppida Rego. Docker Hub ei toeta poliitikate avaldamist
Jah
Polaris
AnalĂŒĂŒsib YAML-manifeste vastavust standardsetele parimatele praktikatele. Lubab luua oma teste JSON Schema abil
JSON Schema pÔhiseid teste vÔib jÀÀda puudu
Jah
Kuna need tööriistad ei sÔltu juurdepÀÀsust Kubernetes klastrile, on nende paigaldamine lihtne. Need vÔimaldavad allikafailide filtreerimist ja annavad kiire tagasiside pull requestide autoritele projektides.
P.S. tÔlkijalt
Lugege ka meie blogist:
- «»;
- «»;
- «».
Allikas: habr.com
