I-validate ang Kubernetes YAML batok sa labing maayo nga mga gawi ug mga palisiya

Nota. transl.: Uban sa nagkadako nga gidaghanon sa YAML configurations alang sa K8s environment, ang panginahanglan alang sa ilang automated verification nahimong mas ug mas dinalian. Ang tagsulat niini nga pagrepaso dili lamang nagpili sa kasamtangan nga mga solusyon alang niini nga buluhaton, apan gigamit usab ang Deployment isip usa ka panig-ingnan aron makita kung giunsa kini pagtrabaho. Kini nahimo nga labi ka kasayuran alang sa mga interesado sa kini nga hilisgutan.

I-validate ang Kubernetes YAML batok sa labing maayo nga mga gawi ug mga palisiya

TL; DR: Kini nga artikulo nagtandi sa unom ka static nga mga himan sa pag-validate ug pagtimbang-timbang sa mga Kubernetes YAML nga mga file batok sa labing maayo nga mga gawi ug mga kinahanglanon.

Ang mga workload sa Kubernetes kasagarang gihubit sa porma sa mga dokumento sa YAML. Usa sa mga problema sa YAML mao ang kalisud sa pagtino sa mga pagpugong o relasyon tali sa mga manifest file.

Unsa kaha kung kinahanglan naton sigurohon nga ang tanan nga mga imahe nga gipakatap sa cluster gikan sa usa ka kasaligan nga rehistro?

Unsaon nako pagpugong ang mga Deployment nga walay PodDisruptionBudgets nga ipadala sa cluster?

Ang paghiusa sa static nga pagsulay nagtugot kanimo sa pag-ila sa mga sayup ug mga paglapas sa palisiya sa yugto sa pag-uswag. Kini nagdugang sa garantiya nga ang mga kahulugan sa kahinguhaan husto ug luwas, ug naghimo nga mas lagmit nga ang mga workload sa produksiyon mosunod sa labing maayo nga mga gawi.

Ang Kubernetes static YAML file inspection ecosystem mahimong bahinon sa mosunod nga mga kategorya:

  • Mga validator sa API. Ang mga himan niining kategoryaha magsusi sa YAML manifest batok sa mga kinahanglanon sa Kubernetes API server.
  • Andam nga mga tester. Ang mga himan gikan sa kini nga kategorya adunay mga andam nga pagsulay alang sa seguridad, pagsunod sa labing kaayo nga mga gawi, ug uban pa.
  • Pasadya nga mga validator. Gitugotan ka sa mga representante sa kini nga kategorya nga maghimo mga naandan nga pagsulay sa lainlaing mga lengguwahe, pananglitan, Rego ug Javascript.

Niini nga artikulo atong ihulagway ug itandi ang unom ka lain-laing mga himan:

  1. kubeval;
  2. kube-score;
  3. config-lint;
  4. tumbaga;
  5. kumpiyansa;
  6. polaris.

Aw, magsugod na ta!

Pagsusi sa mga Deployment

Sa dili pa kita magsugod sa pagtandi sa mga himan, maghimo kita og pipila ka background aron masulayan kini.

Ang manifesto sa ubos adunay daghang mga sayup ug dili pagsunod sa labing kaayo nga mga gawi: pila niini ang imong makit-an?

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)

Gamiton namon kini nga YAML aron itandi ang lainlaing mga himan.

Ang manifesto sa ibabaw base-valid.yaml ug uban pang mga manifesto gikan niini nga artikulo makita sa Git repository.

Ang manifest naghulagway sa usa ka web application kansang nag-unang tahas mao ang pagtubag gamit ang "Hello World" nga mensahe ngadto sa port 5678. Mahimo kining i-deploy gamit ang mosunod nga sugo:

kubectl apply -f hello-world.yaml

Ug busa - susiha ang trabaho:

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

Karon adto sa http://localhost:8080 ug kumpirmahi nga ang aplikasyon nagtrabaho. Apan nagsunod ba kini sa labing maayong mga gawi? Atong susihon.

1. Kubeval

Sa kasingkasing sa kubeval Ang ideya mao nga ang bisan unsang interaksyon sa Kubernetes mahitabo pinaagi sa REST API niini. Sa laing pagkasulti, mahimo nimong gamiton ang API schema aron masusi kung ang gihatag nga YAML nahiuyon niini. Atong tan-awon ang usa ka pananglitan.

Instruksyon sa pag-instalar Ang kubeval anaa sa website sa proyekto.

Sa panahon sa pagsulat sa orihinal nga artikulo, ang bersyon 0.15.0 anaa na.

Sa higayon nga ma-install, atong pakan-on kini sa manifest sa ibabaw:

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

Kung magmalampuson, mogawas ang kubeval nga adunay exit code 0. Mahimo nimong susihon kini sama sa mosunod:

$ echo $?
0

Atong sulayan karon ang kubeval nga adunay lahi nga manifest:

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)

Makita ba nimo ang problema pinaagi sa mata? Atong ilunsad:

$ 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

Ang kapanguhaan wala gipamatud-an.

Mga deployment gamit ang bersyon sa API apps/v1, kinahanglan adunay usa ka tigpili nga mohaum sa label sa pod. Ang pagpakita sa ibabaw wala maglakip sa tigpili, mao nga ang kubeval nagreport sa usa ka sayup ug migawas nga adunay usa ka non-zero code.

Ambot unsay mahitabo kung buhaton nako kubectl apply -f uban niini nga manifesto?

Aw, atong sulayan:

$ 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

Kini gyud ang sayup nga gipasidan-an ni kubeval. Mahimo nimong ayohon kini pinaagi sa pagdugang usa ka tigpili:

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)

Ang kaayohan sa mga himan sama sa kubeval mao nga ang mga kasaypanan nga sama niini mahimong makuha sa sayo sa siklo sa pag-deploy.

Dugang pa, kini nga mga tseke wala magkinahanglan og access sa cluster; kini mahimo nga offline.

Sa kasagaran, gisusi sa kubeval ang mga kahinguhaan batok sa pinakabag-o nga Kubernetes API schema. Bisan pa, sa kadaghanan nga mga kaso kinahanglan nimo nga susihon ang usa ka piho nga pagpagawas sa Kubernetes. Mahimo kini gamit ang bandila --kubernetes-version:

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

Palihug timan-i nga ang bersyon kinahanglan nga espesipiko sa format Major.Minor.Patch.

Alang sa usa ka lista sa mga bersyon kung diin gisuportahan ang pag-verify, palihug tan-awa JSON schema sa GitHub, nga gigamit sa kubeval alang sa pag-validate. Kung kinahanglan nimo nga magpadagan sa kubeval offline, i-download ang mga laraw ug ipiho ang ilang lokal nga lokasyon gamit ang bandila --schema-location.

Dugang sa indibidwal nga mga file sa YAML, ang kubeval mahimo usab nga magtrabaho sa mga direktoryo ug stdin.

Dugang pa, ang Kubeval dali nga nag-integrate sa CI pipeline. Kadtong gusto nga modagan sa mga pagsulay sa dili pa ipadala ang mga manifests sa cluster malipay nga mahibal-an nga ang kubeval nagsuporta sa tulo ka mga format sa output:

  1. Yano nga teksto;
  2. JSON;
  3. Sulayi ang Bisan unsa nga Protocol (TAP).

Ug ang bisan unsang mga format mahimong magamit alang sa dugang nga pag-parse sa output aron makamugna og usa ka summary sa mga resulta sa gusto nga tipo.

Usa sa mga kakulian sa kubeval mao nga sa pagkakaron dili kini makasusi sa pagsunod sa Custom Resource Definitions (CRDs). Bisan pa, posible nga i-configure ang kubeval tagda sila.

Ang Kubeval usa ka maayo nga himan alang sa pagsusi ug pagtimbang-timbang sa mga kapanguhaan; Bisan pa, kinahanglan nga hatagan og gibug-aton nga ang pagpasa sa pagsulay dili garantiya nga ang kapanguhaan nagsunod sa labing kaayo nga mga gawi.

Pananglitan, gamit ang tag latest sa usa ka sudlanan wala magsunod sa labing maayo nga mga gawi. Bisan pa, ang kubeval wala mag-isip niini nga usa ka sayup ug wala magreport niini. Kana mao, ang pag-verify sa ingon nga YAML makompleto nga wala’y mga pasidaan.

Apan unsa man kung gusto nimo nga susihon ang YAML ug mahibal-an ang mga paglapas sama sa tag latest? Giunsa nako pagsusi ang usa ka YAML file batok sa labing kaayo nga mga gawi?

2. Kube-iskor

Kube-score gi-parse ang YAML nga gipakita ug gisusi kini batok sa mga built-in nga pagsulay. Kini nga mga pagsulay gipili base sa mga giya sa seguridad ug labing maayo nga mga gawi, sama sa:

  • Ang pagpadagan sa sudlanan dili ingon nga gamut.
  • Availability pod sa health checks.
  • Pagtakda sa mga hangyo ug mga limitasyon alang sa mga kapanguhaan.

Base sa mga resulta sa pagsulay, tulo ka mga resulta ang gihatag: OK, PASIDAAN ΠΈ Kritiko.

Mahimo nimong sulayan ang Kube-score online o i-install kini sa lokal.

Sa panahon sa pagsulat sa orihinal nga artikulo, ang pinakabag-o nga bersyon sa kube-score kay 1.7.0.

Atong sulayan kini sa atong manifest base-valid.yaml:

$ kube-score score base-valid.yaml

apps/v1/Deployment http-echo
[CRITICAL] Container Image Tag
  Β· http-echo -> Image with latest tag
      Using a fixed tag is recommended to avoid accidental upgrades
[CRITICAL] Pod NetworkPolicy
  Β· The pod does not have a matching network policy
      Create a NetworkPolicy that targets this pod
[CRITICAL] Pod Probes
  Β· Container is missing a readinessProbe
      A readinessProbe should be used to indicate when the service is ready to receive traffic.
      Without it, the Pod is risking to receive traffic before it has booted. It is also used during
      rollouts, and can prevent downtime if a new version of the application is failing.
      More information: https://github.com/zegl/kube-score/blob/master/README_PROBES.md
[CRITICAL] Container Security Context
  Β· http-echo -> Container has no configured security context
      Set securityContext to run the container in a more secure context.
[CRITICAL] Container Resources
  Β· http-echo -> CPU limit is not set
      Resource limits are recommended to avoid resource DDOS. Set resources.limits.cpu
  Β· http-echo -> Memory limit is not set
      Resource limits are recommended to avoid resource DDOS. Set resources.limits.memory
  Β· http-echo -> CPU request is not set
      Resource requests are recommended to make sure that the application can start and run without
      crashing. Set resources.requests.cpu
  Β· http-echo -> Memory request is not set
      Resource requests are recommended to make sure that the application can start and run without crashing.
      Set resources.requests.memory
[CRITICAL] Deployment has PodDisruptionBudget
  Β· No matching PodDisruptionBudget was found
      It is recommended to define a PodDisruptionBudget to avoid unexpected downtime during Kubernetes
      maintenance operations, such as when draining a node.
[WARNING] Deployment has host PodAntiAffinity
  Β· Deployment does not have a host podAntiAffinity set
      It is recommended to set a podAntiAffinity that stops multiple pods from a deployment from
      being scheduled on the same node. This increases availability in case the node becomes unavailable.

Ang YAML nagpasa sa kubeval nga mga pagsulay, samtang ang kube-score nagpunting sa mosunod nga mga sayup:

  • Ang mga pagsusi sa kaandam wala ma-configure.
  • Walay mga hangyo o limitasyon alang sa mga kapanguhaan ug memorya sa CPU.
  • Ang mga badyet sa pagkabalda sa pod wala gipiho.
  • Walay mga lagda sa panagbulag (anti-affinity) aron ma-maximize ang pagkaanaa.
  • Ang sudlanan midagan ingon nga gamut.

Kini ang tanan nga balido nga mga punto bahin sa mga kakulangan nga kinahanglan sulbaron aron mahimo ang Deployment nga mas episyente ug kasaligan.

team kube-score nagpakita sa impormasyon sa porma nga mabasa sa tawo lakip ang tanang matang sa paglapas PASIDAAN ΠΈ Kritiko, nga makatabang ug dako sa panahon sa kalamboan.

Kadtong gusto mogamit niini nga himan sulod sa CI pipeline makahimo sa mas compressed nga output gamit ang bandila --output-format ci (sa kini nga kaso, ang mga pagsulay nga adunay resulta gipakita usab 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

Sama sa kubeval, ang kube-score nagbalik sa usa ka non-zero exit code kung adunay pagsulay nga mapakyas Kritiko. Mahimo usab nimo nga mahimo ang parehas nga pagproseso alang sa PASIDAAN.

Dugang pa, posible nga susihon ang mga kapanguhaan alang sa pagsunod sa lainlaing mga bersyon sa API (sama sa kubeval). Bisan pa, kini nga kasayuran gi-hardcode sa kube-score mismo: dili ka makapili ug lahi nga bersyon sa Kubernetes. Kini nga limitasyon mahimong usa ka dako nga problema kung gusto nimo nga i-upgrade ang imong cluster o kung ikaw adunay daghang mga cluster nga adunay lainlaing mga bersyon sa K8.

timan-i nga naa nay isyu uban ang usa ka sugyot aron matuman kini nga oportunidad.

Dugang nga impormasyon bahin sa kube-score makita sa opisyal nga website.

Ang mga pagsulay sa Kube-score usa ka maayo nga himan alang sa pagpatuman sa labing kaayo nga mga gawi, apan unsa man kung kinahanglan nimo nga magbag-o sa pagsulay o magdugang sa imong kaugalingon nga mga lagda? Alaut, kini dili mahimo.

Ang Kube-score dili mapalapad: dili ka makadugang sa mga palisiya niini o maka-adjust niini.

Kung kinahanglan nimo nga magsulat ug custom nga mga pagsulay aron mapamatud-an ang pagsunod sa mga polisiya sa kompanya, mahimo nimong gamiton ang usa sa mosunod nga upat ka mga himan: config-lint, copper, conftest, o polaris.

3.Config-lint

Ang Config-lint usa ka himan alang sa pag-validate sa YAML, JSON, Terraform, CSV configuration files ug Kubernetes manifests.

Mahimo nimo kini i-install gamit ang mga instruksyon sa website sa proyekto.

Ang kasamtangan nga pagpagawas sa panahon sa pagsulat sa orihinal nga artikulo mao ang 1.5.0.

Ang Config-lint walay mga built-in nga pagsulay para sa pag-validate sa mga Kubernetes manifests.

Aron mapahigayon ang bisan unsang mga pagsulay, kinahanglan nimo nga maghimo angay nga mga lagda. Gisulat kini sa mga file sa YAML nga gitawag nga "mga lagda" (mga lagda), ug adunay mosunod nga istruktura:

version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
  - "*.yaml"
rules:
   # список ΠΏΡ€Π°Π²ΠΈΠ»

(rule.yaml)

Atong tun-an kini pag-ayo:

  • uma type nagtino unsa nga matang sa configuration config-lint ang gamiton. Para sa K8s manifests kini kanunay Kubernetes.
  • Sa sa kapatagan files Dugang sa mga file mismo, mahimo nimong itakda ang usa ka direktoryo.
  • uma rules gituyo alang sa pagtakda sa mga pagsulay sa tiggamit.

Ingnon ta nga gusto nimong masiguro nga ang mga imahe sa Deployment kanunay nga ma-download gikan sa usa ka kasaligan nga tipiganan sama sa my-company.com/myapp:1.0. Ang usa ka lagda sa config-lint nga naghimo sa ingon nga pagsusi mahimong ingon niini:

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

Ang matag lagda kinahanglan adunay mosunod nga mga kinaiya:

  • id β€” talagsaon nga identifier sa lagda;
  • severity - Mahimong KALIG-ON, PASIDAAN ΠΈ DILI_MATUOD;
  • message - kung ang usa ka lagda gilapas, ang mga sulud niini nga linya gipakita;
  • resource β€” ang matang sa kapanguhaan diin kini nga lagda magamit;
  • assertions β€” usa ka lista sa mga kondisyon nga pagasusihon kalabot niini nga kapanguhaan.

Sa lagda sa ibabaw assertion gitawag every susiha nga ang tanang sudlanan anaa sa Deployment (key: spec.templates.spec.containers) gamita ang kasaligang mga hulagway (ie sugod sa my-company.com/).

Ang kompleto nga ruleset ingon niini:

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)

Aron sulayan ang pagsulay, i-save kini ingon check_image_repo.yaml. Atong susihon ang 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"
  }
]

Ang tseke napakyas. Karon atong susihon ang mosunod nga manifest nga adunay husto nga repository sa imahe:

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)

Nagdagan kami sa parehas nga pagsulay sa gipakita sa ibabaw. Walay problema nga nakit-an:

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

Ang Config-lint usa ka promising framework nga nagtugot kanimo sa paghimo sa imong kaugalingon nga mga pagsulay aron ma-validate ang mga Kubernetes YAML nga gipakita gamit ang YAML DSL.

Apan komosta kung kinahanglan nimo ang labi ka komplikado nga lohika ug mga pagsulay? Dili ba limitado kaayo ang YAML alang niini? Unsa kaha kung makahimo ka og mga pagsulay sa usa ka bug-os nga programming language?

4. tumbaga

Copper V2 usa ka balangkas alang sa pag-validate sa mga manifest gamit ang naandan nga mga pagsulay (sama sa config-lint).

Bisan pa, lahi kini sa naulahi tungod kay wala kini gigamit ang YAML aron ihulagway ang mga pagsulay. Ang mga pagsulay mahimong isulat sa JavaScript sa baylo. Naghatag ang Copper sa usa ka librarya nga adunay daghang sukaranan nga mga himan, nga makatabang kanimo sa pagbasa sa impormasyon bahin sa mga butang sa Kubernetes ug pagreport sa mga sayop.

Ang mga lakang sa pag-instalar sa Copper makita sa opisyal nga dokumentasyon.

Ang 2.0.1 mao ang pinakabag-o nga pagpagawas niini nga utility sa panahon sa pagsulat sa orihinal nga artikulo.

Sama sa config-lint, ang Copper walay mga built-in nga pagsulay. Atong isulat ang usa. Himoa nga susihon nga ang mga pag-deploy naggamit sa mga imahe sa sulud nga eksklusibo gikan sa kasaligan nga mga repositoryo my-company.com.

Paghimo og file check_image_repo.js uban sa mosunod nga sulod:

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

Karon aron sulayan ang among manifest base-valid.yaml, gamita ang sugo 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

Kini mao ang tin-aw nga sa tabang sa tumbaga nga imong mahimo sa pagbuhat sa mas komplikado nga mga pagsulay - alang sa panig-ingnan, pagsusi sa mga ngalan sa domain sa Ingress manifests o pagsalikway pods nga nagdagan sa privileged mode.

Ang tumbaga adunay lain-laing mga gamit sa paggamit niini:

  • DockerImage nagbasa sa gipiho nga input file ug nagmugna og usa ka butang nga adunay mosunod nga mga hiyas:
    • name - ngalan sa imahe,
    • tag - tag sa imahe,
    • registry - rehistro sa imahe,
    • registry_url - protocol (https://) ug rehistro sa imahe,
    • fqin β€” bug-os nga lokasyon sa imahe.
  • function findByName makatabang sa pagpangita sa usa ka kapanguhaan pinaagi sa gihatag nga tipo (kind) ug ngalan (name) gikan sa input file.
  • function findByLabels makatabang sa pagpangita sa usa ka kapanguhaan pinaagi sa usa ka piho nga tipo (kind) ug mga label (labels).

Mahimo nimong tan-awon ang tanan nga magamit nga mga function sa serbisyo dinhi.

Sa kasagaran kini nagkarga sa tibuok input nga YAML file ngadto sa usa ka variable $$ ug gihimo kini nga magamit alang sa scripting (usa ka pamilyar nga teknik alang sa mga adunay kasinatian sa jQuery).

Ang panguna nga bentaha sa Copper klaro: dili nimo kinahanglan nga mag-master sa usa ka espesyal nga sinultian ug magamit nimo ang lainlaing mga bahin sa JavaScript aron mahimo ang imong kaugalingon nga mga pagsulay, sama sa interpolation sa string, mga gimbuhaton, ug uban pa.

Kinahanglan usab nga matikdan nga ang kasamtangan nga bersyon sa Copper nagtrabaho sa ES5 nga bersyon sa JavaScript engine, dili ES6.

Ang mga detalye anaa sa opisyal nga website sa proyekto.

Bisan pa, kung dili ka ganahan sa JavaScript ug gusto nimo ang usa ka lengguwahe nga espesipikong gidisenyo alang sa paghimo og mga pangutana ug paghulagway sa mga palisiya, kinahanglan nimo nga hatagan pagtagad ang pagkompesta.

5.Kompetisyon

Ang Conftest usa ka balangkas alang sa pagsulay sa datos sa pag-configure. Angayan usab alang sa pagsulay/pagpamatuod sa mga pagpakita sa Kubernetes. Gihulagway ang mga pagsulay gamit ang usa ka pinasahi nga lengguwahe sa pangutana Rego.

Mahimo nimong i-install ang conftest gamit ang mga instruksyonnalista sa website sa proyekto.

Sa panahon sa pagsulat sa orihinal nga artikulo, ang pinakabag-o nga bersyon nga magamit mao ang 0.18.2.

Sama sa config-lint ug copper, ang conftest moabut nga walay bisan unsang built-in nga mga pagsulay. Atong sulayan kini ug isulat ang atong kaugalingon nga palisiya. Sama sa nangaging mga pananglitan, among susihon kung ang mga imahen sa sulud gikuha gikan sa kasaligan nga gigikanan.

Paghimo og direktoryo conftest-checks, ug diha niini adunay usa ka file nga ginganlan check_image_registry.rego uban sa mosunod nga sulod:

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

Karon atong sulayan base-valid.yaml pinaagi sa 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

Ang pagsulay lagmit napakyas tungod kay ang mga imahe gikan sa dili kasaligan nga gigikanan.

Sa Rego file atong gihubit ang block deny. Ang kamatuoran niini giisip nga usa ka paglapas. Kung block deny ubay-ubay, conftest nagsusi kanila nga independente sa usag usa, ug ang kamatuoran sa bisan unsa nga block giisip nga usa ka paglapas.

Dugang sa default nga output, ang conftest nagsuporta sa JSON, TAP ug format sa lamesa - usa ka labi ka mapuslanon nga bahin kung kinahanglan nimo nga i-embed ang mga taho sa usa ka kasamtangan nga pipeline sa CI. Mahimo nimong itakda ang gusto nga format gamit ang bandila --output.

Aron mas dali ang pag-debug sa mga palisiya, ang conftest adunay bandila --trace. Nagpagawas kini usa ka pagsubay kung giunsa pag-parse sa conftest ang gipiho nga mga file sa palisiya.

Ang mga polisiya sa kontes mahimong imantala ug ipaambit sa OCI (Open Container Initiative) nga mga rehistro isip mga artifact.

Mga grupo push ΠΈ pull nagtugot kanimo sa pagmantala sa usa ka artifact o pagkuha sa usa ka kasamtangan nga artifact gikan sa usa ka hilit nga rehistro. Atong sulayan ang pagmantala sa polisiya nga atong gihimo sa lokal nga Docker registry gamit conftest push.

Sugdi ang imong lokal nga rehistro sa Docker:

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

Sa laing terminal, adto sa direktoryo nga imong gihimo sa sayo pa conftest-checks ug pagdagan ang mosunod nga sugo:

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

Kung malampuson ang mando, makakita ka usa ka mensahe nga sama niini:

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

Karon paghimo usa ka temporaryo nga direktoryo ug pagdagan ang mando niini conftest pull. Kini mag-download sa package nga gihimo sa miaging sugo:

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

Usa ka subdirectory ang makita sa temporaryo nga direktoryo policynaglangkob sa among file sa palisiya:

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

Ang mga pagsulay mahimong direktang ipadagan gikan sa repositoryo:

$ 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

Ikasubo, ang DockerHub wala pa gisuportahan. Busa isipa ang imong kaugalingon nga swerte kung mogamit ka Azure Container Registry (ACR) o imong kaugalingong rehistro.

Ang pormat sa artifact parehas sa Buksan ang mga pakete sa Ahente sa Polisiya (OPA), nga nagtugot kanimo sa paggamit sa conftest sa pagpadagan sa mga pagsulay gikan sa kasamtangan nga OPA packages.

Mahibal-an nimo ang dugang bahin sa pagpaambit sa palisiya ug uban pang mga bahin sa conftest sa opisyal nga website sa proyekto.

6. Polaris

Ang kataposang himan nga hisgotan niining artikuloha mao ang Polaris. (Iyang last year's announcement namo gihubad na - gibanabana. transl.)

Ang Polaris mahimong ma-install sa usa ka cluster o magamit sa command line mode. Sama sa imong natag-an, kini nagtugot kanimo sa pag-analisar sa estatistikong mga pagpakita sa Kubernetes.

Kung nagdagan sa command line mode, ang mga built-in nga mga pagsulay magamit nga naglangkob sa mga lugar sama sa seguridad ug labing maayo nga mga gawi (sama sa kube-score). Dugang pa, makahimo ka sa imong kaugalingon nga mga pagsulay (sama sa config-lint, copper ug conftest).

Sa laing pagkasulti, gihiusa ni Polaris ang mga benepisyo sa duha ka kategorya sa mga himan: nga adunay built-in ug naandan nga mga pagsulay.

Aron ma-install ang Polaris sa command line mode, gamita instruksyon sa website sa proyekto.

Sa panahon sa pagsulat sa orihinal nga artikulo, ang bersyon 1.0.3 anaa na.

Kung kompleto na ang pag-install mahimo nimong ipadagan ang polaris sa manifest base-valid.yaml uban sa mosunod nga sugo:

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

Magpagawas kini og string sa JSON format nga adunay detalyado nga paghulagway sa mga pagsulay nga gihimo ug sa ilang mga resulta. Ang output adunay mosunod nga istruktura:

{
  "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": [
    /* Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ список */
  ]
}

Bug-os nga output anaa dinhi.

Sama sa kube-score, gipaila ni Polaris ang mga isyu sa mga lugar diin ang manifest wala makatagbo sa labing kaayo nga mga gawi:

  • Walay mga health check alang sa mga pod.
  • Ang mga tag alang sa mga hulagway sa sudlanan wala gipiho.
  • Ang sudlanan midagan ingon nga gamut.
  • Ang mga hangyo ug limitasyon alang sa memorya ug CPU wala gipiho.

Ang matag pagsulay, depende sa mga resulta niini, gi-assign sa usa ka ang-ang sa kritikalidad: pasidaan o kakuyaw. Aron mahibal-an ang dugang bahin sa magamit nga mga built-in nga pagsulay, palihug tan-awa dokumentasyon.

Kung dili kinahanglan ang mga detalye, mahimo nimong ipiho ang bandila --format score. Niini nga kaso, ang Polaris mopagawas ug numero gikan sa 1 ngadto sa 100 βˆ’ iskor (i.e. assessment):

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

Ang mas duol sa iskor mao ang 100, mas taas ang ang-ang sa kasabutan. Kung imong susihon ang exit code sa command polaris audit, kini nahimo nga kini katumbas sa 0.

Puwersa polaris audit Mahimo nimong tapuson ang trabaho gamit ang non-zero code gamit ang duha nga mga bandila:

  • Flag --set-exit-code-below-score nagkuha isip argumento sa kantidad sa threshold sa range 1-100. Sa kini nga kaso, ang mando mogawas nga adunay exit code 4 kung ang marka ubos sa threshold. Kini mapuslanon kaayo kung ikaw adunay usa ka piho nga kantidad sa threshold (ingon 75) ug kinahanglan nimo nga makadawat usa ka alerto kung ang marka moubos.
  • Flag --set-exit-code-on-danger mahimong hinungdan nga mapakyas ang mando sa code 3 kung mapakyas ang usa sa mga pagsulay sa peligro.

Karon sulayan nato ang paghimo og custom nga pagsulay nga magsusi kung ang imahe gikuha gikan sa usa ka kasaligan nga repository. Ang mga custom nga pagsulay gitakda sa YAML format, ug ang pagsulay mismo gihulagway gamit ang JSON Schema.

Ang mosunod nga YAML code snippet naghulagway sa bag-ong pagsulay nga gitawag 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/.+$

Atong tan-awon pag-ayo kini:

  • successMessage β€” kini nga linya maimprinta kung ang pagsulay makompleto nga malampuson;
  • failureMessage β€” kini nga mensahe ipakita kung adunay kapakyasan;
  • category - nagpaila sa usa sa mga kategorya: Images, Health Checks, Security, Networking ΠΈ Resources;
  • target--- nagtino unsa nga matang sa butang (spec) gipadapat ang pagsulay. Posible nga mga kantidad: Container, Pod o Controller;
  • Ang pagsulay mismo gipiho sa butang schema gamit ang JSON schema. Ang yawe nga pulong niini nga pagsulay mao ang pattern gigamit sa pagtandi sa tinubdan sa hulagway sa gikinahanglan.

Aron mapadagan ang pagsulay sa ibabaw, kinahanglan nimo nga buhaton ang mosunud nga pagsumpo sa Polaris:

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)

Atong i-parse ang file:

  • Sa sa kapatagan checks Ang mga pagsulay ug ang ilang lebel sa pagka-kritikal gireseta. Tungod kay gitinguha nga makadawat usa ka pasidaan kung ang usa ka imahe gikuha gikan sa usa ka dili kasaligan nga gigikanan, among gibutang ang lebel dinhi danger.
  • Ang pagsulay mismo checkImageRepo unya narehistro sa butang customChecks.

I-save ang file ingon custom_check.yaml. Karon makadagan ka polaris audit nga adunay YAML manifest nga nanginahanglan pag-verify.

Atong sulayan ang atong manifesto base-valid.yaml:

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

team polaris audit midagan lamang ang pagsulay sa tiggamit nga gitakda sa ibabaw ug kini napakyas.

Kung imong ayohon ang imahe sa my-company.com/http-echo:1.0, Malampuson nga makompleto ang Polaris. Ang manifesto nga adunay mga pagbag-o naa na mga tipigananpara masusi nimo ang naunang command sa manifest image-valid-mycompany.yaml.

Karon mitungha ang pangutana: kung giunsa ang pagpadagan sa mga built-in nga pagsulay kauban ang mga naandan? Sayon! Kinahanglan lang nimo nga idugang ang mga built-in nga test identifier sa configuration file. Ingon nga resulta, kini mokuha sa mosunod nga porma:

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)

Usa ka pananglitan sa usa ka kompleto nga configuration file anaa dinhi.

Susiha ang manifest base-valid.yamlgamit ang built-in ug custom nga mga pagsulay, mahimo nimong gamiton ang command:

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

Gikompleto sa Polaris ang mga built-in nga mga pagsulay nga adunay mga naandan, sa ingon gihiusa ang labing kaayo sa duha nga kalibutan.

Sa pikas bahin, ang kawalay katakus sa paggamit sa labi ka kusgan nga mga sinultian sama sa Rego o JavaScript mahimo nga usa ka limitasyon nga hinungdan nga makapugong sa paghimo sa labi ka sopistikado nga mga pagsulay.

Dugang nga impormasyon bahin sa Polaris anaa sa website sa proyekto.

Sumaryo

Samtang adunay daghang mga himan nga magamit sa pagsusi ug pagtimbang-timbang sa mga file sa Kubernetes YAML, importante nga adunay usa ka tin-aw nga pagsabot kon sa unsang paagi ang mga pagsulay gidisenyo ug ipatuman.

Kay sa panig-ingnan, kung imong kuhaon ang Kubernetes manifests nga moagi sa pipeline, ang kubeval mahimong ang unang lakang sa ingon nga pipeline. Kini magmonitor kung ang mga kahulugan sa butang nahiuyon sa Kubernetes API schema.

Kung nahuman na ang ingon nga pagrepaso, mahimo’g magpadayon ang usa sa labi ka sopistikado nga mga pagsulay, sama sa pagsunod sa mga sumbanan nga labing kaayo nga gawi ug piho nga mga palisiya. Dinhi magamit ang kube-score ug Polaris.

Alang sa mga adunay komplikado nga mga kinahanglanon ug kinahanglan nga ipasadya ang mga pagsulay sa detalye, ang tumbaga, config-lint ug conftest mahimong angay.

Ang Conftest ug config-lint naggamit sa YAML aron mahibal-an ang custom nga mga pagsulay, ug ang tumbaga naghatag kanimo og access sa usa ka bug-os nga programming language, nga naghimo niini nga usa ka nindot nga pagpili.

Sa laing bahin, angayan ba nga gamiton ang usa niini nga mga himan ug, busa, paghimo sa tanan nga mga pagsulay nga mano-mano, o gusto ang Polaris ug idugang lamang ang gikinahanglan niini? Walay klaro nga tubag niini nga pangutana.

Ang lamesa sa ubos naghatag usa ka mubo nga paghulagway sa matag himan:

Galamiton
Katuyoan
mga kakulangan
Mga pagsulay sa tiggamit

kubeval
Gipamatud-an ang mga pagpakita sa YAML batok sa usa ka piho nga bersyon sa schema sa API
Dili makatrabaho sa CRD
Dili

kube-score
Gi-analisar ang mga pagpakita sa YAML batok sa labing kaayo nga mga gawi
Dili makapili sa imong bersyon sa Kubernetes API aron masusi ang mga kapanguhaan
Dili

tumbaga
Usa ka kinatibuk-ang gambalay alang sa paghimo og custom JavaScript nga mga pagsulay alang sa YAML manifests
Walay built-in nga mga pagsulay. Dili maayo nga dokumentasyon
Oo

config-lint
Usa ka kinatibuk-ang balangkas alang sa paghimo og mga pagsulay sa usa ka piho nga domain nga pinulongan nga gilakip sa YAML. Nagsuporta sa lainlaing mga format sa pag-configure (eg Terraform)
Wala'y andam nga mga pagsulay. Ang mga built-in nga pagpahayag ug mga gimbuhaton mahimong dili igo
Oo

kompwesto
Usa ka balangkas alang sa paghimo sa imong kaugalingon nga mga pagsulay gamit ang Rego (usa ka espesyal nga sinultian nga pangutana). Gitugotan ang pagpaambit sa mga palisiya pinaagi sa mga bundle sa OCI
Walay built-in nga mga pagsulay. Kinahanglan kong makat-on sa Rego. Ang Docker Hub dili suportado kung nagpatik sa mga palisiya
Oo

Polaris
Ang mga pagrepaso sa YAML nagpakita batok sa standard nga labing maayo nga mga gawi. Nagtugot kanimo sa paghimo sa imong kaugalingon nga mga pagsulay gamit ang JSON Schema
Ang mga kapabilidad sa pagsulay base sa JSON Schema mahimong dili igo
Oo

Tungod kay kini nga mga himan wala magsalig sa pag-access sa Kubernetes cluster, kini dali nga i-install. Gitugotan ka nila nga ma-filter ang mga gigikanan nga file ug maghatag dali nga feedback sa mga tagsulat sa mga hangyo sa pagbitad sa mga proyekto.

PS gikan sa tighubad

Basaha usab sa among blog:

Source: www.habr.com

Idugang sa usa ka comment