Apstipriniet Kubernetes YAML paraugpraksi un politiku
PiezÄ«me. tulk.: pieaugot K8s vidÄm paredzÄto YAML konfigurÄciju skaitam, nepiecieÅ”amÄ«ba pÄc to automÄtiskÄs verifikÄcijas kļūst arvien aktuÄlÄka. Å Ä« pÄrskata autors ne tikai atlasÄ«ja Å”im uzdevumam esoÅ”us risinÄjumus, bet arÄ« izmantoja izvietoÅ”anu kÄ piemÄru, lai redzÄtu, kÄ tie darbojas. Tas izrÄdÄ«jÄs ļoti informatÄ«vs tiem, kurus interesÄ Å”Ä« tÄma.
TL; DR: Å ajÄ rakstÄ ir salÄ«dzinÄti seÅ”i statiskie rÄ«ki, lai pÄrbaudÄ«tu un novÄrtÄtu Kubernetes YAML failus, Åemot vÄrÄ labÄko praksi un prasÄ«bas.
Kubernetes darba slodzes parasti tiek noteiktas YAML dokumentu veidÄ. Viena no YAML problÄmÄm ir grÅ«tÄ«bas norÄdÄ«t ierobežojumus vai attiecÄ«bas starp manifesta failiem.
Ko darÄ«t, ja mums ir jÄpÄrliecinÄs, ka visi klasterÄ« izvietotie attÄli nÄk no uzticama reÄ£istra?
KÄ es varu novÄrst to izvietojumu, kuriem nav PodDisruptionBudgets, nosÅ«tÄ«Å”anu uz kopu?
StatiskÄs testÄÅ”anas integrÄcija ļauj identificÄt kļūdas un politikas pÄrkÄpumus izstrÄdes stadijÄ. Tas palielina garantiju, ka resursu definÄ«cijas ir pareizas un droÅ”as, un palielina iespÄju, ka ražoÅ”anas darba slodzes tiks ievÄrotas paraugprakses veidÄ.
Kubernetes statisko YAML failu pÄrbaudes ekosistÄmu var iedalÄ«t Å”ÄdÄs kategorijÄs:
API pÄrbaudÄ«tÄji. Å Ä«s kategorijas rÄ«ki pÄrbauda YAML manifesta atbilstÄ«bu Kubernetes API servera prasÄ«bÄm.
Gatavi testÄtÄji. Å Ä«s kategorijas rÄ«kiem ir gatavi droŔības, atbilstÄ«bas paraugprakses testi utt.
PielÄgoti pÄrbaudÄ«tÄji. Å Ä«s kategorijas pÄrstÄvji ļauj izveidot pielÄgotus testus dažÄdÄs valodÄs, piemÄram, Rego un Javascript.
Å ajÄ rakstÄ mÄs aprakstÄ«sim un salÄ«dzinÄsim seÅ”us dažÄdus rÄ«kus:
kubeval;
kube-score;
config-lint;
vara;
konkurss;
polaris.
Nu ko, sÄksim!
Izvietojumu pÄrbaude
Pirms sÄkam salÄ«dzinÄt rÄ«kus, izveidosim pamatinformÄciju, lai tos pÄrbaudÄ«tu.
TÄlÄk esoÅ”ajÄ manifestÄ ir vairÄkas kļūdas un neatbilstÄ«ba paraugpraksei: cik no tÄm varat atrast?
MÄs izmantosim Å”o YAML, lai salÄ«dzinÄtu dažÄdus rÄ«kus.
IepriekÅ” minÄtais manifests base-valid.yaml un citus manifestus no Ŕī raksta var atrast Git krÄtuves.
ManifestÄ ir aprakstÄ«ta tÄ«mekļa lietojumprogramma, kuras galvenais uzdevums ir atbildÄt ar ziÅojumu āHello Worldā uz portu 5678. To var izvietot ar Å”Ädu komandu:
kubectl apply -f hello-world.yaml
Un tÄ - pÄrbaudiet darbu:
kubectl port-forward svc/http-echo 8080:5678
Tagad ejiet uz http://localhost:8080 un apstipriniet, ka lietojumprogramma darbojas. Bet vai tas atbilst paraugpraksei? PÄrbaudÄ«sim.
1. Kubeval
Pie sirds kubeval Ideja ir tÄda, ka jebkura mijiedarbÄ«ba ar Kubernetes notiek, izmantojot tÄ REST API. Citiem vÄrdiem sakot, varat izmantot API shÄmu, lai pÄrbaudÄ«tu, vai dotÄ YAML tai atbilst. ApskatÄ«sim piemÄru.
$ 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
Resurss netiek pÄrbaudÄ«ts.
Izvietojumi, izmantojot API versiju apps/v1, ir jÄiekļauj atlasÄ«tÄjs, kas atbilst aplikuma apzÄ«mÄjumam. IepriekÅ” minÄtajÄ manifestÄ nav iekļauts atlasÄ«tÄjs, tÄpÄc kubeval ziÅoja par kļūdu un izgÄja ar kodu, kas nav nulle.
Interesanti, kas notiks, ja es to darīŔu kubectl apply -f ar Ŕo manifestu?
Nu, mÄÄ£inÄsim:
$ 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
TieÅ”i par Å”o kļūdu brÄ«dinÄja Kubeval. Varat to labot, pievienojot atlasÄ«tÄju:
TÄdu rÄ«ku kÄ kubeval priekÅ”rocÄ«ba ir tÄda, ka Å”Ädas kļūdas var konstatÄt jau izvietoÅ”anas cikla sÄkumÄ.
TurklÄt Ŕīm pÄrbaudÄm nav nepiecieÅ”ama piekļuve klasterim; tÄs var veikt bezsaistÄ.
PÄc noklusÄjuma kubeval pÄrbauda resursus saskaÅÄ ar jaunÄko Kubernetes API shÄmu. TomÄr vairumÄ gadÄ«jumu jums var bÅ«t nepiecieÅ”ams pÄrbaudÄ«t, vai tas atbilst konkrÄtam Kubernetes laidienam. To var izdarÄ«t, izmantojot karogu --kubernetes-version:
LÅ«dzu, Åemiet vÄrÄ, ka versija ir jÄnorÄda formÄtÄ Major.Minor.Patch.
To versiju sarakstu, kurÄm tiek atbalstÄ«ta verifikÄcija, lÅ«dzu, skatiet JSON shÄma vietnÄ GitHub, ko kubeval izmanto apstiprinÄÅ”anai. Ja jums ir nepiecieÅ”ams palaist kubeval bezsaistÄ, lejupielÄdÄjiet shÄmas un norÄdiet to vietÄjo atraÅ”anÄs vietu, izmantojot karogu --schema-location.
Papildus atseviŔķiem YAML failiem kubeval var strÄdÄt arÄ« ar direktorijiem un stdin.
TurklÄt Kubeval viegli integrÄjas CI cauruļvadÄ. Tie, kas vÄlas veikt testus pirms manifestu nosÅ«tÄ«Å”anas klasterim, bÅ«s priecÄ«gi uzzinÄt, ka kubeval atbalsta trÄ«s izvades formÄtus:
VienkÄrÅ”s teksts;
JSON;
Test Anything Protocol (TAP).
Un jebkuru no formÄtiem var izmantot turpmÄkai izvades parsÄÅ”anai, lai izveidotu vajadzÄ«gÄ veida rezultÄtu kopsavilkumu.
Viens no kubeval trÅ«kumiem ir tas, ka tas paÅ”laik nevar pÄrbaudÄ«t atbilstÄ«bu pielÄgotajÄm resursu definÄ«cijÄm (CRD). TomÄr ir iespÄjams konfigurÄt kubeval ignorÄt tos.
Kubeval ir lielisks lÄ«dzeklis resursu pÄrbaudei un novÄrtÄÅ”anai; TomÄr jÄuzsver, ka testa nokÄrtoÅ”ana negarantÄ, ka resurss atbilst labÄkajai praksei.
PiemÄram, izmantojot tagu latest konteinerÄ neievÄro labÄko praksi. TomÄr kubeval neuzskata to par kļūdu un neziÅo par to. Tas nozÄ«mÄ, ka Å”Äda YAML pÄrbaude tiks pabeigta bez brÄ«dinÄjumiem.
Bet ko darÄ«t, ja vÄlaties novÄrtÄt YAML un noteikt pÄrkÄpumus, piemÄram, tagu latest? KÄ pÄrbaudÄ«t, vai YAML fails atbilst paraugpraksei?
2. Kube-rezultÄts
Kube-rezultÄts parsÄ YAML manifestus un novÄrtÄ tos, salÄ«dzinot ar iebÅ«vÄtajiem testiem. Å ie testi ir atlasÄ«ti, pamatojoties uz droŔības vadlÄ«nijÄm un labÄko praksi, piemÄram:
Palaižot konteineru nevis kÄ root.
PÄksts veselÄ«bas pÄrbaužu pieejamÄ«ba.
Resursu pieprasījumu un ierobežojumu iestatīŔana.
Pamatojoties uz testa rezultÄtiem, tiek doti trÄ«s rezultÄti: OK, BRÄŖDINÄJUMS Šø KRITISKS.
Varat izmÄÄ£inÄt Kube-score tieÅ”saistÄ vai instalÄt to lokÄli.
SÄkotnÄjÄ raksta rakstÄ«Å”anas laikÄ jaunÄkÄ kube-score versija bija 1.7.0.
IzmÄÄ£inÄsim to mÅ«su manifestÄ 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 iztur kubeval testus, savukÄrt kube-score norÄda uz Å”Ädiem trÅ«kumiem:
GatavÄ«bas pÄrbaudes nav konfigurÄtas.
CPU resursiem un atmiÅai nav pieprasÄ«jumu vai ierobežojumu.
Pod traucÄjumu budžeti nav norÄdÄ«ti.
AtdalÄ«Å”anas noteikumu nav (pretafinitÄte) lai maksimÄli palielinÄtu pieejamÄ«bu.
Konteiners darbojas kÄ root.
Tie visi ir derÄ«gi punkti par trÅ«kumiem, kas jÄnovÄrÅ”, lai padarÄ«tu izvietoÅ”anu efektÄ«vÄku un uzticamÄku.
Komanda kube-score parÄda informÄciju cilvÄkiem salasÄmÄ formÄ, tostarp visus veidu pÄrkÄpumus BRÄŖDINÄJUMS Šø KRITISKS, kas ļoti palÄ«dz attÄ«stÄ«bas gaitÄ.
Tie, kas vÄlas izmantot Å”o rÄ«ku CI konveijerÄ, var iespÄjot vairÄk saspiestu izvadi, izmantojot karogu --output-format ci (Å”ajÄ gadÄ«jumÄ tiek parÄdÄ«ti arÄ« testi ar rezultÄtu 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
LÄ«dzÄ«gi kÄ kubeval, kube-score atgriež izejas kodu, kas nav nulle, ja ir tests, kas neizdodas KRITISKS. Varat arÄ« iespÄjot lÄ«dzÄ«gu apstrÄdi BRÄŖDINÄJUMS.
TurklÄt ir iespÄjams pÄrbaudÄ«t resursu atbilstÄ«bu dažÄdÄm API versijÄm (kÄ kubeval). TomÄr Ŕī informÄcija ir iekodÄta paÅ”Ä kube-score: jÅ«s nevarat atlasÄ«t citu Kubernetes versiju. Å is ierobežojums var bÅ«t liela problÄma, ja plÄnojat jauninÄt savu kopu vai ja jums ir vairÄki klasteri ar dažÄdÄm K8 versijÄm.
LÅ«dzu, Åemiet vÄrÄ, ka jau ir problÄma ar priekÅ”likumu Å”o iespÄju realizÄt.
PlaÅ”Äku informÄciju par kube-score var atrast vietnÄ oficiÄlÄ vietne.
Kube-score testi ir lielisks rÄ«ks paraugprakses ievieÅ”anai, bet ko darÄ«t, ja jums ir jÄveic izmaiÅas testÄ vai jÄpievieno savi noteikumi? DiemžÄl to nevar izdarÄ«t.
Kube-score nav paplaÅ”inÄms: jÅ«s nevarat tam pievienot politikas vai pielÄgot tÄs.
Ja jums ir jÄraksta pielÄgoti testi, lai pÄrbaudÄ«tu atbilstÄ«bu uzÅÄmuma politikÄm, varat izmantot vienu no Å”iem Äetriem rÄ«kiem: config-lint, copper, conftest vai polaris.
3. Config-lint
Config-lint ir rÄ«ks YAML, JSON, Terraform, CSV konfigurÄcijas failu un Kubernetes manifestu apstiprinÄÅ”anai.
JÅ«s varat to instalÄt, izmantojot instrukcijas projekta mÄjaslapÄ.
PaÅ”reizÄjais laidiens uz oriÄ£inÄlÄ raksta rakstÄ«Å”anas brÄ«di ir 1.5.0.
ProgrammÄ Config-lint nav iebÅ«vÄtu testu Kubernetes manifestu apstiprinÄÅ”anai.
Lai veiktu jebkÄdus testus, jums ir jÄizveido atbilstoÅ”i noteikumi. Tie ir rakstÄ«ti YAML failos, ko sauc par "rulesets" (noteikumu kopas), un tiem ir Å”Äda struktÅ«ra:
Lauks type norÄda, kÄda veida konfigurÄcija tiks izmantota config-lint. AttiecÄ«bÄ uz K8s tas izpaužas vienmÄrKubernetes.
Å ajÄ jomÄ files Papildus paÅ”iem failiem varat norÄdÄ«t direktoriju.
Lauks rules paredzÄts lietotÄju testu iestatÄ«Å”anai.
PieÅemsim, ka vÄlaties pÄrliecinÄties, ka izvietoÅ”anas attÄli vienmÄr tiek lejupielÄdÄti no uzticamas krÄtuves, piemÄram, my-company.com/myapp:1.0. KonfigurÄcijas lÄ«nijas kÄrtula, kas veic Å”Ädu pÄrbaudi, izskatÄ«tos Å”Ädi:
- 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)
Katram noteikumam ir jÄbÅ«t Å”Ädiem atribÅ«tiem:
id ā noteikuma unikÄlais identifikators;
severity - Var bÅ«t Neveiksmes, BRÄŖDINÄJUMS Šø NEATTIECAS;
message ā ja tiek pÄrkÄpts noteikums, tiek parÄdÄ«ts Ŕīs rindas saturs;
resource ā resursa veids, uz kuru attiecas Å”is noteikums;
assertions ā nosacÄ«jumu saraksts, kas tiks izvÄrtÄti saistÄ«bÄ ar Å”o resursu.
IepriekÅ” minÄtajÄ noteikumÄ assertion aicinÄja every pÄrbauda, āāvai visi konteineri ir izvietoÅ”anÄ (key: spec.templates.spec.containers) izmantojiet uzticamus attÄlus (t.i., sÄkot ar my-company.com/).
Config-lint ir daudzsoloÅ”s ietvars, kas ļauj jums izveidot savus testus, lai apstiprinÄtu Kubernetes YAML manifestus, izmantojot YAML DSL.
Bet ko darÄ«t, ja jums ir nepiecieÅ”ama sarežģītÄka loÄ£ika un testi? Vai YAML nav pÄrÄk ierobežots Å”im nolÅ«kam? Ko darÄ«t, ja jÅ«s varÄtu izveidot testus pilnÄ programmÄÅ”anas valodÄ?
4. Vara
Vara V2 ir ietvars manifestu apstiprinÄÅ”anai, izmantojot pielÄgotus testus (lÄ«dzÄ«gi kÄ config-lint).
TomÄr tas atŔķiras no pÄdÄjÄ ar to, ka testu aprakstÄ«Å”anai neizmanto YAML. TÄ vietÄ testus var rakstÄ«t JavaScript. Copper nodroÅ”ina bibliotÄku ar vairÄkiem pamata rÄ«kiem, kas palÄ«dz lasÄ«t informÄciju par Kubernetes objektiem un ziÅot par kļūdÄm.
2.0.1 ir Ŕīs utilÄ«tas jaunÄkÄ versija sÄkotnÄjÄ raksta rakstÄ«Å”anas laikÄ.
TÄpat kÄ config-lint, arÄ« Copper nav iebÅ«vÄtu testu. UzrakstÄ«sim vienu. Ä»aujiet tai pÄrbaudÄ«t, vai izvietoÅ”anÄ tiek izmantoti konteinera attÄli tikai no uzticamiem repozitorijiem, piemÄram my-company.com.
Izveidojiet failu check_image_repo.js ar Å”Ädu saturu:
$$.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)
}
});
}
});
Tagad, lai pÄrbaudÄ«tu mÅ«su manifestu base-valid.yaml, izmantojiet komandu 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
Skaidrs, ka ar vara palÄ«dzÄ«bu var veikt sarežģītÄkus testus ā piemÄram, pÄrbaudÄ«t domÄna vÄrdus Ingress manifestos vai noraidÄ«t priviliÄ£ÄtajÄ režīmÄ strÄdÄjoÅ”us podiÅus.
Varam ir iebÅ«vÄtas dažÄdas lietderÄ«bas funkcijas:
DockerImage nolasa norÄdÄ«to ievades failu un izveido objektu ar Å”Ädiem atribÅ«tiem:
name - attÄla nosaukums,
tag - attÄla atzÄ«me,
registry - attÄlu reÄ£istrs,
registry_url - protokols (https://) un attÄlu reÄ£istrs,
fqin ā pilna attÄla atraÅ”anÄs vieta.
Funkcija findByName palÄ«dz atrast resursu pÄc noteikta veida (kind) un vÄrds (name) no ievades faila.
Funkcija findByLabels palÄ«dz atrast resursu pÄc noteikta veida (kind) un etiÄ·etes (labels).
Varat apskatÄ«t visas pieejamÄs pakalpojumu funkcijas Å”eit.
PÄc noklusÄjuma tas ielÄdÄ visu YAML ievades failu mainÄ«gajÄ $$ un padara to pieejamu skriptÄÅ”anai (pazÄ«stama tehnika tiem, kam ir jQuery pieredze).
GalvenÄ Copper priekÅ”rocÄ«ba ir acÄ«mredzama: jums nav jÄapgÅ«st specializÄta valoda, un jÅ«s varat izmantot dažÄdas JavaScript funkcijas, lai izveidotu savus testus, piemÄram, virkÅu interpolÄciju, funkcijas utt.
JÄpiebilst arÄ«, ka paÅ”reizÄjÄ Copper versija darbojas ar JavaScript dzinÄja ES5 versiju, nevis ES6.
TomÄr, ja jums nepatÄ«k JavaScript un dodat priekÅ”roku valodai, kas Ä«paÅ”i izstrÄdÄta vaicÄjumu izveidei un politiku aprakstÄ«Å”anai, jums vajadzÄtu pievÄrst uzmanÄ«bu conftest.
5.Konkurss
Conftest ir konfigurÄcijas datu testÄÅ”anas sistÄma. PiemÄrots arÄ« Kubernetes manifestu testÄÅ”anai/pÄrbaudÄ«Å”anai. PÄrbaudes tiek aprakstÄ«tas, izmantojot specializÄtu vaicÄjumu valodu Rego.
Conftest var instalÄt, izmantojot instrukcijasnorÄdÄ«ts projekta tÄ«mekļa vietnÄ.
SÄkotnÄjÄ raksta rakstÄ«Å”anas laikÄ jaunÄkÄ pieejamÄ versija bija 0.18.2.
LÄ«dzÄ«gi kÄ config-lint un copper, conftest tiek piedÄvÄts bez iebÅ«vÄtiem testiem. IzmÄÄ£inÄsim un izveidosim savu politiku. TÄpat kÄ iepriekÅ”Äjos piemÄros, mÄs pÄrbaudÄ«sim, vai konteinera attÄli ir Åemti no uzticama avota.
Izveidojiet direktoriju conftest-checks, un tajÄ ir fails ar nosaukumu check_image_registry.rego ar Å”Ädu saturu:
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])
}
Tagad pÄrbaudÄ«sim base-valid.yaml caur 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
Paredzams, ka pÄrbaude neizdevÄs, jo attÄli tika iegÅ«ti no neuzticama avota.
Rego failÄ mÄs definÄjam bloku deny. TÄs patiesÄ«ba tiek uzskatÄ«ta par pÄrkÄpumu. Ja bloÄ·Ä deny vairÄkus, conftest pÄrbauda tos neatkarÄ«gi vienu no otra, un jebkura bloka patiesums tiek uzskatÄ«ts par pÄrkÄpumu.
Papildus noklusÄjuma izvadei conftest atbalsta JSON, TAP un tabulas formÄtu ā ļoti noderÄ«ga funkcija, ja nepiecieÅ”ams iegult atskaites esoÅ”Ä CI konveijerÄ. Izmantojot karogu, varat iestatÄ«t vÄlamo formÄtu --output.
Lai atvieglotu politiku atkļūdoÅ”anu, conftest ir karodziÅÅ” --trace. Tas izvada izsekojumu tam, kÄ conftest parsÄ norÄdÄ«tos politikas failus.
Konkursa politikas var publicÄt un kopÄ«got OCI (Open Container Initiative) reÄ£istros kÄ artefaktus.
Komandas push Šø pull ļauj publicÄt artefaktu vai izgÅ«t esoÅ”u artefaktu no attÄlÄ reÄ£istra. MÄÄ£inÄsim publicÄt mÅ«su izveidoto politiku vietÄjÄ Docker reÄ£istrÄ, izmantojot conftest push.
SÄciet savu vietÄjo Docker reÄ£istru:
$ docker run -it --rm -p 5000:5000 registry
CitÄ terminÄlÄ« dodieties uz direktoriju, kuru izveidojÄt iepriekÅ” conftest-checks un palaidiet Å”Ädu komandu:
Ja komanda bija veiksmÄ«ga, jÅ«s redzÄsit Å”Ädu ziÅojumu:
2020/06/10 14:25:43 pushed bundle with digest: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609c
Tagad izveidojiet pagaidu direktoriju un palaidiet tajÄ esoÅ”o komandu conftest pull. Tas lejupielÄdÄs pakotni, kas izveidota ar iepriekÅ”Äjo komandu:
$ cd $(mktemp -d)
$ conftest pull 127.0.0.1:5000/amitsaha/opa-bundle-example:latest
Pagaidu direktorijÄ parÄdÄ«sies apakÅ”direktorijs policykurÄ ir mÅ«su politikas fails:
$ tree
.
āāā policy
āāā check_image_registry.rego
Testus var palaist tieŔi no repozitorija:
$ 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
DiemžÄl DockerHub vÄl netiek atbalstÄ«ts. TÄpÄc uzskatiet, ka esat laimÄ«gs, ja izmantojat Azure konteineru reÄ£istrs (ACR) vai savu reÄ£istru.
Artefakta formÄts ir tÄds pats kÄ Atveriet politikas aÄ£entu pakotnes (OPA), kas ļauj izmantot conftest, lai palaistu testus no esoÅ”ajÄm OPA pakotnÄm.
VairÄk par politikas kopÄ«goÅ”anu un citÄm conftest funkcijÄm varat uzzinÄt vietnÄ oficiÄlÄ projekta vietne.
6. Polaris
PÄdÄjais rÄ«ks, kas tiks apspriests Å”ajÄ rakstÄ, ir Polaris. (ViÅa pagÄjuÅ”Ä gada paziÅojums mÄs jau tulkots SÄkot no apm. tulkojums)
Polaris var instalÄt klasterÄ« vai izmantot komandrindas režīmÄ. KÄ jÅ«s, iespÄjams, uzminÄjÄt, tas ļauj statiski analizÄt Kubernetes manifestus.
Darbojoties komandrindas režīmÄ, ir pieejami iebÅ«vÄti testi, kas aptver tÄdas jomas kÄ droŔība un labÄkÄ prakse (lÄ«dzÄ«gi kÄ kube-score). TurklÄt jÅ«s varat izveidot savus testus (piemÄram, config-lint, copper un conftest).
Citiem vÄrdiem sakot, Polaris apvieno abu kategoriju rÄ«ku priekÅ”rocÄ«bas: ar iebÅ«vÄtiem un pielÄgotiem testiem.
AtmiÅas un CPU pieprasÄ«jumi un ierobežojumi nav norÄdÄ«ti.
Katram testam atkarÄ«bÄ no tÄ rezultÄtiem tiek pieŔķirta kritiskuma pakÄpe: brÄ«dinÄjums vai briesmas. Lai uzzinÄtu vairÄk par pieejamajiem iebÅ«vÄtajiem testiem, lÅ«dzu, skatiet dokumentÄcija.
Ja informÄcija nav nepiecieÅ”ama, varat norÄdÄ«t karogu --format score. Å ajÄ gadÄ«jumÄ Polaris izvadÄ«s skaitli no 1 lÄ«dz 100 ā punktu skaits (t.i., novÄrtÄjums):
Jo tuvÄk rezultÄts ir 100, jo augstÄka ir sakritÄ«bas pakÄpe. Ja pÄrbaudÄt komandas izejas kodu polaris audit, izrÄdÄs, ka tas ir vienÄds ar 0.
SpÄks polaris audit Varat pÄrtraukt darbu ar kodu, kas nav nulle, izmantojot divus karodziÅus:
AtzÄ«mÄt --set-exit-code-below-score kÄ argumentu izmanto sliekÅ”Åa vÄrtÄ«bu diapazonÄ no 1 lÄ«dz 100. Å ajÄ gadÄ«jumÄ komanda tiks aizvÄrta ar izejas kodu 4, ja rezultÄts ir zem sliekÅ”Åa. Tas ir ļoti noderÄ«gi, ja jums ir noteikta sliekÅ”Åa vÄrtÄ«ba (piemÄram, 75) un jums ir jÄsaÅem brÄ«dinÄjums, ja rezultÄts ir zemÄks.
AtzÄ«mÄt --set-exit-code-on-danger izraisÄ«s komandas neveiksmi ar kodu 3, ja kÄds no bÄ«stamÄ«bas testiem neizdodas.
Tagad mÄÄ£inÄsim izveidot pielÄgotu testu, kas pÄrbauda, āāvai attÄls ir Åemts no uzticamas krÄtuves. PielÄgotie testi ir norÄdÄ«ti YAML formÄtÄ, un pats tests ir aprakstÄ«ts, izmantojot JSON shÄmu.
Å is YAML koda fragments apraksta jaunu testu ar nosaukumu 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/.+$
ApskatÄ«sim to tuvÄk:
successMessage ā Ŕī rindiÅa tiks izdrukÄta, ja tests bÅ«s sekmÄ«gi pabeigts;
failureMessage ā Å”is ziÅojums tiks parÄdÄ«ts kļūmes gadÄ«jumÄ;
category ā norÄda vienu no kategorijÄm: Images, Health Checks, Security, Networking Šø Resources;
target--- nosaka, kÄda veida objekts (spec) tiek piemÄrots tests. IespÄjamÄs vÄrtÄ«bas: Container, Pod vai Controller;
Pats tests ir norÄdÄ«ts objektÄ schema izmantojot JSON shÄmu. AtslÄgas vÄrds Å”ajÄ testÄ ir pattern izmanto, lai salÄ«dzinÄtu attÄla avotu ar nepiecieÅ”amo.
Lai palaistu iepriekÅ” minÄto testu, jums ir jÄizveido Å”Äda Polaris konfigurÄcija:
Å ajÄ jomÄ checks tiek noteikti testi un to kritiskuma lÄ«menis. TÄ kÄ ir vÄlams saÅemt brÄ«dinÄjumu, kad attÄls ir Åemts no neuzticama avota, mÄs iestatÄm lÄ«meni Å”eit danger.
Pats tests checkImageRepo pÄc tam reÄ£istrÄts objektÄ customChecks.
SaglabÄjiet failu kÄ custom_check.yaml. Tagad jÅ«s varat skriet polaris audit ar YAML manifestu, kam nepiecieÅ”ama pÄrbaude.
Komanda polaris audit veica tikai iepriekÅ” norÄdÄ«to lietotÄja testu, un tas neizdevÄs.
Ja labojat attÄlu, lai my-company.com/http-echo:1.0, Polaris veiksmÄ«gi pabeigs. Manifests ar izmaiÅÄm jau ir iekÅ”Ä krÄtuveslai jÅ«s varÄtu pÄrbaudÄ«t iepriekÅ”Äjo komandu manifestÄ image-valid-mycompany.yaml.
Tagad rodas jautÄjums: kÄ palaist iebÅ«vÄtos testus kopÄ ar pielÄgotajiem? Viegli! Jums vienkÄrÅ”i jÄpievieno iebÅ«vÄtie testa identifikatori konfigurÄcijas failam. RezultÄtÄ tam bÅ«s Å”Äda forma:
Polaris papildina iebÅ«vÄtos testus ar pielÄgotiem testiem, tÄdÄjÄdi apvienojot labÄko no abÄm pasaulÄm.
No otras puses, nespÄja izmantot jaudÄ«gÄkas valodas, piemÄram, Rego vai JavaScript, var bÅ«t ierobežojoÅ”s faktors, kas neļauj izveidot sarežģītÄkus testus.
PlaÅ”Äka informÄcija par Polaris ir pieejama vietnÄ projekta vietne.
Kopsavilkums
Lai gan ir pieejami daudzi rÄ«ki, lai pÄrbaudÄ«tu un novÄrtÄtu Kubernetes YAML failus, ir svarÄ«gi skaidri saprast, kÄ testi tiks izstrÄdÄti un izpildÄ«ti.
TÄ, piemÄram, ja lietojat Kubernetes manifestus, kas iet cauri cauruļvadam, kubeval varÄtu bÅ«t pirmais solis Å”ÄdÄ cauruļvadÄ. Tas pÄrraudzÄ«tu, vai objektu definÄ«cijas atbilst Kubernetes API shÄmai.
Kad Å”Äda pÄrskatÄ«Å”ana ir pabeigta, varÄtu pÄriet uz sarežģītÄkiem testiem, piemÄram, atbilstÄ«bu standarta paraugpraksei un Ä«paÅ”ai politikai. Å eit noderÄtu kube-score un Polaris.
Tiem, kam ir sarežģītas prasÄ«bas un kuriem nepiecieÅ”ams detalizÄti pielÄgot testus, bÅ«tu piemÄrots varÅ”, config-lint un conftest.
Conftest un config-lint izmanto YAML, lai definÄtu pielÄgotus testus, un vara nodroÅ”ina piekļuvi pilnai programmÄÅ”anas valodai, padarot to par diezgan pievilcÄ«gu izvÄli.
No otras puses, vai ir vÄrts izmantot kÄdu no Å”iem rÄ«kiem un lÄ«dz ar to visus testus izveidot manuÄli, vai dot priekÅ”roku Polaris un pievienot tam tikai nepiecieÅ”amo? Uz Å”o jautÄjumu nav skaidras atbildes.
TÄlÄk esoÅ”ajÄ tabulÄ ir sniegts Ä«ss katra rÄ«ka apraksts:
kubeval
PÄrbauda YAML manifestus attiecÄ«bÄ pret konkrÄtu API shÄmas versiju
Nevar strÄdÄt ar CRD
NÄ
kube-score
AnalizÄ YAML izpausmes pret labÄko praksi
Nevar atlasÄ«t savu Kubernetes API versiju, lai pÄrbaudÄ«tu resursus
NÄ
varÅ”
VispÄrÄjs ietvars pielÄgotu JavaScript testu izveidei YAML manifestiem
Nav iebÅ«vÄtu testu. Slikta dokumentÄcija
JÄ
config-lint
VispÄrÄ«ga sistÄma testu izveidei domÄnam specifiskÄ valodÄ, kas iegulta YAML. Atbalsta dažÄdus konfigurÄcijas formÄtus (piem., Terraform)
Nav gatavu testu. Ar iebÅ«vÄtiem apgalvojumiem un funkcijÄm var nepietikt
JÄ
konkurss
Ietvars savu testu izveidei, izmantojot Rego (specializÄtu vaicÄjumu valodu). Ä»auj koplietot politikas, izmantojot OCI komplektus
Nav iebÅ«vÄtu testu. Man jÄiemÄcÄs Rego. Docker Hub netiek atbalstÄ«ts, publicÄjot politikas
JÄ
Polaris
Atsauksmes par YAML izpausmÄm, salÄ«dzinot ar standarta labÄko praksi. Ä»auj izveidot savus testus, izmantojot JSON shÄmu
Var nepietikt ar testÄÅ”anas iespÄjÄm, kuru pamatÄ ir JSON shÄma
JÄ
TÄ kÄ Å”ie rÄ«ki nav atkarÄ«gi no piekļuves Kubernetes klasterim, tos ir viegli instalÄt. Tie ļauj filtrÄt avota failus un nodroÅ”inÄt Ätru atgriezenisko saiti projektu piesaistes pieprasÄ«jumu autoriem.