Kubernetes YAML-i valideerimine parimate praktikate ja poliitikate jÀrgimiseks

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.

Kubernetes YAML-i valideerimine parimate praktikate ja poliitikate jÀrgimiseks

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:

  1. kubeval;
  2. kube-score;
  3. config-lint;
  4. copper;
  5. conftest;
  6. 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.yaml ja muud selle artikli manifestid leiate Git-repositooriumist.

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

Ja nĂŒĂŒd — kontrollige tööd:

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

Mine nĂŒĂŒd aadressile http://localhost:8080 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. Kubeval'i paigaldusjuhised on saadaval projekti veebilehel. Originaali kirjutamise ajal oli saadaval versioon 0.15.0.

PĂ€rast paigaldamist laske sellel analĂŒĂŒsida ĂŒlaltoodud 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)

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

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

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

Pange tÀhele, et versioon tuleb esitada formaadis Major.Minor.Patch.

To View the list of versions that are supported for validation, see the JSON schema on GitHub, 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:

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

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

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

Sarnaselt 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 on juba olemas issue ettepanekuga selle vÔimaluse rakendamiseks.

Kube-score'ist saab rohkem teavet leida ametlikul kodulehe.

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 juhiseid 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 type mÀÀra, millist tĂŒĂŒpi konfiguratsiooni config-lint kasutab. Kubernetes'i manifestide jaoks on see alati Kubernetes.
  • VĂ€ljal files nende failide kĂ”rval saab mÀÀrata ka kausta.
  • VĂ€li rules on 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 every 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

Copper V2 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 ametlikust dokumentatsioonist.

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 failed

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

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

KÔigi kÀtte saadavate teenusfunktsioonidega saab tutvuda siin.

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 projekti ametlikult veebilehelt.

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

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

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

Teises 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:latest

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

2020/06/10 14:25:43 pushed bundle with digest: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609c

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

Ajutises kaustas ilmub alamkaust policy, mis sisaldab meie poliitikafaili:

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

Testimiseks 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 failure

Kahjuks ei toetata praegu DockerHub'i. Niisiis, looge endale Ônne, kui kasutate Azure Container Registry (ACR) vÔi oma kohalikke registerit.

Artefaktide formaat on sama mis Open Policy Agent paketidel. (OPA), mis vÔimaldab conftesti kasutada testide kÀivitamiseks olemasolevatest OPA pakettidest.

Rohkem conftesti poliitikate jagamise ja teiste omaduste kohta leiate projekti ametlikult veebilehelt.

6. Polaris

Viimane tööriist, millest selles artiklis juttu tuleb, on Polaris. (Eelmise aasta teadaanne me oleme juba tĂ”lkinud — 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 projekti veebisaidi juhiseid..

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

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

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

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
68

Mida 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-score vĂ”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-danger toob 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Ă”rgundus ja Ressursid;
  • target— mÀÀratleb, millisele objekti tĂŒĂŒbile (spec) test rakendub. VĂ”imalikud vÀÀrtused: Konteiner, Pod vĂ”i Kontroller;
  • Test ise mÀÀratakse objektis schema kasutades JSON skeemi. KĂ€esolevas testis kasutatakse mĂ€rksĂ”na pattern pildi 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 checks mÀÀratlevad testid ja nende tĂ”siduse taseme. Kuna on soovitav saada hoiatust, kui pilt saadakse usaldusvÀÀrsest allikast, mÀÀrame siia taseme danger.
  • Test checkImageRepo mÀÀratakse seejĂ€rel objektis customChecks.

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

Meeskond 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 hoidlad, 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 siin.

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

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

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

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster