Validasi Kubernetes YAML ngalawan prakték sareng kawijakan anu pangsaéna

Catetan. narjamahkeun.: Kalawan ngaronjatna jumlah konfigurasi YAML pikeun lingkungan K8s, kabutuhan pikeun verifikasi otomatis maranéhna jadi beuki urgent. Panulis ulasan ieu henteu ngan ukur milih solusi anu tos aya pikeun tugas ieu, tapi ogé dianggo Deployment salaku conto pikeun ningali kumaha jalanna. Tétéla pisan informatif pikeun jalma anu kabetot dina topik ieu.

Validasi Kubernetes YAML ngalawan prakték sareng kawijakan anu pangsaéna

TL; DR: Artikel ieu ngabandingkeun genep alat statik pikeun ngesahkeun sareng ngaevaluasi file YAML Kubernetes ngalawan prakték sareng sarat anu pangsaéna.

Beban kerja Kubernetes biasana didefinisikeun dina bentuk dokumén YAML. Salah sahiji masalah sareng YAML nyaéta kasusah nangtukeun konstrain atanapi hubungan antara file manifest.

Kumaha lamun urang kudu mastikeun yén sakabéh gambar deployed kana klaster asalna tina pendaptaran dipercaya?

Kumaha carana abdi tiasa nyegah Deployments nu teu boga PodDisruptionBudgets dikirim ka klaster?

Integrasi tés statik ngamungkinkeun anjeun pikeun ngaidentipikasi kasalahan sareng palanggaran kawijakan dina tahap pangwangunan. Ieu ningkatkeun jaminan yén definisi sumberdaya leres sareng aman, sareng ngajantenkeun beban kerja produksi bakal nuturkeun prakték pangsaéna.

Ékosistem pamariksaan file YAML statik Kubernetes tiasa dibagi kana kategori ieu:

  • validators API. Parabot dina kategori ieu pariksa manifes YAML ngalawan sarat pangladén API Kubernetes.
  • Testers siap. Alat tina kategori ieu hadir kalawan tés siap-dijieun pikeun kaamanan, patuh kana prakték pangalusna, jsb.
  • validators custom. Wawakil kategori ieu ngidinan Anjeun pikeun nyieun tés custom di sagala rupa basa, contona, Rego na Javascript.

Dina artikel ieu kami bakal ngajelaskeun tur ngabandingkeun genep parabot béda:

  1. kubeval;
  2. kube-skor;
  3. config-lint;
  4. tambaga;
  5. kontes;
  6. polaris.

Muhun, hayu urang ngamimitian!

Mariksa Deployments

Sateuacan urang ngawitan ngabandingkeun alat, hayu urang nyieun sababaraha latar pikeun nguji éta.

Manifesto di handap ngandung sababaraha kasalahan sareng henteu patuh kana prakték pangsaéna: sabaraha diantarana anjeun tiasa mendakan?

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)

Kami bakal ngagunakeun YAML ieu pikeun ngabandingkeun alat anu béda.

Manifesto di luhur base-valid.yaml jeung manifestos séjén tina artikel ieu bisa kapanggih dina Repositories Git.

Manifes ngajelaskeun aplikasi wéb anu tugas utami nyaéta ngabales pesen "Hello World" ka port 5678. Éta tiasa disebarkeun ku paréntah di handap ieu:

kubectl apply -f hello-world.yaml

Jeung saterusna - pariksa karya:

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

Ayeuna angkat ka http://localhost:8080 sareng pastikeun yén aplikasina berpungsi. Tapi naha éta nuturkeun prakték pangsaéna? Hayu urang pariksa.

1. Kubeval

Dina manah kubeval Idena nyaéta yén sagala interaksi sareng Kubernetes lumangsung ngaliwatan REST API na. Kalayan kecap sanésna, anjeun tiasa nganggo skéma API pikeun mariksa naha YAML anu dipasihkeun saluyu sareng éta. Hayu urang nempo hiji conto.

Parentah instalasi kubeval sadia dina ramatloka proyék.

Dina waktos nyerat artikel aslina, versi 0.15.0 sayogi.

Sakali dipasang, hayu urang eupan éta manifest di luhur:

$ kubeval base-valid.yaml
PASS - base-valid.yaml contains a valid Deployment (http-echo)
PASS - base-valid.yaml contains a valid Service (http-echo)

Upami suksés, kubeval bakal kaluar kalayan kode kaluar 0. Anjeun tiasa pariksa sapertos kieu:

$ echo $?
0

Hayu urang ayeuna coba kubeval ku manifest béda:

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)

Naha anjeun tiasa ningali masalah ku panon? Hayu urang ngajalankeun:

$ 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

Sumberna henteu diverifikasi.

Deployments ngagunakeun versi API apps/v1, kedah kalebet pamilih anu cocog sareng labél pod. Manifes di luhur henteu kalebet pamilih, janten kubeval ngalaporkeun kasalahan sareng kaluar kalayan kode anu henteu nol.

Kuring heran naon anu bakal kajadian lamun kuring ngalakukeun kubectl apply -f kalawan manifesto ieu?

Nya, hayu urang cobian:

$ 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

Ieu persis kasalahan nu kubeval warned ngeunaan. Anjeun tiasa ngalereskeunana ku nambihan pamilih:

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)

Kauntungan tina alat sapertos kubeval nyaéta kasalahan sapertos kieu tiasa dipendakan awal dina siklus panyebaran.

Salaku tambahan, pamariksaan ieu henteu meryogikeun aksés kana kluster; aranjeunna tiasa dilakukeun sacara offline.

Sacara standar, kubeval pariksa sumberdaya ngalawan skéma API Kubernetes panganyarna. Nanging, dina kalolobaan kasus, anjeun panginten kedah mariksa kana sékrési Kubernetes khusus. Ieu tiasa dilakukeun nganggo bandéra --kubernetes-version:

$ kubeval --kubernetes-version 1.16.1 base-valid.yaml

Perhatikeun yén versi kudu dieusian dina format nu Major.Minor.Patch.

Pikeun daptar vérsi anu dirojong pikeun verifikasi, mangga tingal Skéma JSON dina GitHub, nu kubeval ngagunakeun pikeun validasi. Upami anjeun kedah ngajalankeun kubeval offline, unduh skéma sareng sebutkeun lokasi lokalna nganggo bandéra --schema-location.

Salian file YAML individu, kubeval ogé tiasa dianggo sareng diréktori sareng stdin.

Salaku tambahan, Kubeval gampang ngahijikeun kana pipa CI. Anu hoyong ngajalankeun tés sateuacan ngirimkeun manifest ka kluster bakal resep terang yén kubeval ngadukung tilu format kaluaran:

  1. téks polos;
  2. JSON;
  3. Uji Protokol Naon waé (TAP).

Jeung salah sahiji format bisa dipaké pikeun parsing salajengna kaluaran pikeun ngahasilkeun kasimpulan hasil tina tipe nu dipikahoyong.

Salah sahiji kalemahan kubeval nyaéta ayeuna henteu tiasa mariksa patuh kana Definisi Sumber Daya Adat (CRD). Sanajan kitu, kasebut nyaéta dimungkinkeun pikeun ngonpigurasikeun kubeval malire aranjeunna.

Kubeval mangrupikeun alat anu saé pikeun mariksa sareng ngevaluasi sumber; Sanajan kitu, eta kudu emphasized yén lulus tés teu ngajamin yén sumberdaya luyu jeung prakték pangalusna.

Contona, ngagunakeun tag latest dina wadah henteu nuturkeun prakték pangsaéna. Tapi, kubeval henteu nganggap ieu kasalahan sareng henteu ngalaporkeunana. Nyaéta, verifikasi YAML sapertos kitu bakal réngsé tanpa peringatan.

Tapi kumaha upami anjeun hoyong meunteun YAML sareng ngaidentipikasi pelanggaran sapertos tag latest? Kumaha kuring pariksa file YAML ngalawan prakték pangsaéna?

2. Kube-skor

Kube-skor parses YAML manifests sarta ngaevaluasi aranjeunna ngalawan diwangun-di tés. Tés ieu dipilih dumasar kana pedoman kaamanan sareng prakték pangsaéna, sapertos:

  • Ngajalankeun wadahna henteu sakumaha akar.
  • Kasadiaan cek kaséhatan pod.
  • Nyetel pamundut sareng wates pikeun sumber.

Dumasar hasil tés, tilu hasil dipasihkeun: OK, PERHATOSAN и KRITIS.

Anjeun tiasa nyobian Kube-skor online atanapi install sacara lokal.

Dina waktu nulis artikel aslina, versi panganyarna tina kube-skor éta 1.7.0.

Hayu urang coba eta kaluar dina manifest urang 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 lulus tés kubeval, sedengkeun kube-skor nunjuk ka flaws handap:

  • Cék kesiapan teu dikonpigurasi.
  • Henteu aya pamundut atanapi wates pikeun sumber CPU sareng mémori.
  • Anggaran gangguan pod teu dieusian.
  • Henteu aya aturan pamisahan (anti afinitas) pikeun maksimalkeun pungsi kasadiaan.
  • Wadahna ngalir salaku akar.

Ieu sadayana mangrupikeun titik anu valid ngeunaan kakurangan anu kedah dilereskeun supados Deployment langkung efisien sareng dipercaya.

regu kube-score mintonkeun informasi dina formulir nu bisa dibaca manusa kaasup sagala jenis palanggaran PERHATOSAN и KRITIS, nu mantuan pisan salila pangwangunan.

Anu hoyong nganggo alat ieu dina pipa CI tiasa ngaktipkeun kaluaran anu langkung dikomprés nganggo bandéra --output-format ci (dina hal ieu, tés sareng hasilna ogé ditampilkeun 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

Sarupa jeung kubeval, kube-score mulih kode kaluar non-enol lamun aya tés nu gagal. KRITIS. Anjeun oge bisa ngaktipkeun processing sarupa pikeun PERHATOSAN.

Sajaba ti éta, kasebut nyaéta dimungkinkeun pikeun pariksa sumberdaya pikeun minuhan versi API béda (sakumaha dina kubeval). Sanajan kitu, informasi ieu hardcoded dina kube-skor sorangan: Anjeun teu bisa milih versi béda tina Kubernetes. watesan ieu bisa jadi masalah badag lamun maksudna pikeun ngamutahirkeun klaster Anjeun atawa lamun boga sababaraha klaster kalawan versi béda tina K8s.

Catet éta geus aya masalah kalawan proposal pikeun ngawujudkeun kasempetan ieu.

Inpo nu langkung lengkep ihwal kube-skor bisa kapanggih dina ramatloka resmi.

Kube-skor tés mangrupakeun alat hébat pikeun ngalaksanakeun prakték pangalusna, tapi kumaha lamun kudu nyieun parobahan test atawa nambahkeun aturan anjeun sorangan? Alas, ieu teu bisa dipigawé.

Kube-skor teu extensible: anjeun teu bisa nambahkeun kawijakan atawa nyaluyukeun aranjeunna.

Upami anjeun kedah nyerat tés khusus pikeun pariksa patuh kana kawijakan perusahaan, anjeun tiasa nganggo salah sahiji tina opat alat ieu: config-lint, copper, conftest, atanapi polaris.

3.Config-lint

Config-lint mangrupikeun alat pikeun validasi YAML, JSON, Terraform, file konfigurasi CSV sareng Manifes Kubernetes.

Anjeun tiasa masang éta ngagunakeun parentah dina ramatloka proyék.

Pelepasan ayeuna dina waktos nyerat artikel aslina nyaéta 1.5.0.

Config-lint teu gaduh tes anu diwangun pikeun ngavalidasi manifes Kubernetes.

Pikeun ngalaksanakeun tés naon waé, anjeun kedah nyiptakeun aturan anu pas. Éta ditulis dina file YAML anu disebut "aturan aturan" (aturan), sarta mibanda struktur handap:

version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
  - "*.yaml"
rules:
   # список правил

(rule.yaml)

Hayu urang diajar leuwih taliti:

  • médan type nangtukeun jenis konfigurasi config-lint bakal ngagunakeun. Pikeun K8s manifests ieu salawasna Kubernetes.
  • Di lapang files Salian file sorangan, anjeun tiasa netepkeun diréktori.
  • médan rules dimaksudkeun pikeun netepkeun tés pamaké.

Anggap anjeun hoyong mastikeun yén gambar dina Deployment sok diunduh tina gudang anu dipercaya sapertos my-company.com/myapp:1.0. Aturan config-lint anu ngalaksanakeun pamariksaan sapertos kieu:

- 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)

Unggal aturan kedah gaduh atribut di handap ieu:

  • id - identifier unik tina aturan;
  • severity - Tiasa waé GAGAL, PERHATOSAN и NON_COMPLIANT;
  • message - lamun aturan dilanggar, eusi garis ieu dipintonkeun;
  • resource - jenis sumberdaya nu aturan ieu lumaku;
  • assertions - daptar kaayaan anu bakal dievaluasi dina hubungan sumberdaya ieu.

Dina aturan di luhur assertion ngaranna every pariksa yén sadaya wadahna aya dina Deployment (key: spec.templates.spec.containers) nganggo gambar anu dipercaya (nyaéta dimimitian ku my-company.com/).

Aturan lengkep sapertos kieu:

version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
  - "*.yaml"
rules:

 - id: DEPLOYMENT_IMAGE_REPOSITORY # !!!
    severity: FAILURE
    message: Deployment must use a valid image repository
    resource: Deployment
    assertions:
      - every:
          key: spec.template.spec.containers
          expressions:
            - key: image
              op: starts-with
              value: "my-company.com/"

(ruleset.yaml)

Pikeun nyobaan tés, hayu urang simpen salaku check_image_repo.yaml. Hayu urang ngajalankeun cek dina file base-valid.yaml:

$ config-lint -rules check_image_repo.yaml base-valid.yaml

[
  {
  "AssertionMessage": "Every expression fails: And expression fails: image does not start with 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": "Deployment must use a valid image repository",
  "Status": "FAILURE"
  }
]

Cék gagal. Ayeuna hayu urang parios manifest di handap ieu sareng gudang gambar anu leres:

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)

Urang ngajalankeun test sarua jeung manifest luhur. Henteu aya masalah anu kapendak:

$ config-lint -rules check_image_repo.yaml image-valid-mycompany.yaml
[]

Config-lint mangrupikeun kerangka anu ngajangjikeun anu ngamungkinkeun anjeun nyiptakeun tés anjeun nyalira pikeun ngavalidasi Manifestasi YAML Kubernetes nganggo YAML DSL.

Tapi kumaha upami anjeun peryogi logika sareng tés anu langkung rumit? Naha YAML henteu terbatas teuing pikeun ieu? Kumaha upami anjeun tiasa ngadamel tés dina basa pamrograman anu lengkep?

4. Tambaga

Tambaga V2 mangrupakeun kerangka pikeun validating manifests maké tés custom (sarupa config-lint).

Nanging, éta bénten sareng anu terakhir yén éta henteu nganggo YAML pikeun ngajelaskeun tés. Tés bisa ditulis dina JavaScript gantina. Tambaga nyadiakeun perpustakaan kalawan sababaraha parabot dasar, anu ngabantosan anjeun maca inpormasi ngeunaan objék Kubernetes sareng ngalaporkeun kasalahan.

Léngkah pikeun masang Tambaga tiasa dipendakan dina dokuméntasi resmi.

2.0.1 mangrupikeun sékrési panganyarna tina utilitas ieu dina waktos nyerat tulisan asli.

Kawas config-lint, Tambaga teu boga diwangun-di tés. Hayu urang nulis hiji. Hayu parios yén panyebaran nganggo gambar wadahna sacara éksklusif ti repositori anu dipercaya sapertos my-company.com.

Jieun file check_image_repo.js kalawan eusi handap:

$$.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)
            }
        });
    }
});

Ayeuna pikeun nguji manifest urang base-valid.yaml, make paréntah 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

Éta jelas yén kalayan bantosan tambaga anjeun tiasa ngalakukeun tés anu langkung kompleks - contona, mariksa nami domain dina Manifests Ingress atanapi nampik pods anu ngajalankeun dina modeu istimewa.

Tambaga ngagaduhan sababaraha fungsi utilitas anu diwangun kana:

  • DockerImage maca file input anu ditangtukeun sareng nyiptakeun obyék kalayan atribut ieu:
    • name - ngaran gambar,
    • tag - tag gambar,
    • registry - pendaptaran gambar,
    • registry_url - protokol (https://) sareng pendaptaran gambar,
    • fqin - lokasi pinuh ku gambar.
  • fungsi findByName mantuan pikeun manggihan sumberdaya ku tipe nu tangtu (kind) jeung ngaran (name) tina file input.
  • fungsi findByLabels mantuan pikeun manggihan sumberdaya ku tipe husus (kind) jeung labél (labels).

Anjeun tiasa ningali sadaya pungsi jasa anu sayogi di dieu.

Sacara standar, éta ngamuat sadaya file YAML input kana variabel $$ sarta ngajadikeun eta sadia pikeun scripting (téhnik akrab pikeun maranéhanana kalayan pangalaman jQuery).

Kauntungan utama Copper atra: anjeun henteu kedah ngawasaan basa khusus sareng anjeun tiasa nganggo sababaraha fitur JavaScript pikeun nyiptakeun tés anjeun nyalira, sapertos interpolasi string, fungsi, jsb.

Ogé kudu dicatet yén versi ayeuna tina Tambaga jalan kalawan versi ES5 mesin JavaScript, teu ES6.

Rinci sadia di ramatloka proyék resmi.

Nanging, upami anjeun henteu resep JavaScript sareng resep basa anu dirarancang khusus pikeun nyiptakeun patarosan sareng ngajelaskeun kawijakan, anjeun kedah nengetan kontes.

5. Konférénsi

Conftest mangrupikeun kerangka pikeun nguji data konfigurasi. Ogé cocog pikeun nguji / verifying Kubernetes manifests. Tés digambarkeun ngagunakeun basa query husus Rego.

Anjeun tiasa masang conftest ngagunakeun parentahdidaptarkeun dina ramatloka proyék.

Dina waktu nulis artikel aslina, versi panganyarna sadia 0.18.2.

Sarupa jeung config-lint jeung tambaga, conftest asalna tanpa tes diwangun-di. Hayu urang coba kaluar jeung nulis kawijakan urang sorangan. Sapertos dina conto sateuacana, urang bakal pariksa naha gambar wadahna dicandak tina sumber anu dipercaya.

Jieun diréktori conftest-checks, sareng di jerona aya file anu namina check_image_registry.rego kalawan eusi handap:

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])
}

Ayeuna hayu urang nguji base-valid.yaml через 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

Tés diprediksi gagal sabab gambarna asalna tina sumber anu teu dipercaya.

Dina file Rego urang nangtukeun blok deny. Kabeneranna dianggap palanggaran. Lamun blok deny sababaraha, conftest cék aranjeunna bebas silih, jeung kabeneran salah sahiji blok dianggap salaku palanggaran.

Salian kaluaran standar, conftest ngadukung JSON, TAP sareng format tabel - fitur anu mangpaat pisan upami anjeun kedah ngalebetkeun laporan kana pipa CI anu tos aya. Anjeun tiasa nyetél format anu dipikahoyong nganggo bandéra --output.

Pikeun ngagampangkeun nga-debug kawijakan, conftest gaduh bandéra --trace. Ieu kaluaran renik kumaha conftest parses file kawijakan husus.

Kabijakan kontes tiasa dipedar sareng dibagikeun dina pendaptaran OCI (Open Container Initiative) salaku artefak.

Paréntah push и pull ngidinan Anjeun pikeun nyebarkeun hiji artefak atawa meunangkeun artefak aya ti pendaptaran jauh. Hayu urang cobian nyebarkeun kabijakan anu kami ciptakeun kana pendaptaran Docker lokal nganggo conftest push.

Mimitian pendaptaran Docker lokal anjeun:

$ docker run -it --rm -p 5000:5000 registry

Dina terminal sejen, buka diréktori nu dijieun saméméhna conftest-checks sareng ngajalankeun paréntah di handap ieu:

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

Upami paréntahna suksés, anjeun bakal ningali pesen sapertos kieu:

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

Ayeuna jieun diréktori samentawis sareng jalankeun paréntah di jerona conftest pull. Éta bakal ngaunduh pakét anu didamel ku paréntah sateuacana:

$ cd $(mktemp -d)
$ conftest pull 127.0.0.1:5000/amitsaha/opa-bundle-example:latest

A subdirectory bakal muncul dina diréktori samentara policyngandung file kawijakan kami:

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

Tés tiasa dijalankeun langsung tina gudang:

$ 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

Hanjakal, DockerHub teu acan dirojong. Jadi nganggap diri untung lamun make Azure Wadahna pendaptaran (ACR) atanapi pendaptaran anjeun sorangan.

format artefak sarua jeung Buka bungkusan Agen Kabijakan (OPA), anu ngamungkinkeun anjeun ngagunakeun conftest pikeun ngajalankeun tés tina bungkusan OPA anu tos aya.

Anjeun tiasa leuwih jéntré ngeunaan babagi kawijakan jeung fitur sejenna conftest di ramatloka proyék resmi.

6. Polaris

Alat anu terakhir anu bakal dibahas dina tulisan ieu nyaéta Polaris. (Pengumuman taun kamari na we geus ditarjamahkeun - kira-kira. tarjamahan)

Polaris tiasa dipasang dina klaster atanapi dianggo dina modeu garis paréntah. Sakumaha anjeun tiasa duga, éta ngamungkinkeun anjeun pikeun nganalisis sacara statis kubernetes manifests.

Nalika ngajalankeun dina modeu garis paréntah, diwangun-di tés sadia ngawengku wewengkon kayaning kaamanan sarta prakték pangalusna (sarupa jeung kube-skor). Sajaba ti éta, anjeun bisa nyieun tés sorangan (sakumaha dina config-lint, tambaga jeung conftest).

Kalayan kecap séjén, Polaris ngagabungkeun mangpaat duanana kategori parabot: kalawan diwangun-di na tés custom.

Pikeun masang Polaris dina modeu garis paréntah, paké parentah dina ramatloka proyék.

Dina waktu nulis artikel aslina, versi 1.0.3 geus sadia.

Sakali pamasangan réngsé anjeun tiasa ngajalankeun polaris dina manifest base-valid.yaml kalayan paréntah di handap ieu:

$ polaris audit --audit-path base-valid.yaml

Éta bakal ngahasilkeun senar dina format JSON kalayan pedaran lengkep ngeunaan tés anu dilakukeun sareng hasilna. Kaluaran bakal ngagaduhan struktur ieu:

{
  "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": [
    /* длинный список */
  ]
}

output pinuh sadia di dieu.

Sapertos kube-skor, Polaris ngidentipikasi masalah di daérah anu manifes henteu nyumponan prakték pangsaéna:

  • Henteu aya pamariksaan kaséhatan pikeun polong.
  • Tag pikeun gambar wadahna teu dieusian.
  • Wadahna ngalir salaku akar.
  • Requests sarta wates pikeun memori sareng CPU teu dieusian.

Unggal tés, gumantung kana hasil na, ditugaskeun darajat kritis: pangeling-eling atawa Bahaya. Pikeun leuwih jéntré ngeunaan tés diwangun-di sadia, mangga tingal dokuméntasi.

Upami rinci henteu diperyogikeun, anjeun tiasa netepkeun bandéra --format score. Dina hal ieu, Polaris bakal ngahasilkeun angka mimitian ti 1 nepi ka 100 − Asup (nyaéta penilaian):

$ polaris audit --audit-path test-data/base-valid.yaml --format score
68

Nu ngadeukeutan skor ka 100, nu leuwih luhur darajat kasapukan. Upami anjeun pariksa kodeu kaluar paréntah polaris audit, tétéla éta sarua jeung 0.

Maksakeun polaris audit Anjeun tiasa ngeureunkeun damel sareng kode non-enol nganggo dua umbul:

  • bandera --set-exit-code-below-score nyokot salaku argumen hiji nilai bangbarung dina rentang 1-100. Dina hal ieu, paréntah bakal kaluar kalawan kode kaluar 4 lamun skor handap bangbarung nu. Ieu mangpaat pisan mun anjeun boga nilai bangbarung nu tangtu (sebutkeun 75) jeung anjeun kudu nampa waspada lamun skor nu mana handap.
  • bandera --set-exit-code-on-danger bakal ngabalukarkeun paréntah gagal kalawan kode 3 lamun salah sahiji tes bahaya gagal.

Ayeuna hayu urang cobian ngadamel uji khusus anu mariksa naha gambarna dicandak tina gudang anu dipercaya. Tés khusus ditunjuk dina format YAML, sareng tés sorangan dijelaskeun nganggo JSON Schema.

Snippet kode YAML di handap ieu ngajelaskeun tés anyar anu disebut 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/.+$

Hayu urang nempo leuwih deukeut:

  • successMessage — garis ieu bakal dicitak upami tés parantos suksés;
  • failureMessage - pesen ieu bakal ditingalikeun upami gagal;
  • category - nunjukkeun salah sahiji kategori: Images, Health Checks, Security, Networking и Resources;
  • target--- nangtukeun naon jinis objék (spec) tés dilaksanakeun. Nilai anu mungkin: Container, Pod atawa Controller;
  • Tes sorangan dieusian dina obyék schema ngagunakeun skéma JSON. Kecap konci dina tés ieu nyaéta pattern dipaké pikeun ngabandingkeun sumber gambar jeung nu diperlukeun.

Pikeun ngajalankeun tés di luhur, anjeun kedah nyiptakeun konfigurasi Polaris ieu:

checks:
  checkImageRepo: danger
customChecks:
  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/.+$

(polaris-conf.yaml)

Hayu urang parse file:

  • Di lapang checks tés jeung tingkat kritis maranéhanana anu prescribed. Kusabab éta desirable pikeun nampa peringatan lamun hiji gambar dicokot tina sumber untrusted, urang nyetel tingkat dieu danger.
  • Tes sorangan checkImageRepo lajeng didaptarkeun dina obyék customChecks.

Simpen file salaku custom_check.yaml. Ayeuna anjeun tiasa ngajalankeun polaris audit kalawan manifest YAML nu merlukeun verifikasi.

Hayu urang nguji manifesto urang base-valid.yaml:

$ polaris audit --config custom_check.yaml --audit-path base-valid.yaml

regu polaris audit ngan ukur ngajalankeun uji pangguna anu dijelaskeun di luhur sareng éta gagal.

Lamun ngalereskeun gambar ka my-company.com/http-echo:1.0, Polaris bakal réngsé suksés. Manifesto sareng parobihan parantos aya repositoriesku kituna anjeun bisa pariksa paréntah saméméhna on manifest image-valid-mycompany.yaml.

Ayeuna timbul patarosan: kumaha ngajalankeun tés anu diwangun sareng anu khusus? Gampang! Anjeun ngan kedah nambihan identifiers tés anu diwangun kana file konfigurasi. Hasilna, éta bakal nyandak bentuk ieu:

checks:
  cpuRequestsMissing: warning
  cpuLimitsMissing: warning
  # Other inbuilt checks..
  # ..
  # custom checks
  checkImageRepo: danger # !!!
customChecks:
  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/.+$

(config_with_custom_check.yaml)

Conto file konfigurasi lengkep sayogi di dieu.

Pariksa manifest base-valid.yamlngagunakeun tés anu diwangun sareng khusus, anjeun tiasa nganggo paréntah:

$ polaris audit --config config_with_custom_check.yaml --audit-path base-valid.yaml

Polaris ngalengkepan tés anu diwangun sareng anu khusus, ku kituna ngagabungkeun anu pangsaéna tina dua dunya.

Di sisi anu sanés, henteu mampuh ngagunakeun basa anu langkung kuat sapertos Rego atanapi JavaScript tiasa janten faktor ngawatesan anu nyegah nyiptakeun tés anu langkung canggih.

Inpo nu langkung lengkep ihwal Polaris sadia di ramatloka proyék.

singgetan

Sanaos seueur alat anu sayogi pikeun mariksa sareng ngaevaluasi file YAML Kubernetes, hal anu penting pikeun boga pamahaman jelas ngeunaan kumaha tés bakal dirancang jeung dieksekusi.

Contona, Upami anjeun nyandak Manifestasi Kubernetes ngalangkungan pipa, kubeval tiasa janten léngkah munggaran dina pipa sapertos kitu.. Éta bakal ngawas naha definisi obyék saluyu sareng skéma API Kubernetes.

Sakali ulasan sapertos réngsé, saurang tiasa ngaléngkah ka tés anu langkung canggih, sapertos patuh kana prakték pangsaena standar sareng kawijakan khusus. Ieu dimana kube-skor na Polaris bakal datang dina gunana.

Pikeun anu ngagaduhan syarat anu rumit sareng kedah ngaluyukeun tés sacara rinci, tambaga, config-lint sareng conftest bakal cocog..

Conftest na config-lint ngagunakeun YAML pikeun nangtukeun tés custom, sarta tambaga méré Anjeun aksés ka basa programming pinuh, sahingga hiji pilihan geulis pikaresepeun.

Di sisi anu sanés, naha éta patut ngagunakeun salah sahiji alat ieu sareng, ku kituna, nyiptakeun sadaya tés sacara manual, atanapi langkung milih Polaris sareng nambihan ngan ukur anu diperyogikeun? Teu aya jawaban anu jelas pikeun patarosan ieu.

Tabél di handap nyadiakeun pedaran ringkes unggal alat:

Instrumén
takdir
shortcomings
tés pamaké

kubeval
Validates YAML manifests ngalawan versi husus tina skéma API
Teu tiasa dianggo sareng CRD
teu

kube-skor
Nganalisis manifests YAML ngalawan prakték pangalusna
Teu tiasa milih versi API Kubernetes anjeun pikeun mariksa sumber
teu

tambaga
A kerangka umum pikeun nyieun tés JavaScript custom pikeun YAML manifests
Taya tés diwangun-di. Dokuméntasi goréng
yen

config-lint
A kerangka umum pikeun nyieun tés dina basa domain-spésifik dipasang dina YAML. Ngarojong rupa-rupa format konfigurasi (misalna Terraform)
Henteu aya tés anu siap-siap. Diwangun-di assertions jeung fungsi bisa jadi teu cukup
yen

kontes
A kerangka pikeun nyieun tés anjeun sorangan maké Rego (basa query husus). Ngidinan babagi kawijakan via bundles OCI
Taya tés diwangun-di. Abdi kedah diajar Rego. Docker Hub henteu dirojong nalika nyebarkeun kawijakan
yen

Polaris
Ulasan YAML diwujudkeun ngalawan prakték pangsaéna standar. Ngidinan anjeun nyiptakeun tés sorangan nganggo JSON Schema
Kamampuhan uji dumasar kana JSON Schema panginten henteu cekap
yen

Kusabab alat ieu henteu ngandelkeun aksés kana klaster Kubernetes, aranjeunna gampang dipasang. Aranjeunna ngidinan Anjeun pikeun nyaring file sumber sarta nyadiakeun eupan balik gancang ka pangarang requests tarikan dina proyék.

PS ti penerjemah

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar