Thibitisha Kubernetes YAML dhidi ya mbinu na sera bora

Kumbuka. tafsiri.: Kwa kuongezeka kwa idadi ya usanidi wa YAML kwa mazingira ya K8s, hitaji la uthibitishaji wa kiotomatiki linakuwa wa dharura zaidi na zaidi. Mwandishi wa hakiki hii hakuchagua tu suluhu zilizopo kwa kazi hii, lakini pia alitumia Usambazaji kama mfano kuona jinsi zinavyofanya kazi. Iligeuka kuwa ya habari sana kwa wale ambao wana nia ya mada hii.

Thibitisha Kubernetes YAML dhidi ya mbinu na sera bora

TL; DR: Makala haya yanalinganisha zana sita tuli ili kuthibitisha na kutathmini faili za Kubernetes YAML dhidi ya mbinu na mahitaji bora.

Uzito wa kazi wa Kubernetes kwa kawaida hufafanuliwa katika muundo wa hati za YAML. Mojawapo ya matatizo ya YAML ni ugumu wa kubainisha vikwazo au uhusiano kati ya faili za maelezo.

Je, ikiwa tutahitaji kuhakikisha kuwa picha zote zilizotumwa kwenye kundi zinatoka kwa sajili inayoaminika?

Ninawezaje kuzuia Upelekaji ambao hauna PodDisruptionBudgets kutumwa kwa nguzo?

Ujumuishaji wa majaribio tuli hukuruhusu kutambua makosa na ukiukaji wa sera katika hatua ya usanidi. Hii huongeza hakikisho kwamba ufafanuzi wa rasilimali ni sahihi na salama, na hufanya uwezekano mkubwa kuwa mzigo wa kazi wa uzalishaji utafuata mbinu bora zaidi.

Mfumo wa ukaguzi wa faili wa YAML tuli wa Kubernetes unaweza kugawanywa katika kategoria zifuatazo:

  • Vithibitishaji vya API. Zana katika kategoria hii huangalia faili ya maelezo ya YAML dhidi ya mahitaji ya seva ya Kubernetes API.
  • Wajaribu tayari. Zana kutoka aina hii huja na majaribio yaliyotengenezwa tayari kwa ajili ya usalama, kufuata mbinu bora, n.k.
  • Vithibitishaji maalum. Wawakilishi wa kitengo hiki wanakuwezesha kuunda majaribio maalum katika lugha mbalimbali, kwa mfano, Rego na Javascript.

Katika makala hii tutaelezea na kulinganisha zana sita tofauti:

  1. kubeval;
  2. kube-alama;
  3. config-lint;
  4. shaba;
  5. mashindano;
  6. Polari.

Naam, tuanze!

Kukagua Usambazaji

Kabla ya kuanza kulinganisha zana, hebu tuunde usuli fulani wa kuzijaribu.

Ilani iliyo hapa chini ina idadi ya makosa na kutofuata kanuni bora: ni ngapi kati ya hizo unaweza kupata?

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)

Tutatumia YAML hii kulinganisha zana tofauti.

Ilani hapo juu base-valid.yaml na ilani zingine kutoka kwa nakala hii zinaweza kupatikana katika Hifadhi za Git.

Faili ya maelezo inaelezea programu ya wavuti ambayo kazi yake kuu ni kujibu ujumbe wa "Hujambo Ulimwenguni" kwa mlango nambari 5678. Inaweza kutumwa kwa amri ifuatayo:

kubectl apply -f hello-world.yaml

Na kwa hivyo - angalia kazi:

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

Sasa nenda kwa http://localhost:8080 na uthibitishe kuwa programu inafanya kazi. Lakini je, inafuata mazoea bora? Hebu tuangalie.

1. Kubeval

Katika moyo wa kubeval Wazo ni kwamba mwingiliano wowote na Kubernetes hutokea kupitia REST API yake. Kwa maneno mengine, unaweza kutumia schema ya API kuangalia kama YAML iliyotolewa inalingana nayo. Hebu tuangalie mfano.

Maagizo ya Ufungaji kubeval zinapatikana kwenye tovuti ya mradi.

Wakati wa kuandika makala ya awali, toleo la 0.15.0 lilipatikana.

Ikisakinishwa, wacha tuilishe faili ya maelezo hapo juu:

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

Ikifaulu, kubeval itaondoka na msimbo wa kutoka 0. Unaweza kuiangalia kama ifuatavyo:

$ echo $?
0

Hebu sasa tujaribu kubeval na faili tofauti ya maelezo:

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)

Je, unaweza kutambua tatizo kwa jicho? Wacha tuzindue:

$ 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

Rasilimali haijathibitishwa.

Usambazaji kwa kutumia toleo la API apps/v1, lazima ijumuishe kiteuzi kinacholingana na lebo ya ganda. Faili ya maelezo iliyo hapo juu haijumuishi kiteuzi, kwa hivyo kubeval aliripoti hitilafu na kuondoka na msimbo usio sufuri.

Nashangaa nini kitatokea ikiwa nitafanya kubectl apply -f na ilani hii?

Kweli, wacha tujaribu:

$ 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

Hili ndilo kosa haswa ambalo kubeval alionya kuhusu. Unaweza kuirekebisha kwa kuongeza kiteuzi:

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)

Faida ya zana kama kubeval ni kwamba makosa kama haya yanaweza kupatikana mapema katika mzunguko wa usambazaji.

Kwa kuongeza, ukaguzi huu hauhitaji ufikiaji wa nguzo; unaweza kufanywa nje ya mtandao.

Kwa chaguo-msingi, kubeval hukagua rasilimali dhidi ya schema ya hivi punde ya Kubernetes API. Walakini, katika hali nyingi unaweza kuhitaji kuangalia dhidi ya toleo maalum la Kubernetes. Hii inaweza kufanyika kwa kutumia bendera --kubernetes-version:

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

Tafadhali kumbuka kuwa toleo lazima libainishwe katika umbizo Major.Minor.Patch.

Kwa orodha ya matoleo ambayo uthibitishaji unatumika, tafadhali rejelea JSON schema kwenye GitHub, ambayo kubeval hutumia kwa uthibitisho. Iwapo unahitaji kuendesha kubeval nje ya mtandao, pakua taratibu na ubainishe mahali zilipo karibu kwa kutumia bendera --schema-location.

Kwa kuongeza faili za YAML za kibinafsi, kubeval pia inaweza kufanya kazi na saraka na stdin.

Kwa kuongeza, Kubeval inaunganisha kwa urahisi kwenye bomba la CI. Wale wanaotaka kufanya majaribio kabla ya kutuma faili za maelezo kwenye nguzo watafurahi kujua kuwa kubeval inasaidia aina tatu za matokeo:

  1. Nakala wazi;
  2. JSON;
  3. Jaribu Itifaki ya Kitu Chochote (TAP).

Na umbizo lolote linaweza kutumika kwa uchanganuzi zaidi wa matokeo ili kutoa muhtasari wa matokeo ya aina inayotakiwa.

Mojawapo ya mapungufu ya kubeval ni kwamba kwa sasa haiwezi kuangalia kwa kufuata Ufafanuzi wa Rasilimali Maalum (CRDs). Walakini, inawezekana kusanidi kubeval wapuuze.

Kubeval ni zana nzuri ya kuangalia na kutathmini rasilimali; Hata hivyo, inapaswa kusisitizwa kuwa kufaulu mtihani hakuhakikishi kuwa rasilimali inatii mbinu bora.

Kwa mfano, kwa kutumia tag latest kwenye chombo haifuati mazoea bora. Walakini, kubeval haizingatii hili kama kosa na hairipoti. Hiyo ni, uthibitishaji wa YAML kama hiyo utakamilika bila maonyo.

Lakini vipi ikiwa unataka kutathmini YAML na kutambua ukiukaji kama vile lebo latest? Je, ninaangaliaje faili ya YAML dhidi ya mbinu bora?

2. Kube-alama

Kube-alama huchanganua YAML inadhihirisha na kutathmini dhidi ya majaribio yaliyojumuishwa. Majaribio haya huchaguliwa kulingana na miongozo ya usalama na mbinu bora, kama vile:

  • Kuendesha chombo sio kama mzizi.
  • Uwepo wa ukaguzi wa afya ya ganda.
  • Kuweka maombi na mipaka ya rasilimali.

Kulingana na matokeo ya mtihani, matokeo matatu yanatolewa: OK, WARNING ΠΈ KITIKA.

Unaweza kujaribu Kube-score mtandaoni au kusakinisha ndani ya nchi.

Wakati wa kuandika makala asili, toleo la hivi punde zaidi la kube-score lilikuwa 1.7.0.

Hebu tuijaribu kwenye manifest yetu 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 hufaulu majaribio ya kubeval, huku kube-alama inaelekeza kwenye dosari zifuatazo:

  • Ukaguzi wa utayari haujasanidiwa.
  • Hakuna maombi au mipaka ya rasilimali na kumbukumbu ya CPU.
  • Bajeti za usumbufu wa ganda hazijabainishwa.
  • Hakuna sheria za kujitenga (kupinga mshikamano) ili kuongeza upatikanaji.
  • Chombo kinaendesha kama mzizi.

Haya yote ni hoja halali kuhusu mapungufu ambayo yanahitaji kushughulikiwa ili kufanya Usambazaji kuwa mzuri zaidi na wa kuaminika.

Timu kube-score huonyesha maelezo katika umbo linaloweza kusomeka na binadamu ikijumuisha ukiukaji wa aina zote WARNING ΠΈ KITIKA, ambayo husaidia sana wakati wa maendeleo.

Wale wanaotaka kutumia zana hii ndani ya bomba la CI wanaweza kuwezesha utoaji uliobanwa zaidi kwa kutumia bendera --output-format ci (katika kesi hii, vipimo vilivyo na matokeo pia vinaonyeshwa 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

Sawa na kubeval, kube-score hurejesha nambari ya kutoka isiyo ya sifuri wakati kuna jaribio ambalo halifaulu. KITIKA. Unaweza pia kuwezesha usindikaji sawa kwa WARNING.

Kwa kuongeza, inawezekana kuangalia rasilimali kwa kufuata matoleo tofauti ya API (kama katika kubeval). Hata hivyo, maelezo haya yamewekwa kwenye mfumo wa kube-alama yenyewe: huwezi kuchagua toleo tofauti la Kubernetes. Kizuizi hiki kinaweza kuwa tatizo kubwa ikiwa unanuia kuboresha nguzo yako au ikiwa una makundi mengi yenye matoleo tofauti ya K8.

Tafadhali kumbuka kuwa tayari kuna suala pamoja na pendekezo la kutambua fursa hii.

Maelezo zaidi kuhusu kube-alama yanaweza kupatikana kwa tovuti rasmi.

Majaribio ya Kube-alama ni zana bora ya kutekeleza mbinu bora, lakini vipi ikiwa unahitaji kufanya mabadiliko kwenye jaribio au kuongeza sheria zako mwenyewe? Ole, hii haiwezi kufanywa.

Kube-alama haiwezi kupanuliwa: huwezi kuongeza sera kwake au kuzirekebisha.

Iwapo unahitaji kuandika majaribio maalum ili kuthibitisha utiifu wa sera za kampuni, unaweza kutumia mojawapo ya zana nne zifuatazo: config-lint, shaba, conftest au polaris.

3.Config-lint

Config-lint ni zana ya kuhalalisha YAML, JSON, Terraform, faili za usanidi za CSV na maonyesho ya Kubernetes.

Unaweza kusakinisha kwa kutumia maelekezo kwenye tovuti ya mradi.

Toleo la sasa kama wakati wa kuandika makala asili ni 1.5.0.

Config-lint haina majaribio ya ndani ya kuthibitisha faili za Kubernetes.

Kufanya vipimo vyovyote, unahitaji kuunda sheria zinazofaa. Zimeandikwa katika faili za YAML zinazoitwa "rulesets" (sheria), na kuwa na muundo ufuatao:

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

(rule.yaml)

Hebu tujifunze kwa karibu zaidi:

  • Shamba type inabainisha ni aina gani ya usanidi wa usanidi utatumia. Kwa K8s hudhihirisha hii ni daima Kubernetes.
  • katika uwanja files Mbali na faili zenyewe, unaweza kutaja saraka.
  • Shamba rules iliyokusudiwa kuweka majaribio ya watumiaji.

Tuseme unataka kuhakikisha kuwa picha katika Usambazaji zinapakuliwa kila wakati kutoka kwa hazina inayoaminika kama vile my-company.com/myapp:1.0. Sheria ya usanidi ambayo hufanya ukaguzi kama huu inaweza kuonekana kama hii:

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

Kila sheria lazima iwe na sifa zifuatazo:

  • id - kitambulisho cha kipekee cha sheria;
  • severity - Labda UNAFUNGWA, WARNING ΠΈ WASIO_KUTII;
  • message - ikiwa sheria inakiukwa, yaliyomo kwenye mstari huu yanaonyeshwa;
  • resource - aina ya rasilimali ambayo sheria hii inatumika;
  • assertions - orodha ya masharti ambayo yatatathminiwa kuhusiana na rasilimali hii.

Katika kanuni hapo juu assertion kuitwa every hukagua kuwa kontena zote ziko kwenye Usambazaji (key: spec.templates.spec.containers) tumia picha zinazoaminika (yaani kuanzia na my-company.com/).

Seti kamili ya sheria inaonekana kama hii:

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)

Ili kujaribu jaribio, wacha tuihifadhi kama check_image_repo.yaml. Wacha tufanye ukaguzi kwenye faili 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"
  }
]

Cheki imeshindwa. Sasa wacha tuangalie faili ifuatayo na hazina sahihi ya picha:

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)

Tunafanya jaribio sawa na faili ya maelezo hapo juu. Hakuna matatizo yaliyopatikana:

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

Config-lint ni mfumo wa kuahidi unaokuruhusu kuunda majaribio yako mwenyewe ili kuthibitisha maonyesho ya Kubernetes YAML kwa kutumia YAML DSL.

Lakini vipi ikiwa unahitaji mantiki ngumu zaidi na vipimo? Je, YAML haina mipaka sana kwa hili? Je, ikiwa unaweza kuunda majaribio katika lugha kamili ya programu?

4. Shaba

Shaba V2 ni mfumo wa kuhalalisha maonyesho kwa kutumia majaribio maalum (sawa na config-lint).

Walakini, inatofautiana na ya mwisho kwa kuwa haitumii YAML kuelezea majaribio. Majaribio yanaweza kuandikwa katika JavaScript badala yake. Copper hutoa maktaba na zana kadhaa za msingi, ambayo hukusaidia kusoma habari kuhusu vitu vya Kubernetes na kuripoti makosa.

Hatua za kufunga Copper zinaweza kupatikana ndani nyaraka rasmi.

2.0.1 ni toleo jipya zaidi la shirika hili wakati wa kuandika makala asili.

Kama config-lint, Copper haina majaribio ya ndani. Hebu tuandike moja. Wacha iangalie kuwa usambazaji hutumia picha za kontena kutoka hazina zinazoaminika kama vile my-company.com.

Unda faili check_image_repo.js na maudhui yafuatayo:

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

Sasa ili kujaribu onyesho letu base-valid.yaml, tumia amri 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

Ni wazi kwamba kwa msaada wa shaba unaweza kufanya vipimo ngumu zaidi - kwa mfano, kuangalia majina ya kikoa katika maonyesho ya Ingress au kukataa pods zinazoendesha katika hali ya upendeleo.

Copper ina kazi mbalimbali za matumizi zilizojengwa ndani yake:

  • DockerImage inasoma faili ya ingizo maalum na kuunda kitu na sifa zifuatazo:
    • name - jina la picha,
    • tag - lebo ya picha,
    • registry - Usajili wa picha,
    • registry_url - itifaki (https://) na usajili wa picha,
    • fqin - eneo kamili la picha.
  • Kazi findByName husaidia kupata rasilimali kwa aina fulani (kind) na jina (name) kutoka kwa faili ya kuingiza.
  • Kazi findByLabels husaidia kupata rasilimali kwa aina maalum (kind) na lebo (labels).

Unaweza kutazama vipengele vyote vya huduma vinavyopatikana hapa.

Kwa chaguo-msingi hupakia faili yote ya ingizo ya YAML katika kigezo $$ na kuifanya ipatikane kwa uandishi (mbinu inayojulikana kwa wale walio na uzoefu wa jQuery).

Faida kuu ya Copper ni dhahiri: hauitaji kufahamu lugha maalum na unaweza kutumia vipengee anuwai vya JavaScript kuunda majaribio yako mwenyewe, kama vile tafsiri ya kamba, kazi, n.k.

Inapaswa pia kuzingatiwa kuwa toleo la sasa la Copper linafanya kazi na toleo la ES5 la injini ya JavaScript, sio ES6.

Maelezo yanapatikana kwa tovuti rasmi ya mradi.

Hata hivyo, ikiwa hupendi JavaScript kabisa na unapendelea lugha iliyoundwa mahususi kwa ajili ya kuunda maswali na kufafanua sera, unapaswa kuzingatia mashindano.

5.Mashindano

Conftest ni mfumo wa kujaribu data ya usanidi. Inafaa pia kwa majaribio/kuthibitisha maonyesho ya Kubernetes. Majaribio yanaelezewa kwa kutumia lugha maalum ya kuuliza Rego.

Unaweza kusakinisha mashindano kwa kutumia maelekezowaliotajwa kwenye tovuti ya mradi.

Wakati wa kuandika makala ya awali, toleo la hivi karibuni lililopatikana lilikuwa 0.18.2.

Sawa na config-lint na shaba, conftest huja bila majaribio yoyote yaliyojumuishwa. Hebu tujaribu na kuandika sera yetu wenyewe. Kama katika mifano iliyopita, tutaangalia ikiwa picha za kontena zimechukuliwa kutoka kwa chanzo kinachoaminika.

Unda saraka conftest-checks, na ndani yake kuna faili inayoitwa check_image_registry.rego na maudhui yafuatayo:

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

Sasa hebu tujaribu base-valid.yaml kupitia 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

Jaribio lilishindikana kwa sababu picha zilitoka kwa chanzo kisichoaminika.

Katika faili ya Rego tunafafanua kizuizi deny. Ukweli wake unachukuliwa kuwa ukiukaji. Ikiwa vitalu deny kadhaa, mashindano huyaangalia kwa kujitegemea, na ukweli wa vitalu vyovyote huchukuliwa kama ukiukaji.

Kando na pato chaguomsingi, conftest inaauni umbizo la JSON, TAP na jedwali - kipengele muhimu sana ikiwa unahitaji kupachika ripoti kwenye bomba la CI lililopo. Unaweza kuweka muundo unaotaka kwa kutumia bendera --output.

Ili kurahisisha utatuzi wa sera, mashindano yana bendera --trace. Inatoa ufuatiliaji wa jinsi conftest inavyochanganua faili za sera zilizobainishwa.

Sera za mashindano zinaweza kuchapishwa na kushirikiwa katika sajili za OCI (Open Container Initiative) kama vizalia vya programu.

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ push ΠΈ pull kukuruhusu kuchapisha vizalia vya programu au kupata vizalia vya programu vilivyopo kutoka kwa sajili ya mbali. Hebu tujaribu kuchapisha sera tuliyounda kwa sajili ya ndani ya Docker kwa kutumia conftest push.

Anzisha Usajili wako wa Docker wa karibu:

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

Katika terminal nyingine, nenda kwenye saraka uliyounda hapo awali conftest-checks na endesha amri ifuatayo:

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

Ikiwa amri ilifanikiwa, utaona ujumbe kama huu:

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

Sasa unda saraka ya muda na uendesha amri ndani yake conftest pull. Itapakua kifurushi kilichoundwa na amri iliyotangulia:

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

Orodha ndogo itaonekana kwenye saraka ya muda policyiliyo na faili yetu ya sera:

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

Majaribio yanaweza kuendeshwa moja kwa moja kutoka kwa hazina:

$ 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

Kwa bahati mbaya, DockerHub bado haijatumika. Kwa hivyo jione mwenye bahati ikiwa unatumia Usajili wa Kontena ya Azure (ACR) au sajili yako mwenyewe.

Umbizo la vizalia vya programu ni sawa na Fungua vifurushi vya Wakala wa Sera (OPA), ambayo hukuruhusu kutumia conftest kuendesha majaribio kutoka kwa vifurushi vilivyopo vya OPA.

Unaweza kupata maelezo zaidi kuhusu kushiriki sera na vipengele vingine vya pambano kwenye tovuti rasmi ya mradi.

6. Polaris

Chombo cha mwisho ambacho kitajadiliwa katika makala hii ni Polaris. (Tangazo lake la mwaka jana sisi tayari imetafsiriwa - takriban. tafsiri)

Polaris inaweza kusakinishwa kwenye nguzo au kutumika katika hali ya mstari wa amri. Kama unavyoweza kukisia, hukuruhusu kuchanganua dhihirisho la Kubernetes.

Unapofanya kazi katika hali ya mstari wa amri, majaribio yaliyojengewa ndani yanapatikana katika maeneo kama vile usalama na mbinu bora (sawa na kube-alama). Kwa kuongeza, unaweza kuunda majaribio yako mwenyewe (kama katika config-lint, shaba na conftest).

Kwa maneno mengine, Polaris inachanganya manufaa ya aina zote mbili za zana: na majaribio yaliyojumuishwa na maalum.

Ili kufunga Polaris katika hali ya mstari wa amri, tumia maagizo kwenye tovuti ya mradi.

Wakati wa kuandika makala ya awali, toleo la 1.0.3 linapatikana.

Usakinishaji ukishakamilika unaweza kuendesha polaris kwenye faili ya maelezo base-valid.yaml na amri ifuatayo:

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

Itatoa mfuatano katika umbizo la JSON na maelezo ya kina ya majaribio yaliyofanywa na matokeo yake. Pato litakuwa na muundo ufuatao:

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

Toleo kamili linapatikana hapa.

Kama vile kube-alama, Polaris hubainisha masuala katika maeneo ambayo faili ya maelezo haifikii mbinu bora:

  • Hakuna ukaguzi wa afya kwa maganda.
  • Lebo za picha za kontena hazijabainishwa.
  • Chombo kinaendesha kama mzizi.
  • Maombi na mipaka ya kumbukumbu na CPU haijabainishwa.

Kila mtihani, kulingana na matokeo yake, hupewa kiwango cha uhakiki: onyo au hatari. Ili kupata maelezo zaidi kuhusu majaribio yaliyojumuishwa ndani, tafadhali rejelea nyaraka.

Ikiwa maelezo hayahitajiki, unaweza kutaja bendera --format score. Katika kesi hii, Polaris itatoa nambari kutoka 1 hadi 100 - alama (yaani tathmini):

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

Kadiri alama inavyokaribia 100, ndivyo kiwango cha makubaliano kinavyoongezeka. Ukiangalia nambari ya kutoka ya amri polaris audit, inageuka kuwa ni sawa na 0.

Nguvu polaris audit Unaweza kusitisha kazi na nambari isiyo ya sifuri kwa kutumia bendera mbili:

  • Bendera --set-exit-code-below-score inachukua kama hoja thamani ya kiwango cha juu katika safu 1-100. Katika kesi hii, amri itatoka na nambari ya kutoka 4 ikiwa alama iko chini ya kizingiti. Hii ni muhimu sana unapokuwa na thamani fulani ya kizingiti (sema 75) na unahitaji kupokea arifa ikiwa alama itapungua.
  • Bendera --set-exit-code-on-danger itasababisha amri kushindwa na nambari 3 ikiwa moja ya majaribio ya hatari itashindwa.

Sasa hebu tujaribu kuunda jaribio maalum ambalo hukagua ikiwa picha imechukuliwa kutoka kwa hazina inayoaminika. Majaribio maalum yamebainishwa katika umbizo la YAML, na jaribio lenyewe linaelezwa kwa kutumia JSON Schema.

Kijisehemu kifuatacho cha msimbo wa YAML kinafafanua jaribio jipya linaloitwa 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/.+$

Wacha tuiangalie kwa karibu:

  • successMessage - mstari huu utachapishwa ikiwa mtihani utakamilika kwa ufanisi;
  • failureMessage - ujumbe huu utaonyeshwa katika kesi ya kushindwa;
  • category - inaonyesha moja ya kategoria: Images, Health Checks, Security, Networking ΠΈ Resources;
  • target--- huamua ni aina gani ya kitu (spec) mtihani unatumika. Thamani zinazowezekana: Container, Pod au Controller;
  • Jaribio lenyewe limebainishwa kwenye kitu schema kwa kutumia schema ya JSON. Neno kuu katika mtihani huu ni pattern kutumika kulinganisha chanzo cha picha na kinachohitajika.

Ili kutekeleza jaribio lililo hapo juu, unahitaji kuunda usanidi ufuatao wa 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)

