Kubernetes YAML valideerimine parimate praktikate ja poliitikate suhtes

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.

Kubernetes YAML valideerimine parimate praktikate ja poliitikate suhtes

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:

  1. kubeval;
  2. kube-score;
  3. config-lint;
  4. copper;
  5. conftest;
  6. 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.yaml ja muud selles artiklis olevad manfestid on saadaval Git-repositooriumis.

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.yaml

Ja nii saab kontrollida selle toimimist:

kubectl port-forward svc/http-echo 8080:5678

NĂŒĂŒd minge aadressile http://localhost:8080 ja kinnitage, et rakendus töötab. Kuid kas see jĂ€rgib parimaid praktikaid? Kontrollime.

1. Kubeval

Kubevali aluseks kubeval 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.

Installatsiooni juhised 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 $?
0

Proovime 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 $?
1

Ressurss 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=false

Just 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.yaml

Pange tÀhele, et versioon peab olema esitatud vormingus Major.Minor.Patch.

Üksikasjaliku versioonide nimekirja, mille jaoks kontroll on saadaval, leiate GitHubist JSON skeemist, 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:

  1. Tavaline tekst;
  2. JSON;
  3. 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 neid ignoreerima..

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

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/Service

Nagu 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 on juba olemas issue ettevÔtte pakkumisega seda vÔimalust rakendada.

Lisainfo kube-score kohta leiate ametlikul kodulehel.

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 juhistega 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 type mĂ€rgib, millist konfiguratsioonitĂŒĂŒpi config-lint kasutada. K8si manifestide jaoks on see alati Kubernetes.
  • VĂ€ljal files nende failide kĂ”rval saab mÀÀrata ka kausta.
  • VĂ€li rules on 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 every 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

Copper V2 — 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 ametlikus dokumentatsioonis.

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 failed

On 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:

  • DockerImage loeb 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 findByName aitab leida ressursi mÀÀratud tĂŒĂŒbi (kind) ja nime (name) pĂ”hjal sisendfailist.
  • Function findByLabels aitab leida ressursi mÀÀratud tĂŒĂŒbi (kind) ja markerite (labels).

KÔikide saadavalolevate utiliitide kohta saate lugeda siit.

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 projekti ametlikul veebilehel.

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 Rego.

Conftest'i saab installida juhistega, 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 failure

Test 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 registry

Teises terminalis minge varem loodud katalooge conftest-checks ja tee jÀrgmine kÀsk:

$ conftest push 127.0.0.1:5000/amitsaha/opa-bundle-example:latest

Kui kĂ€sk Ă”nnestus, nĂ€ete jĂ€rgmise tĂŒĂŒpi sĂ”numit:

2020/06/10 14:25:43 pushitud pakett koos digestiga: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609c

NĂŒĂŒ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:latest

Ajutises kataloogis ilmub alamkataloog policy, sisaldades meie poliitikafaili:

$ tree
.
└── policy
  └── check_image_registry.rego

Teste 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Ônnestumine

Kahjuks ei toeta DockerHub praegu. Nii et vÔiks öelda, et olete Ônnelik, kui kasutate Azure Container Registry (ACR) vÔi oma registrit.

Artefakti formaat on sama mis Open Policy Agent (OPA) paketidel, mis vÔimaldab kasutada conftest'i olemasolevate OPA paketist testide kÀivitamiseks.

Rohkem poliitikate jagamisest ja conftest`i muudest omadustest saab lugeda projekti ametlikul veebilehel.

6. Polaris

Viimase tööriistana, millest juttu tuleb, on Polaris. (Me rÀÀkisime selle eelmise aasta esitlemisest juba tĂ”ime tĂ”lkes — 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 projekti veebisaidi juhiseid.

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.yaml

See 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 siit.

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 dokumentatsioonis.

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
68

Mida 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-score vĂ”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-danger tuleb 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Ă”rgustik ja Ressursid;
  • target— mÀÀrab tĂŒĂŒbi objekti (spec) millele test rakendub. VĂ”imalikud vÀÀrtused: Konteiner, Pod vĂ”i Kontroller;
  • Test ise mÀÀratakse objekti sees skeemaga JSON skeemi abil. Antud testis on vĂ”tmesĂ”na pattern kasutatakse 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 checks mÀÀritellÀÀn testit ja niiden kriittisyystaso. Koska on suositeltavaa saada varoitus, kun kuva otetaan epĂ€luotettavasta lĂ€hteestĂ€, asetamme tĂ€lle tason oht.
  • Test ise checkImageRepo sitten mÀÀritellÀÀn objektissa customChecks.

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.yaml

Meeskond 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 repositoriis, 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 siit.

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.yaml

Polaris 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 projekti veebilehel.

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

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster