Hamarino ny Kubernetes YAML amin'ny fomba fanao sy politika tsara indrindra

Fanamarihana. transl.: Miaraka amin'ny fitomboan'ny isan'ny tefy YAML ho an'ny tontolo K8s dia miha-maika hatrany ny filana ny fanamarinana mandeha ho azy. Ny mpanoratra ity famerenana ity dia tsy nisafidy vahaolana efa misy ho an'ity asa ity ihany, fa nampiasa ny Deployment ho ohatra ihany koa mba hijerena ny fomba fiasan'izy ireo. Hita fa tena nahafantarana ireo izay liana amin'ity lohahevitra ity.

Hamarino ny Kubernetes YAML amin'ny fomba fanao sy politika tsara indrindra

TL, DR: Ity lahatsoratra ity dia mampitaha fitaovana static enina hanamarinana sy hanombanana ny rakitra Kubernetes YAML mifanaraka amin'ny fanao sy fepetra tsara indrindra.

Ny entan'ny Kubernetes dia voafaritra amin'ny endrika antontan-taratasy YAML. Ny iray amin'ireo olana amin'ny YAML dia ny fahasarotana amin'ny famaritana ny teritery na ny fifandraisana misy eo amin'ny rakitra mibaribary.

Ahoana raha mila maka antoka isika fa avy amin'ny rejisitra azo itokisana ny sary rehetra apetraka amin'ny cluster?

Ahoana no ahafahako manakana ny fandefasana tsy misy PodDisruptionBudgets tsy halefa any amin'ny cluster?

Ny fampidirana fitiliana static dia ahafahanao mamantatra ny lesoka sy ny fanitsakitsahana ny politika amin'ny dingana fampandrosoana. Izany dia mampitombo ny antoka fa marina sy azo antoka ny famaritana ny loharanon-karena, ary mahatonga azy io ho azo inoana kokoa fa hanaraka ny fanao tsara indrindra ny enta-mamokatra.

Ny tontolon'ny fizahana rakitra YAML statik Kubernetes dia azo zaraina amin'ireto sokajy manaraka ireto:

  • API validators. Ny fitaovana amin'ity sokajy ity dia manamarina ny fanehoana YAML mifanaraka amin'ny fepetra takian'ny mpizara Kubernetes API.
  • Ireo mpanandrana vonona. Ny fitaovana avy amin'ity sokajy ity dia tonga miaraka amin'ny fitsapana efa vita ho an'ny fiarovana, ny fanarahana ny fanao tsara indrindra, sns.
  • Fanamarinana manokana. Ny solontenan'ity sokajy ity dia mamela anao hamorona fitsapana manokana amin'ny fiteny samihafa, ohatra, Rego sy Javascript.

Ato amin'ity lahatsoratra ity dia mamaritra sy mampitaha fitaovana enina samihafa isika:

  1. kubeval;
  2. kube-score;
  3. config-lint;
  4. varahina;
  5. confest;
  6. polaris.

Eny ary, andao hanomboka!

Fanamarinana ny fandefasana

Alohan'ny hanombohantsika fampitahana fitaovana, andeha isika hamorona lafin-javatra vitsivitsy hitsapana azy ireo.

Ahitana lesoka maromaro sy tsy fanarahana ny fomba fanao tsara indrindra ny manifesto etsy ambany: firy amin'izy ireo no hitanao?

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)

Hampiasa ity YAML ity izahay mba hampitahana fitaovana samihafa.

Ny manifesto etsy ambony base-valid.yaml ary ny manifesto hafa avy amin'ity lahatsoratra ity dia azo jerena ao amin'ny Git repository.

Ny fanehoana dia manoritsoritra fampiharana amin'ny Internet izay ny andraikitra lehibe dia mamaly amin'ny hafatra "Hello World" mankany amin'ny seranan-tsambo 5678. Azo apetraka amin'ny baiko manaraka izany:

kubectl apply -f hello-world.yaml

Ary noho izany - jereo ny asa:

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

Mandehana izao http://localhost:8080 ary hamafiso fa mandeha ny fampiharana. Saingy manaraka fomba fanao tsara indrindra ve izany? Andeha hojerentsika.

1. Kubeval

Ao amin'ny fotony kubeval Ny hevitra dia ny hoe ny fifandraisana rehetra amin'ny Kubernetes dia mitranga amin'ny alàlan'ny REST API. Raha lazaina amin'ny teny hafa, azonao atao ny mampiasa schema API hijerena raha mifanaraka amin'izany ny YAML iray. Andeha isika hijery ohatra iray.

Torolàlana fametrahana Kubeval dia hita ao amin'ny tranokalan'ny tetikasa.

Tamin'ny fotoana nanoratana ny lahatsoratra tany am-boalohany dia nisy ny version 0.15.0.

Rehefa tafapetraka dia andeha hohanintsika ilay manifeste etsy ambony:

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

Raha mahomby dia hivoaka ny kubeval miaraka amin'ny kaody fivoahana 0. Azonao atao ny manamarina izany toy izao manaraka izao:

$ echo $?
0

Andeha isika izao hanandrana kubeval amin'ny fanehoana hafa:

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)

Afaka mahita ny olana amin'ny maso ve ianao? Andao hanomboka:

$ 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

Tsy voamarina ny loharano.

Fametrahana mampiasa ny kinova API apps/v1, dia tsy maintsy misy mpifidy mifanandrify amin'ny etik'ilay pod. Ny fanehoana etsy ambony dia tsy ahitana ny mpifidy, noho izany dia nitatitra ny hadisoana i kubeval ary nivoaka niaraka tamin'ny code tsy aotra.

Manontany tena aho hoe inona no hitranga raha manao izany aho kubectl apply -f miaraka amin'ity manifesto ity?

Eny, andeha isika:

$ 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

Izany indrindra no fahadisoana nampitandreman'i kubeval. Azonao atao ny manamboatra izany amin'ny fampidirana mpifidy:

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)

Ny tombony amin'ny fitaovana toa an'i kubeval dia ny mety ho tratran'ny lesoka toy izany amin'ny fiandohan'ny tsingerin'ny fametrahana.

Fanampin'izany, tsy mitaky fidirana amin'ny cluster ireo fisavana ireo fa azo atao ivelan'ny aterineto.

Amin'ny alàlan'ny default, ny kubeval dia manamarina loharano mifanaraka amin'ny tetika farany indrindra Kubernetes API. Na izany aza, amin'ny ankamaroan'ny tranga dia mety mila manamarina ny famoahana Kubernetes manokana ianao. Izany dia azo atao amin'ny fampiasana ny saina --kubernetes-version:

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

Mariho fa ny dikan-teny dia tsy maintsy voafaritra amin'ny endrika Major.Minor.Patch.

Raha mila lisitr'ireo dikan-teny izay tohanan'ny fanamarinana, azafady jereo JSON schema amin'ny GitHub, izay ampiasain'i kubeval ho fanamarinana. Raha mila mampandeha an-tserasera kubeval ianao dia alaivo ny skema ary ambarao ny toerana misy azy ireo amin'ny alàlan'ny saina --schema-location.

Ankoatra ny rakitra YAML tsirairay, ny kubeval dia afaka miasa amin'ny lahatahiry sy stdin.

Ankoatra izany, i Kubeval dia miditra mora amin'ny fantsona CI. Ho faly ireo maniry hanao andrana alohan'ny handefasana ireo fanehoan-kevitra amin'ny cluster fa ny kubeval dia manohana endrika famoahana telo:

  1. Text tsotra;
  2. JSON;
  3. Test Anything Protocol (TAP).

Ary ny endrika rehetra dia azo ampiasaina amin'ny fanaparitahana bebe kokoa ny vokatra mba hamoronana famintinana ny vokatry ny karazana tiana.

Ny iray amin'ireo tsy fahampian'ny kubeval dia ny tsy ahafahany manara-maso ny fanarahana ny Custom Resource Definitions (CRDs). Na izany aza, azo atao ny manamboatra kubeval tsy miraharaha azy ireo.

Kubeval dia fitaovana tsara amin'ny fanamarinana sy fanombanana ny loharano; Na izany aza, tokony hohamafisina fa tsy manome antoka fa mifanaraka amin'ny fomba fanao tsara indrindra ny fanatontosana ny fanadinana.

Ohatra, mampiasa ny tag latest ao anaty fitoeran-javatra dia tsy manaraka ny fanao tsara indrindra. Na izany aza, tsy mihevitra izany ho fahadisoana i kubeval ary tsy mitatitra izany. Izany hoe, ny fanamarinana ny YAML toy izany dia ho vita tsy misy fampitandremana.

Ahoana anefa raha te-handinika ny YAML ianao ary hamantatra ny fandikan-dalàna toy ny tag latest? Ahoana no hanamarina ny rakitra YAML amin'ny fomba fanao tsara indrindra?

2. Kube-sora

Kube-score parses YAML miseho sy manombatombana azy ireo manohitra ny naorina-in fitsapana. Ireo fitsapana ireo dia nofantenana mifototra amin'ny torolàlana momba ny fiarovana sy ny fomba fanao tsara indrindra, toy ny:

  • Fampandehanana ny fitoeran-javatra fa tsy toy ny fakany.
  • Ny fisian'ny fisavana ara-pahasalamana pod.
  • Mametraka fangatahana sy fetra ho an'ny loharanon-karena.

Miorina amin'ny valin'ny fitsapana, vokatra telo no omena: OK, FAMPITANDREMANA и Critical.

Azonao atao ny manandrana Kube-score amin'ny Internet na mametraka azy eo an-toerana.

Tamin'ny fotoana nanoratana ny lahatsoratra tany am-boalohany, ny kinova farany an'ny kube-score dia 1.7.0.

Andeha hojerentsika amin'ny manifestentsika izany 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 mandalo fitsapana kubeval, raha ny kube-score kosa dia manondro ireto lesoka manaraka ireto:

  • Tsy voafefy ny fisavana fahavononana.
  • Tsy misy fangatahana na fetra ho an'ny loharanon-karena sy fitadidiana CPU.
  • Tsy voafaritra ny teti-bolan'ny fanakorontanana pod.
  • Tsy misy fitsipika momba ny fisarahana (anti-affinity) mba hampitombo ny fahafahana.
  • Ny kaontenera dia mandeha toy ny faka.

Ireo dia teboka manan-danja rehetra momba ny lesoka tokony hodinihina mba hahatonga ny Deployment hahomby sy azo antoka kokoa.

ekipa kube-score mampiseho fampahalalana amin'ny endrika mora vakin'ny olona ao anatin'izany ny karazana fandikan-dalàna rehetra FAMPITANDREMANA и Critical, izay manampy betsaka mandritra ny fampandrosoana.

Ireo izay maniry hampiasa an'io fitaovana io ao anatin'ny fantsona CI dia afaka manome vokatra voaporitra kokoa amin'ny fampiasana ny saina --output-format ci (amin'ity tranga ity dia aseho ihany koa ny fitsapana miaraka amin'ny valiny 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

Mitovy amin'ny kubeval, ny kube-score dia mamerina kaody fivoahana tsy aotra rehefa misy fitsapana tsy nahomby Critical. Azonao atao koa ny mamela ny fanodinana mitovy amin'ny FAMPITANDREMANA.

Ho fanampin'izany, azo atao ny manamarina ny loharanon'ny fanarahana ireo dikan-teny API samihafa (toy ny amin'ny kubeval). Na izany aza, ity fampahalalana ity dia voasokajy mafy ao amin'ny kube-score: tsy afaka misafidy dikan-teny hafa amin'ny Kubernetes ianao. Ity famerana ity dia mety ho olana lehibe raha mikasa ny hanatsara ny cluster ianao na raha manana cluster maro miaraka amin'ny dikan-teny K8 samihafa ianao.

Mariho fa efa misy olana miaraka amin'ny tolo-kevitra hanatanterahana izany fahafahana izany.

Ny fampahalalana bebe kokoa momba ny kube-score dia azo jerena ao amin'ny tranonkala ofisialy.

Ny fitsapana Kube-score dia fitaovana tsara amin'ny fampiharana ny fanao tsara indrindra, fa ahoana kosa raha mila manova ny fitsapana ianao na manampy ny fitsipikao manokana? Indrisy, tsy azo atao izany.

Tsy azo itarina ny Kube-score: tsy azonao atao ny manampy politika na manitsy azy ireo.

Raha mila manoratra fitsapana manokana ianao mba hanamarinana ny fanarahana ny politikan'ny orinasa dia azonao ampiasaina ny iray amin'ireto fitaovana efatra manaraka ireto: config-lint, varahina, conftest, na polaris.

3.Config-lint

Config-lint dia fitaovana hanamarina ny YAML, JSON, Terraform, CSV configuration files ary Kubernetes manifests.

Azonao atao ny mametraka izany amin'ny fampiasana TOROLALANA amin'ny tranokalan'ny tetikasa.

Ny famoahana ankehitriny hatramin'ny fotoana nanoratana ny lahatsoratra tany am-boalohany dia 1.5.0.

Ny Config-lint dia tsy manana andrana naorina ho fanamarinana ny fanehoana Kubernetes.

Mba hanaovana fitsapana rehetra dia mila mamorona fitsipika mety ianao. Izy ireo dia voasoratra ao amin'ny rakitra YAML antsoina hoe "rulesets" (fitsipika), ary manana ity rafitra manaraka ity:

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

(rule.yaml)

Andeha hojerentsika akaiky kokoa izany:

  • saha type mamaritra izay karazana config-lint ho ampiasaina. Ho an'ny K8 dia maneho izany foana Kubernetes.
  • Tany an-tsaha files Ho fanampin'ny rakitra ihany, azonao atao ny mamaritra lahatahiry iray.
  • saha rules natao hametrahana fitsapana mpampiasa.

Aoka hatao hoe te-hahazo antoka ianao fa ny sary ao amin'ny Deployment dia alaina foana avy amin'ny tahiry azo itokisana toy ny my-company.com/myapp:1.0. Ny fitsipika config-lint izay manao fanamarinana toy izany dia toa izao:

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

Ny fitsipika tsirairay dia tsy maintsy manana ireto toetra manaraka ireto:

  • id - famantarana tokana ny fitsipika;
  • severity - Angamba TSY HAHOMBY, FAMPITANDREMANA и TSY MANARAKA;
  • message - raha voadika ny fitsipika iray, dia aseho ny votoatin'ity andalana ity;
  • resource - ny karazana loharanom-pitaovana ampiharana ity fitsipika ity;
  • assertions - lisitr'ireo fepetra hodinihina mifandraika amin'ity loharano ity.

Ao amin'ny fitsipika etsy ambony assertion eo ambanin'ny anarana every manamarina fa ao amin'ny Deployment ny container rehetra (key: spec.templates.spec.containers) mampiasa sary azo itokisana (izany hoe manomboka amin'ny my-company.com/).

Toy izao ny fitsipika feno:

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)

Mba hanandrana ny fitsapana, andao hotehirizina ho check_image_repo.yaml. Andeha hojerentsika ny rakitra 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"
  }
]

Tsy nahomby ny seky. Andeha hojerentsika izao manaraka izao miaraka amin'ny tahiry sary marina:

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)

Mitovy amin'ny andrana ihany koa no ataontsika miaraka amin'ilay manifeste etsy ambony. Tsy misy olana hita:

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

Config-lint dia rafitra mampanantena izay ahafahanao mamorona andrana manokana hanamarinana ny fanehoana Kubernetes YAML mampiasa ny YAML DSL.

Ahoana anefa raha mila lojika sy fitsapana sarotra kokoa ianao? Tsy voafetra loatra ve ny YAML amin'izany? Ahoana raha afaka mamorona fitsapana amin'ny fiteny fandaharana feno ianao?

4. Varahina

Varahina V2 dia rafitra iray hanamarinana ny fanehoana amin'ny alàlan'ny fitsapana mahazatra (mitovy amin'ny config-lint).

Na izany aza, tsy mitovy amin'ny farany izy io fa tsy mampiasa YAML hamaritana fitsapana. Azo soratana amin'ny JavaScript kosa ny fitsapana. Ny Copper dia manome tranomboky misy fitaovana fototra maromaro, izay manampy anao hamaky fampahalalana momba ny zavatra Kubernetes ary mitatitra ny hadisoana.

Ny dingana amin'ny fametrahana Copper dia hita ao antontan-taratasy ofisialy.

2.0.1 no famoahana farany an'ity fitaovana ity tamin'ny fotoana nanoratana ny lahatsoratra voalohany.

Tahaka ny config-lint, ny Copper dia tsy manana fitsapana naorina. Andao hanoratra iray. Avelao izy hanamarina fa ny fametrahana dia mampiasa sary kaontenera avy amin'ny tahiry azo itokisana toy ny my-company.com.

Mamorona rakitra check_image_repo.js miaraka amin'ireto votoaty manaraka ireto:

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

Ankehitriny mba hitsapana ny fanehoantsika base-valid.yaml, ampiasao ny baiko 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

Mazava fa miaraka amin'ny fanampian'ny varahina dia afaka manao fitsapana sarotra kokoa ianao - ohatra, ny fanamarinana ny anaran'ny sehatra ao amin'ny Ingress dia miseho na mandà pods mandeha amin'ny fomba manokana.

Ny Copper dia manana fiasa isan-karazany ao anatiny:

  • DockerImage mamaky ny rakitra fampidirana voatondro ary mamorona zavatra misy ireto toetra manaraka ireto:
    • name - anaran'ny sary,
    • tag - tag sary,
    • registry - rejisitry ny sary,
    • registry_url - protocole (https://) sy ny rejisitra sary,
    • fqin - toerana feno ny sary.
  • asa findByName manampy amin'ny fitadiavana loharano amin'ny karazana iray (kind) sy ny anarana (name) avy amin'ny rakitra fampidirana.
  • asa findByLabels manampy amin'ny fitadiavana loharano amin'ny karazana voafaritra (kind) sy etikety (labels).

Azonao atao ny mijery ny asa fanompoana rehetra misy eto.

Amin'ny alàlan'ny default dia mameno ny rakitra YAML manontolo amin'ny fiovaovana $$ ary manome azy ho an'ny scripting (teknika mahazatra ho an'ireo manana traikefa jQuery).

Ny tombony lehibe amin'ny Copper dia miharihary: tsy mila mahay fiteny manokana ianao ary afaka mampiasa endri-javatra JavaScript isan-karazany hamoronana fitsapana anao manokana, toy ny interpolation string, functions, sns.

Marihina ihany koa fa ny dikan-teny ankehitriny Copper dia miasa amin'ny ES5 amin'ny motera JavaScript, fa tsy ES6.

Hita ao amin'ny tranonkala ofisialin'ny tetikasa.

Na izany aza, raha tsy tianao ny JavaScript ary tianao ny fiteny iray natao manokana hamoronana fanontaniana sy famaritana politika, dia tokony handinika ny conftest ianao.

5. Fifaninanana

Conftest dia rafitra iray ho an'ny fitiliana angon-drakitra fanamafisana. Mety amin'ny fitiliana/fanamarinana ny fisehoan'i Kubernetes. Ny fitsapana dia faritana amin'ny alalan'ny tenim-panontaniana manokana Rego.

Azonao atao ny mametraka conftest mampiasa TOROLALANAvoatanisa ao amin'ny tranokalan'ny tetikasa.

Tamin'ny fotoana nanoratana ny lahatsoratra tany am-boalohany, ny kinova farany azo alaina dia 0.18.2.

Mitovy amin'ny config-lint sy ny varahina, ny conftest dia tonga tsy misy fitsapana naorina. Andao andramana ary hanoratra ny politikantsika manokana. Toy ny tamin'ny ohatra teo aloha, hojerentsika raha nalaina avy amin'ny loharano azo antoka ny sary fitoeran-javatra.

Mamorona lahatahiry conftest-checks, ary ao anatiny dia misy rakitra antsoina hoe check_image_registry.rego miaraka amin'ireto votoaty manaraka ireto:

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

Andeha isika hizaha toetra base-valid.yaml ny alalan ' 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

Tsy nahomby ilay fitsapana satria avy amina loharano tsy azo itokisana ny sary.

Ao amin'ny rakitra Rego no mamaritra ny sakana deny. Heverina ho fanitsakitsahana ny fahamarinany. Raha sakana deny maro, conftest dia manamarina azy ireo tsy miankina, ary ny fahamarinan'ny iray amin'ireo sakana dia raisina ho toy ny fanitsakitsahana.

Ho fanampin'ny famoahana default, ny conftest dia manohana ny JSON, TAP ary ny endrika latabatra - endri-javatra tena ilaina raha mila mampiditra tatitra amin'ny fantsona CI efa misy ianao. Azonao atao ny mametraka ny endrika tiana amin'ny fampiasana ny saina --output.

Mba hanamora ny fandravana ny politika dia manana saina ny conftest --trace. Izy io dia mamoaka soritra ny fomba famakian'ny conftest ny rakitra politika voatondro.

Ny politikan'ny fifaninanana dia azo avoaka sy zaraina ao amin'ny rejisitra OCI (Open Container Initiative) ho toy ny artifact.

didy push и pull mamela anao hamoaka artifact na maka artifact efa misy avy amin'ny rejisitra lavitra. Andeha isika hanandrana hamoaka ny politika noforoninay amin'ny rejisitra Docker eo an-toerana mampiasa conftest push.

Atombohy ny rejisitra Docker eo an-toerana:

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

Ao amin'ny terminal hafa, mandehana any amin'ny lahatahiry noforoninao teo aloha conftest-checks ary araho ity baiko manaraka ity:

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

Raha nahomby ny baiko dia hahita hafatra toy izao ianao:

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

Mamorona lahatahiry vonjimaika izao ary ataovy ny baiko ao anatiny conftest pull. Izy io dia hisintona ny fonosana noforonin'ny baiko teo aloha:

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

Hisy subdirectory hiseho ao amin'ny lahatahiry vonjimaika policymisy ny rakitra politikanay:

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

Ny fitsapana dia azo atao mivantana avy amin'ny tahiry:

$ 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

Indrisy fa tsy mbola tohana ny DockerHub. Koa hevero ho tsara vintana ianao raha mampiasa Azure Container Registry (ACR) na ny rejisitrao manokana.

Ny endrika artifact dia mitovy amin'ny Sokafy ny fonosana Policy Agent (OPA), izay ahafahanao mampiasa conftest hanaovana fitsapana avy amin'ny fonosana OPA efa misy.

Afaka mianatra bebe kokoa momba ny fifampizaràna politika sy ny endri-javatra hafa amin'ny conftest ianao ao amin'ny tranonkala ofisialin'ny tetikasa.

6. Polaris

Ny fitaovana farany hodinihina ato amin'ity lahatsoratra ity dia Polaris. (Ny fanambarany tamin'ny taon-dasa we efa nadika - eo ho eo FANDIKAN-TENY)

Ny Polaris dia azo apetraka ao anaty cluster na ampiasaina amin'ny fomba baiko. Araka ny efa noeritreretinao, dia ahafahanao mamakafaka ny fisehoan'i Kubernetes.

Rehefa mandeha amin'ny fomba baikon'ny baiko dia misy ny andrana naorina ao amin'ny faritra toy ny fiarovana sy ny fanao tsara indrindra (mitovy amin'ny kube-score). Ankoatra izany, azonao atao ny mamorona fitsapana anao manokana (toy ny amin'ny config-lint, varahina ary conftest).

Raha lazaina amin'ny teny hafa, ny Polaris dia manambatra ny tombotsoan'ny sokajy roa amin'ny fitaovana: miaraka amin'ny fitsapana namboarina sy mahazatra.

Mba hametrahana Polaris amin'ny baiko baiko, ampiasao torolalana ao amin'ny tranokalan'ny tetikasa.

Tamin'ny fotoana nanoratana ny lahatsoratra tany am-boalohany dia misy ny version 1.0.3.

Rehefa vita ny fametrahana dia azonao atao ny mihazakazaka polaris amin'ny manifest base-valid.yaml miaraka amin'ity baiko manaraka ity:

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

Izy io dia hamoaka tady amin'ny endrika JSON miaraka amin'ny famaritana amin'ny antsipiriany momba ny fitsapana natao sy ny valiny. Ny vokatra dia hanana ity rafitra manaraka ity:

{
  "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 feno azo eto.

Tahaka ny kube-score, i Polaris dia mamaritra ny olana amin'ny faritra tsy mahafeno ny fomba fanao tsara indrindra:

  • Tsy misy fisavana ara-pahasalamana ho an'ny pods.
  • Ny marika ho an'ny sary fitoeran-javatra dia tsy voafaritra.
  • Ny kaontenera dia mandeha toy ny faka.
  • Ny fangatahana sy ny fetran'ny fitadidiana sy ny CPU dia tsy voafaritra.

Ny fitsapana tsirairay, miankina amin'ny valiny, dia omena ambaratongam-tsikera: fampitandremana na Loza. Raha te hahalala bebe kokoa momba ireo andrana naorina azo alaina dia jereo ny tahirin-kevitra.

Raha tsy ilaina ny antsipiriany dia azonao atao ny mamaritra ny saina --format score. Amin'ity tranga ity, Polaris dia hamoaka isa manomboka amin'ny 1 ka hatramin'ny 100 − Maty (izany hoe fanombanana):

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

Arakaraka ny manakaiky ny isa dia 100 no ambony kokoa ny ambaratongan'ny fifanarahana. Raha mijery ny kaody fivoahana amin'ny baiko ianao polaris audit, hita fa mitovy amin'ny 0.

Hery polaris audit Azonao atao ny manajanona ny asa miaraka amin'ny kaody tsy aotra amin'ny fampiasana saina roa:

  • sainam-pirenena --set-exit-code-below-score maka ho tohan-kevitra ny sandan'ny tokonam-baravarana eo amin'ny 1-100. Amin'ity tranga ity, ny baiko dia hivoaka miaraka amin'ny kaody fivoahana 4 raha ambany ny tokonam-baravarana ny isa. Tena ilaina izany rehefa manana sandan'ny tokonam-baravarana ianao (milaza 75) ary mila mahazo fanairana ianao raha toa ka ambany ny isa.
  • sainam-pirenena --set-exit-code-on-danger dia hahatonga ny baiko tsy hahomby amin'ny code 3 raha tsy mahomby ny iray amin'ireo fitsapana loza.

Andeha isika izao hanandrana hamorona andrana manokana izay manamarina raha nalaina avy amin'ny tahiry azo itokisana ny sary. Ny fitsapana manokana dia voafaritra amin'ny endrika YAML, ary ny fitsapana dia voafaritra amin'ny fampiasana JSON Schema.

Ity sombin-kaody YAML manaraka ity dia mamaritra fitsapana vaovao antsoina 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/.+$

Andeha hojerentsika akaiky izany:

  • successMessage - ity andalana ity dia hatao pirinty raha vita soa aman-tsara ny fitsapana;
  • failureMessage - ity hafatra ity dia haseho raha misy tsy fahombiazana;
  • category - manondro ny iray amin'ireo sokajy: Images, Health Checks, Security, Networking и Resources;
  • target--- mamaritra ny karazana zavatra (spec) ny fitsapana dia ampiharina. Sanda mety: Container, Pod na Controller;
  • Ny fitsapana mihitsy dia voafaritra ao amin'ilay zavatra schema mampiasa schema JSON. Ny teny fototra amin'ity fitsapana ity dia pattern ampiasaina hampitahana ny loharanon-tsary amin'ilay ilaina.

Mba hampandehanana ny fitsapana etsy ambony, dia mila mamorona ity konfigurasi Polaris manaraka ity ianao:

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)

Andeha hojerentsika ny rakitra:

  • Tany an-tsaha checks andrana sy ny haavon'ny fanakianana azy ireo no voalaza. Koa satria irina ny hahazo fampitandremana rehefa misy sary nalaina tamina loharano tsy azo itokisana, dia apetrakay eto ny haavony danger.
  • Ny fitsapana mihitsy checkImageRepo dia voasoratra ao amin'ny zavatra customChecks.

Tehirizo ny rakitra ho custom_check.yaml. Afaka mihazakazaka ianao izao polaris audit miaraka amin'ny fanehoana YAML izay mila fanamarinana.

Andao hizaha toetra ny manifesto base-valid.yaml:

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

ekipa polaris audit ny fitsapana mpampiasa voalaza etsy ambony ihany no nihazakazaka ary tsy nahomby izany.

Raha amboarinao ny sary ho my-company.com/http-echo:1.0, Polaris dia ho vita soa aman-tsara. Efa miditra ny manifesto misy ny fanovana repositorymba hahafahanao manamarina ny baiko teo aloha amin'ny manifest image-valid-mycompany.yaml.

Mipoitra izao ny fanontaniana: ahoana ny fomba hanaovana fitsapana naorina miaraka amin'ireo mahazatra? Mora! Mila ampidirinao amin'ny fichier configuration fotsiny ireo identifiers test naorina. Ho vokatr'izany dia handray izao endrika manaraka izao:

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)

Misy ohatra iray amin'ny rakitra fanamafisana feno eto.

Jereo ny manifest base-valid.yamlamin'ny alàlan'ny fanandramana namboarina sy mahazatra, azonao atao ny mampiasa ny baiko:

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

Polaris dia mameno ny fitsapana naorina miaraka amin'ny fanao mahazatra, ka manambatra ny tsara indrindra amin'ny tontolo roa.

Amin'ny lafiny iray, ny tsy fahaizana mampiasa fiteny matanjaka kokoa toa ny Rego na JavaScript dia mety ho antony mametra manakana ny famoronana fitsapana sarotra kokoa.

Misy fampahalalana bebe kokoa momba ny Polaris hita ao amin'ny tranokalan'ny tetikasa.

famintinana

Na dia misy fitaovana maro azo hijerena sy hanombanana ny rakitra YAML Kubernetes, zava-dehibe ny fananana fahatakarana mazava ny fomba handrafetana sy hanatanterahana ny fitsapana.

Ohatra, raha maka Kubernetes manifests mandeha amin'ny fantsona ianao, ny kubeval dia mety ho dingana voalohany amin'ny fantsona toy izany. Hanara-maso raha mifanaraka amin'ny skema Kubernetes API ny famaritana zavatra.

Rehefa vita ny famerenana toy izany, dia afaka miroso amin'ny fitsapana saro-pady kokoa ny olona iray, toy ny fanarahana ny fomba fanao tsara indrindra sy ny politika manokana. Eto no misy ny kube-score sy Polaris.

Ho an'ireo izay manana fepetra sarotra ary mila manamboatra fitsapana amin'ny antsipiriany, ny varahina, ny config-lint ary ny conftest dia mety..

Conftest sy config-lint dia mampiasa YAML hamaritana ny fitsapana mahazatra, ary ny varahina dia manome anao fidirana amin'ny fiteny fandaharana feno, ka mahatonga azy ho safidy tsara tarehy.

Amin'ny lafiny iray, mendrika ve ny mampiasa ny iray amin'ireo fitaovana ireo ary, noho izany, mamorona ny fitsapana rehetra amin'ny tanana, na aleony Polaris ary ampio fotsiny izay ilaina? Tsy misy valiny mazava amin'io fanontaniana io.

Ny tabilao etsy ambany dia manome famaritana fohy momba ny fitaovana tsirairay:

fitaovana
anjara
fahadisoana
Fitsapana mpampiasa

kubeval
Manamarina ny fisehoan'ny YAML amin'ny dikan-teny manokana amin'ny tetika API
Tsy afaka miasa amin'ny CRD
No

kube-score
Mamakafaka ny fanehoana YAML manohitra ny fanao tsara indrindra
Tsy afaka misafidy ny kinova API Kubernetes anao hanamarinana loharano
No

varahina
Rafitra ankapobeny amin'ny famoronana andrana JavaScript mahazatra ho an'ny YAML manifests
Tsy misy andrana anatiny. Ratsy ny antontan-taratasy
fa

config-lint
Rafitra ankapoben'ny famoronana andrana amin'ny fiteny manokana amin'ny sehatra voarakitra ao amin'ny YAML. Manohana endrika fanamboarana isan-karazany (oh: Terraform)
Tsy misy andrana efa vita. Mety tsy ho ampy ny fanambaràna sy ny fiasa naorina
fa

fifaninanana
Firafitra hamoronana fitsapana anao manokana amin'ny fampiasana Rego (fiteny fanontana manokana). Mamela ny fifampizaràna politika amin'ny alàlan'ny fehezam-boninkazo OCI
Tsy misy andrana anatiny. Tsy maintsy mianatra Rego aho. Tsy tohanana ny Docker Hub rehefa mamoaka politika
fa

Polaris
Hevitra YAML dia miseho manohitra ny fanao tsara indrindra. Mamela anao hamorona andrana manokana mampiasa JSON Schema
Mety tsy ho ampy ny fahaiza-manao fitsapana mifototra amin'ny JSON Schema
fa

Satria tsy miankina amin'ny fidirana amin'ny kluster Kubernetes ireo fitaovana ireo dia mora ny mametraka azy ireo. Izy ireo dia mamela anao hanivana rakitra loharano ary manome valiny haingana ho an'ireo mpanoratra ny fangatahana misintona amin'ny tetikasa.

PS avy amin'ny mpandika teny

Vakio ihany koa ao amin'ny bilaoginay:

Source: www.habr.com

Add a comment