Validate Kubernetes YAML contra optima exercitia et consilia
Nota. transl.Crescente numero YAML configurationum pro K8s ambitibus, necessitas confirmationis automated magis ac magis urget. Auctor huius recensionis non solum solutiones huius operis exsistentes delegit, sed etiam spectavit quomodo instruere ut exemplo operantur. Versa est valde informativus pro iis qui in hoc argumento intersunt.
TL, DR: Hic articulus sex instrumenta static confert ad convalidandum et aestimandum Kubernetes YAML lima contra optimos usus et requisita.
In laboribus Kubernetes de more in documentorum YAML forma definiuntur. Una quaestionum cum YAML difficultas est definiendi angustias seu relationes inter tabellas manifestas.
Quid si opus est efficere ut omnes imagines ad botrum expositae ex fideli registro proveniant?
Quomodo possum impedire Instructiones quae PodDisruptionBudgets non habent, quominus ad botrum mittantur?
Integratio statice temptationis te permittit ut errores cognoscas ac violationes consilii in evolutione. Hoc fideiussorem auget definitiones subsidiorum rectas et securas esse, eoque magis verisimile est productionem operum quam optimos usus sequentur.
Inspectio ecosystem lima Kubernetes static YAML in sequentia categoria dividi potest:
API validators. Instrumenta in hac categoria reprimunt YAML manifesta contra exigentias Kubernetarum API servo.
Promptus testers. Instrumenta ex hoc genere veniunt cum probatis probatis ad securitatem, obsequium cum optimis exercitiis, etc.
Custom validators. Repraesentatores huius categoriae permittunt te probata consuetudine variis linguis creare, exempli gratia, Rego et Javascript.
In hoc articulo sex instrumenta diversa describemus et comparabimus;
kubeval;
kube-score;
config-lint;
aeris;
conftest;
polaris.
Bene, incipias!
Reprehendo Deployments
Priusquam incipiamus instrumenta comparare, aliquod subiectum faciamus quo ea experiamur.
De manifesto infra, plures errores continet et non-obsequium optimarum consuetudinum: quot reperire potes?
Quod supra manifesto base-valid.yaml et alios manifestos ex hoc articulo inveniri posse git repositoria.
Manifestum applicationem interretialem describit cuius praecipuum munus est respondere nuntio "Salve Mundi" ad portum 5678. Explicari potest cum sequenti mandato:
kubectl apply -f hello-world.yaml
Atque ita - reprime opus;
kubectl port-forward svc/http-echo 8080:5678
Nunc ad http://localhost:8080 confirmamusque applicatione laborat. Sed numquid sequitur optimas consuetudines? Sit scriptor reprehendo.
1. Kubeval
In corde kubeval Idea est, quodlibet commercium cum Kubernetes evenire per quietem API suam. Aliis verbis uti potes schemate API ad inspiciendum an datum YAML ei conforme sit. Intueamur exemplum.
Institutiones kubeval praesto sunt in website project.
In tempore scribendi articulum originale, versio 0.15.0 praesto erat.
Semel inauguratus, illud manifestum supra pascamus;
$ kubeval base-valid.yaml
PASS - base-valid.yaml contains a valid Deployment (http-echo)
PASS - base-valid.yaml contains a valid Service (http-echo)
Si felix, kubeval exit cum codice exitus 0. Potes reprehendo hoc modo:
$ 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
Subsidium non verificatur.
API versionem instruere utens apps/v1electrix includere debet cum pittacio folliculi. Manifestum superius electrix non includit, sic errorem kubeval retulit et cum codice non-nulla exiit.
Miror quid fiet si facio kubectl apply -f cum hoc manifesto?
Age, conemur:
$ 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
Hic est prorsus error quem kubeval de eo monuit. Illud figere potes addendo electo:
Utilitas instrumentorum ad modum kubeval est quod errores horum similes primo in cyclo instruere possunt.
Haec impedimenta praeterea ad botrum accessum non requirunt, offline peragi possunt.
Defalta kubeval facultates contra schema novissimum Kubernetes API coercet. Sed in pluribus casibus necesse est ut contra certum Kubernetes emissio reprimatur. Hoc fieri potest utens vexillum --kubernetes-version:
Quaeso note quod versio specificari debet in forma Major.Minor.Patch.
Ad indicem versionum pro quibus verificationis sustentatur, placere ad JSON schema de GitHubquae kubeval ad sanationem utitur. Si opus est ad kubeval offline currere, schemas depone et eorum localem locum denota utens vexillum --schema-location.
Praeter singulas tabulas YAML, kubeval etiam cum directoriis et stdin operari potest.
Praeterea Kubeval facile in pipelinum CI integrat. Qui volentes probationes currere antequam manifestationes ad botrum mittant, scire laetabitur tria formarum outputarum subsidia kubeval;
Clarae verbae;
JSON;
Test Quidquid Protocollum (TAP).
Et quaevis formarum adhiberi potest ad ulteriorem partem extrahendi ad generandum summam eventus optati generis.
Una ex incommodis kubevalis est quod currently non potest pro obsequio Custom Resource Definitions (CRDs). Sed configurari potest kubeval ignorare eos.
Kubeval instrumentum magnum est ad facultates reprimendas et aestimandas; Attamen animadvertendum est transitum experimentum non spondere subsidia melioribus exercitiis obtemperare.
For example, using the tag latest in vase non sequitur optimas consuetudines. Sed hunc errorem kubeval non considerat et eum non indicat. Hoc est, probatio talis YAML sine admonitione complebit.
Sed quid si vis YAML aestimare et violationes agnoscere ut tag latest? Quomodo fasciculum YAML inspicio contra optimas consuetudines?
2. Kube-score
Kube-score parses YAML manifestat et expendit contra -in probat. Hae probationes eliguntur secundum normas securitatis et optimas consuetudines, ut sunt:
Continens currit ut user non-radix.
Vasculi dispositio compescit.
Petitiones finesque constituendi pro opibus.
Ex probatis eventibus, tres eventus dantur: OK, DICTIO ΠΈ SUMMUS.
Potes experiri Kube-score online vel locum instituere.
In tempore scribendi articulum originale, novissima versio kube-score erat 1.7.0.
Experiamur nobis manifesto 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 transit kubeval probationes, dum kube-score puncta ad sequentia vitia;
Promptus checks non felis.
Nullae petitiones seu limites pro opibus et memoria CPU sunt.
Vasculum discidium rationes non specificatae sunt.
Nullae regulae separationis (anti-affinitatem) ut maximize disponibilitate.
Continens radicem decurrit.
Haec omnia valida sunt puncta de defectibus quae scribenda sunt ut instruere efficaciora et certiora faciant.
bigas kube-score prae-readable informationes in humana forma comprehendo omnes generis violationes DICTIO ΠΈ SUMMUSqui multum adiuvat in progressu.
Volentes hoc instrumento uti intra CI pipelino, possunt magis compresso output uti vexillum --output-format ci (hoc in casu, probationes cum effectu monstrantur" 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
Similia cum kubeval, kube-score redit codicem non-nullam exitus cum test qui deficit SUMMUS. Possis etiam processus similes ad enable DICTIO.
Insuper subsidia ad obsequium cum diversis API versionibus (ut in kubeval) reprimere potest. Nihilominus haec notitia in ipso kube-score duratur: non potes aliam versionem Kubernetarum eligere. Circumscriptio haec magna quaestio esse potest si uvam tuam upgrade vel si plures ligaturas habes cum uaria K8s versione.
Kube-score probata sunt magnum instrumentum ad optimas artes exsequendas, sed quid si opus est mutationes probare vel regulas tuas addere? Heu, hoc fieri non potest.
Kube-score non est extensibilis: rationes ei addere vel aptare non potes.
Si consuetudo scribendi opus est ut probationes ad comprobandum obsequium societatis machinarum, uno ex his quattuor instrumentis uti potes: config-linteo, cupro, conftest, vel polaris.
3.Config-linteo
Mando-linteum instrumentum est ad confirmandas YAML, JSON, Terraformes, CSV imaginum conformationis et Kubernetes manifestat.
Vos can install is utens instructiones in project website.
Hodierna emissio sicut temporis scripturae originalis est 1.5.0.
Mando linteolum non aedificavit in probationibus ad manifestationes Kubernetes confirmandas.
Ad probationes quaslibet peragendas, aptas normas creare debes. Ea scripta sunt in fasciculis YAML quae "praecepta" vocantur. (praecepta)atque hanc structuram;
agri type specificat quod genus configurationis config-lineatum utetur. Nam K8s hoc manifestat semperKubernetes.
In agro files Praeter ipsas tabulas, directorium specificare potes.
agri rules intendebat ad occasum user probat.
Dicamus vis efficere ut imagines in instruere semper ex receptaculo fideli tanquam my-company.com/myapp:1.0. Regulae config-linitae quae talem perscriptio efficiens hoc spectarent:
- 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)
Utraque regula debet habere sequentia attributa;
id β unica identificatrix regulae;
severity - Sit be DEFECTUS, DICTIO ΠΈ NON_COMPLIANT;
message β si regula violatur, quae in hoc versu exhibentur;
resource - genus subsidii ad quod hoc pertinet;
assertions β elenchus conditionum quae respectu huius subsidii aestimandae erunt.
In regula supra assertion nomine every checks omnia vasa in instruere (key: spec.templates.spec.containers) Usus imaginum creditarum (i.e. incipiens cum my-company.com/).
Mando-linteolum promissum est compages quae permittit te creare probationes tuas ad firmandum Kubernetes YAML manifestat utens YAML DSL.
Sed quid, si logica multiplicior indiget et probat? Nonne YAML nimis limitatur ad hoc? Quid si probationes plenae programmationis sermone creare possis?
4. lamina cuprea
Aeris V2 compages est ad manifestat probandas consuetudines utens probat (similis est config-linte).
Sed hoc differt ab hoc quod probat describere YAML non uti. Probat in JavaScript pro potest scribi. Aeris bibliothecam praebet cum pluribus instrumentis fundamentalibusquam adiuvant informationes de rebus Kubernetes et errores referunt.
2.0.1 Est postrema emissio huius utilitatis in articulo scripto originali.
Sicut linteum config, Cuprum in probat non aedificavit. Scribamus unum. Inhibeat instruere imagines continens imagines solum ex repositoriis creditis uti my-company.com.
Creare lima check_image_repo.js cum sequenti contenti:
$$.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)
}
});
}
});
Nunc probare nostram manifestam base-valid.yamlutere imperio 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
Patet ope aeris incomplexas probationes facere potes - exempli gratia, nomina domain in Ingress retentando manifestat vel respuens siliquas in modum privilegiatum decurrentes.
Cuprum varias utilitates in ea aedificatas habet;
DockerImage praefinitum input file legit et facit rem cum his attributis;
name β nomen imaginis;
tag - image tag;
registry - Subcriptio imaginum;
registry_url - protocol (https://) et subcriptio imagini;
fqin β plenum situm imaginis.
munus findByName adjuvat ut a resource datum genus (kind) et nomen (name) Ex initus lima.
munus findByLabels adjuvat invenire resource per certum genus (kind) Et pittacia (labels).
Per defaltam fasciculum initus YAML totam in variabilem onerat $$ and makes it available for scripting.
Praecipua utilitas Copperis patet: lingua specializata vincere non debes et variis JavaScript notis uti potes ad probationes tuas creandas, ut chorda, interpolationem, functiones, etc.
Animadvertendum etiam est, versionem Coppericam hodiernam cum ES5 versione machinalis JavaScript, non ES6 facere.
Attamen, si re vera JavaScript et mavis linguam designatam ad quaerendas creandas et consilia describendas, operam dare debes ut certas.
5.Conftest
Certamen est compage probandi configurationem datam. Apta etiam ad probandum/probandum Kubernetes manifestat. Expertus describitur per interrogationem specialem linguarum Rego.
Vos can install utens conftest instructionesinscripti in website project.
In tempore scribendi articulum originale, versio novissima praesto fuit 0.18.2.
Similia linteolo et cupro, conftest sine ullo constructo-in experimentis. Experiamur eam et nostro consilio scribemus. Ut in exemplis praecedentibus, reprehendo an imagines continens certo fonte sumantur.
Creare Directory conftest-checkset in eo est fasciculus nominatus check_image_registry.rego cum sequenti contenti:
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])
}
Nunc lets test base-valid.yaml per 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
Expertus praevidens defecit quia imagines ex fonte infideli orti sunt.
In Rego lima definimus scandalum deny. Eius veritas violatio consideratur. Si caudices deny plures, eas independenter a se cohibet, ac verum quodvis caudices violatur.
Praeter defaltam output, confirmas JSON, TAP et tabulae formas - perquam utile, si relationes in CI pipeline existente embedas debes. Vos can posuit in forma desideravit utens vexillum --output.
Ut facilius consilia debug, conftest habet vexillum --trace. Vestigium emittit quam conftest parses certarum imaginum designatarum.
Certamina consilia publicari et communicari possunt in registris OCI (Open Container Initiative) sicut artificiata.
imperium push ΠΈ pull permittam ut artificium edas vel artificium exsistentem reciperare e registro remoto. Experiamur publicare consilium quod creavimus locali Docker subcriptio utens conftest push.
Satus vestri locus Docker subcriptio:
$ docker run -it --rm -p 5000:5000 registry
In alio termino, vade ad indicem quod antea creatum est conftest-checks et percurre mandatum hoc;
Ultimum instrumentum quod in hoc articulo disputatum est Polaris. (His ultimo anno denuntiatio sumus iam translata - proxime. translation)
Polaris in botro institui potest vel in linea imperandi modus adhibendus. Cum coniecturam facere licet, permittit ut Kubernetes manifestat stabiliter resolvere.
Cum modus lineae imperandi currit, aedificatae in probationibus praesto sunt areas operimentorum sicut securitas et optima exercitia (similis cum kube-score). Praeterea experimenta tua creare potes (sicut in config-linteto, cupro et conftest).
Id est, Polaris utilitates utriusque instrumentorum genera componit: cum probatis constructis et consuetudinibus.
Sicut kube-score, Polaris quaestiones in locis agnoscit ubi manifesta non occurrit optimas praxis;
Nulla valitudinis siliquas compescit.
Tags pro continens imagines non specificatae sunt.
Continens radicem decurrit.
Petitiones et limites memoriae ac CPU non specificatae sunt.
Unicuique probatio, secundum eventum suum, gradus criticae assignatur; monitum aut periculum. Ut plura discas de promptu aedificato in probat, placere ad documentum.
Si singula non sunt necessaria, signum vexillum specificare potes --format score. Hoc in casu, Polaris numerum vndique ab 1 ad 100 outputabit Score (i.e. censum);
Quo propius accessus est ad 100, eo pacto superior gradus est. Si quaeras ad imperium codice exitus polaris auditevenit ut = 0 .
Force polaris audit Opus finire potes cum codice non-nulla utens duobus vexillis;
vexillum --set-exit-code-below-score argumentum sumit valorem liminis in latitudine 1-100. Hoc in casu, mandatum exit cum codice 4 exit si score sub limine est. Hoc valde utile est cum certum limen habes (dic 75) et opus est ut acris recipias si infra ustulo accedit.
vexillum --set-exit-code-on-danger deficiet mandatum cum codice 3 si unus de periculo probationes deficiat.
Nunc conemur creare consuetudinem testam quae impedit an imago e repositorio credito sumatur. Consuetudines probationes in YAML forma specificatae sunt, ipsa probatio usus JSON Schema describitur.
Hoc codice YAML PRAECISIO describitur novum test vocavit 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/.+$
Propius illud inspice:
successMessage β Haec linea imprimetur, si probatio feliciter compleatur;
failureMessage β Haec epistula ostendetur in casu defectui;
category - unum genera indicat: Images, Health Checks, Security, Networking ΠΈ Resources;
target--- decernit quod genus obiecti (spec) Test applicatur. Valores possibilis: Container, Pod aut Controller;
Ipsa probatio specificatur in obiecto schema schema utens JSON. Verbum clavem in hoc test est pattern usus est ad imaginem fontis cum inquisita comparare.
Ad superius examen currendum, debes conformationem sequentem Polaris creare;
In agro checks probationes eorumque gradus criticae praescribuntur. Expedit quippe monitionem recipere, cum imago ex infideli fonte desumpta, planum hic statuimus danger.
Ipsum test checkImageRepo tum relatus in obiecto customChecks.
Servo lima ut custom_check.yaml. Nunc currere potes polaris audit manifesta cum YAML verificationem requirit.
bigas polaris audit currentes tantum usoris test supra scripti et defecerunt.
Si figere imaginem to my-company.com/http-echo:1.0, Polaris perficiet feliciter. Manifesto cum mutationes iam in repositoriapotes in manifesto praecedente mandato image-valid-mycompany.yaml.
Nunc quaestio oritur: quomodo curritur in probationibus cum consuetudinibus? Facile! Vos iustus postulo ut constructum-in test identificantibus limam configurationis addere. Quam ob rem accipiet haec forma;
Polaris complementum constructum in probationibus cum consuetudinibus, optima utriusque mundi coniungens.
Ex altera parte, impossibilitas linguarum potentiorum utendi sicut Rego vel JavaScript potest esse factor limitandi impediens creatio magis urbanus probat.
Cum multa instrumenta praesto sint inspiciendi et aestimandi lima Kubernetes YAML, magni momenti est habere lucide intellectum quomodo probationes designentur et efficiantur.
Eg si Kubernetes manifestas per pipelinum accipias, primus gradus in tali pipelino esse potuit kubeval. Monere debet an definitiones obiecti Kubernetes API schema conforment.
Postquam talis recensio peracta est, ad probationes magis urbanas procedere potest, ut obsequium cum norma optimarum ritum et certarum rerum. Hoc est ubi kube-score et Polaris in manus venturi sunt.
Ad eos qui incomplexa exigentias et necessitates habent in specialibus probationibus, aeris, config-lintecti et conftest, opportunum fore..
Certamen et linteolum config-lineatum usui YAML definiendi morem probat, et aeris accessum ad plenam programmandi linguam dat, eamque pulchram electionem amabilem reddens.
Contra, valetne uti uno ex his instrumentis et ideo omnia tentamenta manualia condere, vel Polaris praeferre et tantum addere quae ad hoc opus sunt? Patet huic quaestioni responsum non est.
Mensa infra breviter uniuscuiusque instrumenti descriptionem praebet:
tool
fatum
defectuum oeconomicorum
User probat
kubeval
Validat YAML manifestat contra certam versionem API schema
Non opus CRD
No
kube-score
Analyses YAML manifestat in optima exercitia
Kubernetes API versionem tuam eligere non potest ut reprehendo resources
No
aeris
Communis compages creandi consuetudo JavaScript probat pro YAML manifests
Nulla in efficitur volutpat. Pauper documenta
Yes
aboutconfig-linte
Communis compages ad probationes creandas in lingua speciali domain in YAML infixa est. Varias formas conformationis adiuvat (v.g. Terraform)
Nulla efficitur volutpat nulla. Assertiones et functiones inaedificata non esse satis
Yes
conftest
A compage ad creandas proprias probationes utens Rego (lingua propria quaesita). Permittit communicatio consilia per OCI bundles
Nulla in efficitur volutpat. Discendum regoum habeo. Docker Hub non valet, cum editae policies
Yes
Polaris
Recognitiones YAML contra regulam optimas observationes manifestat. Permittit ut creare tua probat utens JSON Schema
Test capacitates ex JSON Schema non sufficiunt
Yes
Quia haec instrumenta accessu ad botrum Kubernetes non nituntur, facilia sunt ad institutionem. Permittunt te ut lima fons eliquare et celeris feedback auctoribus in inceptis trahere petitiones praebere.