ProHoster > blog > Utawala > Thibitisha Kubernetes YAML dhidi ya mbinu na sera bora
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.
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:
kubeval;
kube-alama;
config-lint;
shaba;
mashindano;
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?
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.
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:
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:
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:
Nakala wazi;
JSON;
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:
Shamba type inabainisha ni aina gani ya usanidi wa usanidi utatumia. Kwa K8s hudhihirisha hii ni daimaKubernetes.
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/"
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/).
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.
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:
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.
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):
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:
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.
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:
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.