Wacha tuchanganue faili:

  • katika uwanja checks vipimo na kiwango cha uhakiki wao huwekwa. Kwa kuwa ni muhimu kupokea onyo wakati picha inachukuliwa kutoka kwa chanzo kisichoaminika, tunaweka kiwango hapa danger.
  • Mtihani wenyewe checkImageRepo kisha kusajiliwa katika kitu customChecks.

Hifadhi faili kama custom_check.yaml. Sasa unaweza kukimbia polaris audit na faili ya maelezo ya YAML ambayo inahitaji uthibitishaji.

Hebu tujaribu ilani yetu base-valid.yaml:

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

Timu polaris audit iliendesha tu jaribio la mtumiaji lililoainishwa hapo juu na haikufaulu.

Ukirekebisha picha kwa my-company.com/http-echo:1.0, Polaris itakamilika kwa mafanikio. Ilani iliyo na mabadiliko tayari iko hazinakwa hivyo unaweza kuangalia amri iliyotangulia kwenye onyesho image-valid-mycompany.yaml.

Sasa swali linatokea: jinsi ya kufanya majaribio yaliyojengwa ndani pamoja na yale maalum? Kwa urahisi! Unahitaji tu kuongeza vitambulisho vya majaribio vilivyojengwa kwenye faili ya usanidi. Kama matokeo, itachukua fomu ifuatayo:

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)

Mfano wa faili kamili ya usanidi inapatikana hapa.

Angalia faili ya maelezo base-valid.yamlkwa kutumia vipimo vilivyojengwa ndani na maalum, unaweza kutumia amri:

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

Polaris inakamilisha majaribio yaliyojumuishwa na yale maalum, na hivyo kuchanganya bora zaidi ya ulimwengu wote.

Kwa upande mwingine, kutoweza kutumia lugha zenye nguvu zaidi kama vile Rego au JavaScript kunaweza kuwa kikwazo kinachozuia uundaji wa majaribio ya kisasa zaidi.

Habari zaidi kuhusu Polaris inapatikana kwa tovuti ya mradi.

Muhtasari

Ingawa kuna zana nyingi zinazopatikana za kukagua na kutathmini faili za Kubernetes YAML, ni muhimu kuwa na ufahamu wazi wa jinsi majaribio yatakavyoundwa na kutekelezwa.

Kwa mfano, ukichukua maonyesho ya Kubernetes kupitia bomba, kubeval inaweza kuwa hatua ya kwanza katika bomba kama hilo. Ingefuatilia ikiwa ufafanuzi wa kitu unalingana na schema ya Kubernetes API.

Mara tu ukaguzi kama huu utakapokamilika, mtu anaweza kuendelea na majaribio ya kisasa zaidi, kama vile kufuata kanuni bora za kawaida na sera mahususi. Hapa ndipo kube-alama na Polaris zingefaa.

Kwa wale ambao wana mahitaji magumu na wanahitaji kubinafsisha majaribio kwa undani, shaba, laini ya usanidi na mashindano yangefaa..

Conftest na config-lint hutumia YAML kufafanua majaribio maalum, na shaba hukupa ufikiaji wa lugha kamili ya programu, na kuifanya kuwa chaguo la kuvutia.

Kwa upande mwingine, ni thamani ya kutumia moja ya zana hizi na, kwa hiyo, kuunda vipimo vyote kwa mikono, au kupendelea Polaris na kuongeza tu kile kinachohitajika kwake? Hakuna jibu wazi kwa swali hili.

Jedwali hapa chini linatoa maelezo mafupi ya kila chombo:

Chombo
Kusudi
Mapungufu
Vipimo vya mtumiaji

kubeval
Huthibitisha YAML inajidhihirisha dhidi ya toleo mahususi la taratibu za API
Haiwezi kufanya kazi na CRD
Hakuna

kube-alama
Huchanganua udhihirisho wa YAML dhidi ya mbinu bora
Haiwezi kuchagua toleo lako la Kubernetes API ili kuangalia nyenzo
Hakuna

shaba
Mfumo wa jumla wa kuunda majaribio maalum ya JavaScript ya maonyesho ya YAML
Hakuna majaribio yaliyojumuishwa. Nyaraka mbovu
Π”Π°

config-lint
Mfumo wa jumla wa kuunda majaribio katika lugha mahususi ya kikoa iliyopachikwa katika YAML. Inaauni miundo mbalimbali ya usanidi (k.m. Terraform)
Hakuna vipimo vilivyotengenezwa tayari. Madai na utendakazi uliojengewa ndani huenda zisitoshe
Π”Π°

pambano
Mfumo wa kuunda majaribio yako mwenyewe kwa kutumia Rego (lugha maalum ya kuuliza). Inaruhusu kushiriki sera kupitia vifurushi vya OCI
Hakuna majaribio yaliyojumuishwa. Lazima nijifunze Rego. Docker Hub haitumiki wakati wa kuchapisha sera
Π”Π°

Polaris
Ukaguzi wa YAML unaonyesha dhidi ya mbinu bora za kawaida. Hukuruhusu kuunda majaribio yako mwenyewe kwa kutumia JSON Schema
Uwezo wa kujaribu kulingana na Schema ya JSON unaweza kuwa hautoshi
Π”Π°

Kwa sababu zana hizi hazitegemei ufikiaji wa nguzo ya Kubernetes, ni rahisi kusakinisha. Wanakuruhusu kuchuja faili za chanzo na kutoa maoni ya haraka kwa waandishi wa maombi ya kuvuta katika miradi.

PS kutoka kwa mtafsiri

Soma pia kwenye blogi yetu:

Chanzo: mapenzi.com

Kuongeza maoni