Nodyn. traws.Gyda'r nifer cynyddol o gyfluniadau YAML ar gyfer amgylcheddau K8s, mae'r angen am ddilysu awtomataidd yn dod yn fwyfwy brys. Nid yn unig y dewisodd awdur yr adolygiad hwn atebion presennol ar gyfer y dasg hon ond archwiliodd hefyd sut maen nhw'n gweithio gan ddefnyddio'r enghraifft Deployment. Mae'r canlyniad yn addysgiadol iawn i'r rhai sydd â diddordeb yn y pwnc hwn.

TL; DRMae'r erthygl hon yn cymharu chwe offeryn statig ar gyfer dilysu ac asesu ffeiliau YAML Kubernetes yn erbyn arferion gorau a gofynion.
Fel arfer, diffinnir llwythi gwaith Kubernetes fel dogfennau YAML. Un o'r heriau gyda YAML yw'r anhawster o ddiffinio cyfyngiadau neu berthnasoedd rhwng ffeiliau maniffest.
Beth os oes angen i ni sicrhau bod yr holl ddelweddau a ddefnyddir yn y clwstwr yn dod o gofrestrfa ddibynadwy?
Sut alla i atal Defnyddiadau nad oes ganddynt PodDisruptionBudgets wedi'u gosod rhag cael eu hanfon i'r clwstwr?
Mae integreiddio profion statig yn caniatáu canfod gwallau a thorri polisïau yn gynnar yn y broses ddatblygu. Mae hyn yn cynyddu'r sicrwydd o gywirdeb a diogelwch diffiniadau adnoddau ac yn gwella'r tebygolrwydd y bydd llwythi gwaith cynhyrchu yn cadw at arferion gorau.
Gellir rhannu ecosystem dilysu statig Kubernetes YAML i'r categorïau canlynol:
- Dilyswyr APIMae offer yn y categori hwn yn dilysu maniffest YAML yn erbyn gofynion gweinydd API Kubernetes.
- Profwyr parodDaw offer yn y categori hwn gyda phrofion parod ar gyfer diogelwch, cydymffurfio ag arferion gorau, ac ati.
- Dilyswyr personolMae cynrychiolwyr y categori hwn yn caniatáu ichi greu profion personol mewn amrywiol ieithoedd, fel Rego a JavaScript.
Yn yr erthygl hon, byddwn yn disgrifio ac yn cymharu chwe offeryn gwahanol:
- ciwbaidd;
- sgôr-ciwb;
- ffurfweddu-lint;
- copr;
- cystadleuaeth;
- polaris.
Wel, gadewch i ni ddechrau!
Gwirio Defnyddiadau
Cyn i ni ddechrau cymharu'r offer, gadewch i ni greu rhywfaint o sail i'w profi.
Mae'r maniffesto isod yn cynnwys nifer o wallau ac anghysondebau ag arferion gorau: faint ohonyn nhw allwch chi ddod o hyd iddyn nhw?
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)
Byddwn yn defnyddio'r YAML hwn i gymharu gwahanol offer.
Y maniffesto uchod
base-valid.yamla gellir dod o hyd i faniffestos eraill o'r erthygl hon yn .
Mae'r maniffest yn disgrifio cymhwysiad gwe y mae ei brif bwrpas yn ymateb gyda neges "Helo Byd" ar borthladd 5678. Gellir ei ddefnyddio gyda'r gorchymyn canlynol:
kubectl apply -f hello-world.yaml
Ac felly, gwiriwch y gwaith:
kubectl port-forward svc/http-echo 8080:5678
Nawr ewch i a chadarnhau bod yr ap yn gweithio. Ond a yw'n dilyn arferion gorau? Gadewch i ni wirio.
1. Kubeval
Wrth galon Y syniad yw bod pob rhyngweithio â Kubernetes yn digwydd trwy ei REST API. Mewn geiriau eraill, gallwch ddefnyddio'r cynllun API i wirio a yw YAML penodol yn cyfateb iddo. Gadewch i ni edrych ar enghraifft.
Mae kubeval ar gael ar wefan y prosiect.
Ar adeg ysgrifennu'r erthygl wreiddiol, roedd fersiwn 0.15.0 ar gael.
Ar ôl ei osod, gadewch i ni ei fwydo'r maniffest a roddir uchod:
$ kubeval base-valid.yaml
PASS - base-valid.yaml contains a valid Deployment (http-echo)
PASS - base-valid.yaml contains a valid Service (http-echo)
Os bydd yn llwyddiannus, bydd kubeval yn ymadael gyda chod ymadael o 0. Gallwch wirio hyn fel a ganlyn:
$ echo $?
0
Gadewch i ni nawr roi cynnig ar kubeval gyda maniffest gwahanol:
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)
Allwch chi weld y broblem? Gadewch i ni redeg:
$ 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
Nid yw'r adnodd yn pasio'r dilysu.
Defnyddio'r fersiwn API apps/v1, rhaid iddo gynnwys dewiswr sy'n cyfateb i label y pod. Nid yw'r maniffesto uchod yn cynnwys dewiswr, felly adroddodd kubeval am wall ac ymadawodd gyda chod nad oedd yn sero.
Tybed beth fydd yn digwydd os gwnaf kubectl apply -f gyda'r maniffesto hwn?
Wel, gadewch i ni roi cynnig arni:
$ 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
Dyma'n union y gwall y rhybuddiodd kubeval amdano. Gellir ei drwsio trwy ychwanegu dewiswr:
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)
Mantais offer fel kubeval yw y gellir canfod gwallau o'r fath yn gynnar yn y cylch defnyddio.
Ar ben hynny, nid oes angen mynediad i'r clwstwr ar gyfer y gwiriadau hyn: gellir eu cynnal all-lein.
Yn ddiofyn, mae kubeval yn gwirio adnoddau yn erbyn y cynllun API Kubernetes diweddaraf. Fodd bynnag, yn y rhan fwyaf o achosion, efallai y bydd angen i chi wirio cydymffurfiaeth â rhyddhad Kubernetes penodol. Gellir gwneud hyn gan ddefnyddio'r faner --kubernetes-version:
$ kubeval --kubernetes-version 1.16.1 base-valid.yaml
Noder bod rhaid nodi'r fersiwn yn y fformat Major.Minor.Patch.
I weld rhestr o fersiynau a gefnogir i'w gwirio, cyfeiriwch at , y mae kubeval yn ei ddefnyddio ar gyfer dilysu. Os oes angen i chi redeg kubeval all-lein, lawrlwythwch y cynlluniau a nodwch eu lleoliad lleol gan ddefnyddio'r faner --schema-location.
Yn ogystal â ffeiliau YAML unigol, gall kubeval hefyd weithio gyda chyfeiriaduron a stdin.
Yn ogystal, mae Kubeval yn integreiddio'n hawdd i biblinell CI. Bydd y rhai sydd eisiau cynnal profion cyn anfon maniffestau i'r clwstwr yn falch o wybod bod kubeval yn cefnogi tri fformat allbwn:
- Testun plaen;
- JSON;
- Protocol Profi Unrhyw Beth (TAP).
A gellir defnyddio unrhyw un o'r fformatau ar gyfer dadansoddi'r allbwn ymhellach i gynhyrchu crynodeb o'r canlyniadau yn y ffurf a ddymunir.
Un o anfanteision kubeval yw na all wirio cydymffurfiaeth â Diffiniadau Adnoddau Personol (CRDs) ar hyn o bryd. Fodd bynnag, gallwch chi ffurfweddu kubeval .
Mae Kubeval yn offeryn rhagorol ar gyfer profi a gwerthuso adnoddau; fodd bynnag, dylid pwysleisio nad yw pasio'r prawf yn gwarantu bod yr adnodd yn cydymffurfio ag arferion gorau.
Er enghraifft, gan ddefnyddio'r tag latest Nid yw'r cynhwysydd yn cydymffurfio ag arferion gorau. Fodd bynnag, nid yw kubeval yn ystyried hyn yn wall ac nid yw'n ei adrodd. Mae hyn yn golygu y bydd dilysu YAML o'r fath yn cael ei gwblhau heb rybuddion.
Ond beth os ydych chi eisiau gwerthuso YAML a chanfod troseddau fel y tag latestSut ydw i'n dilysu ffeil YAML yn erbyn arferion gorau?
2. Sgôr Kube
Yn dadansoddi maniffestau YAML ac yn eu gwerthuso yn erbyn profion mewnol. Dewisir y profion hyn yn seiliedig ar argymhellion diogelwch ac arferion gorau, megis:
- Rhedeg cynhwysydd heb ganiatâd gwraidd.
- Argaeledd gwiriadau iechyd pod.
- Gosod ceisiadau a therfynau adnoddau.
Yn seiliedig ar ganlyniadau'r profion, cyhoeddir tri chanlyniad: OK, RHYBUDD и CRITIGOL.
Gellir rhoi cynnig ar Kube-score ar-lein neu ei osod yn lleol.
Ar adeg ysgrifennu, fersiwn ddiweddaraf kube-score oedd 1.7.0.
Gadewch i ni roi cynnig arni ar ein maniffesto 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.
Mae YAML yn pasio gwiriadau kubeval, tra bod kube-score yn tynnu sylw at y diffygion canlynol:
- Nid yw gwiriadau parodrwydd wedi'u ffurfweddu.
- Nid oes unrhyw geisiadau na therfynau ar adnoddau CPU a chof.
- Cyllidebau tarfu ar gyfer podiau heb eu gosod.
- Nid oes unrhyw reolau ar gyfer bodolaeth ar wahân (gwrth-affinedd) i wneud y mwyaf o hygyrchedd.
- Mae'r cynhwysydd yn rhedeg o dan y gwreiddyn.
Mae'r rhain i gyd yn bwyntiau dilys am ddiffygion y mae angen mynd i'r afael â nhw i wneud Deployment yn fwy effeithlon a dibynadwy.
Tîm kube-score yn arddangos gwybodaeth mewn ffurf ddarllenadwy gan gynnwys pob trosedd o'r math RHYBUDD и CRITIGOL, sy'n ddefnyddiol iawn yn ystod y datblygiad.
Gall y rhai sy'n dymuno defnyddio'r offeryn hwn fel rhan o biblinell CI alluogi allbwn mwy cywasgedig gan ddefnyddio'r faner --output-format ci (yn yr achos hwn, dangosir profion gyda'r canlyniad hefyd 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
Yn debyg i kubeval, mae kube-score yn dychwelyd cod ymadael nad yw'n sero pan fydd prawf sy'n methu. CRITIGOLGallwch hefyd alluogi prosesu tebyg ar gyfer RHYBUDD.
Yn ogystal, mae'n bosibl gwirio adnoddau i sicrhau eu bod yn cydymffurfio â gwahanol fersiynau API (fel yn kubeval). Fodd bynnag, mae'r wybodaeth hon wedi'i chodio'n galed yn y kube-score ei hun: ni allwch ddewis fersiwn wahanol o Kubernetes. Gall y cyfyngiad hwn fod yn broblem fawr os ydych chi'n bwriadu uwchraddio'ch clwstwr neu os oes gennych chi sawl clwstwr gyda gwahanol fersiynau o K8s.
nodi hynny gyda chynnig i weithredu'r cyfle hwn.
Gallwch ddysgu mwy am sgôr-kube yn .
Mae profion sgôr Kube yn offeryn gwych ar gyfer gweithredu arferion gorau, ond beth os oes angen i chi addasu prawf neu ychwanegu eich rheolau eich hun? Yn anffodus, nid yw hynny'n bosibl.
Nid yw sgôr-Kube yn estynadwy: ni allwch ychwanegu polisïau ato na'u haddasu.
Os oes angen i chi ysgrifennu profion personol i wirio cydymffurfiaeth â pholisïau eich cwmni, gallwch ddefnyddio un o'r pedwar offeryn canlynol: config-lint, copper, conftest, neu polaris.
3. Ffurfweddu-lint
Mae Config-lint yn offeryn ar gyfer dilysu ffeiliau ffurfweddu YAML, JSON, Terraform, CSV a maniffestau Kubernetes.
Gallwch ei osod gan ddefnyddio ar wefan y prosiect.
Y fersiwn gyfredol ar adeg ysgrifennu'r erthygl wreiddiol yw 1.5.0.
Nid yw Config-lint yn cynnwys profion adeiledig ar gyfer dilysu maniffestau Kubernetes.
I gynnal unrhyw brofion, mae angen i chi greu rheolau priodol. Mae'r rhain wedi'u hysgrifennu mewn ffeiliau YAML o'r enw "setiau rheolau". (setiau rheolau), ac mae ganddynt y strwythur canlynol:
version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
- "*.yaml"
rules:
# список правил
(rule.yaml)
Gadewch i ni edrych yn agosach arno:
- Maes
typeYn nodi pa fath o gyfluniad y bydd config-lint yn ei ddefnyddio. Ar gyfer maniffestau K8s, dyma bob amserKubernetes. - Yn y cae
filesYn ogystal â'r ffeiliau eu hunain, gallwch nodi cyfeiriadur. - Maes
ruleswedi'i gynllunio i sefydlu profion defnyddwyr.
Dywedwch eich bod chi eisiau sicrhau bod delweddau mewn Deployment bob amser yn cael eu lawrlwytho o storfa ddibynadwy fel my-company.com/myapp:1.0Byddai rheol config-lint sy'n perfformio gwiriad o'r fath yn edrych fel hyn:
- 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)
Ar gyfer pob rheol rhaid nodi'r priodoleddau canlynol:
id— dynodwr rheol unigryw;severity- Efallai FFILWCH, RHYBUDD и AN-GYFUNOL;message— os caiff y rheol ei thorri, dangosir cynnwys y llinell hon;resource— y math o adnodd y mae'r rheol hon yn berthnasol iddo;assertions— rhestr o amodau a fydd yn cael eu gwerthuso mewn perthynas â'r adnodd hwn.
Yn y rheol uchod assertion o'r enw yn gwirio bod pob cynhwysydd yn y Deployment (key: spec.templates.spec.containers) defnyddio delweddau dibynadwy (h.y., y rhai sy'n dechrau gyda my-company.com/).
Mae'r set reolau lawn fel hyn:
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)
I roi cynnig ar y prawf, gadewch i ni ei gadw fel check_image_repo.yamlGadewch i ni gynnal gwiriad ar y ffeil. 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"
}
]
Methodd y gwiriad. Nawr, gadewch i ni wirio'r maniffestr canlynol yn erbyn y storfa delweddau gywir:
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)
Rydym yn rhedeg yr un prawf gyda'r maniffest uchod. Ni chanfuwyd unrhyw broblemau:
$ config-lint -rules check_image_repo.yaml image-valid-mycompany.yaml
[]
Mae Config-lint yn fframwaith addawol sy'n eich galluogi i greu eich profion eich hun ar gyfer dilysu maniffestau YAML Kubernetes gan ddefnyddio'r YAML DSL.
Ond beth os oes angen rhesymeg a phrofion mwy cymhleth arnoch chi? Onid yw YAML yn rhy gyfyngedig ar gyfer hynny? Beth os gallech chi ysgrifennu profion mewn iaith raglennu lawn?
4. Copr
— yn fframwaith ar gyfer dilysu maniffestau gan ddefnyddio profion personol (tebyg i config-lint).
Fodd bynnag, mae'n wahanol i'r olaf gan nad yw'n defnyddio YAML i ddisgrifio profion. Yn lle hynny, gellir ysgrifennu profion yn JavaScript. Mae Copper yn darparu llyfrgell gyda sawl offeryn sylfaenol., sy'n helpu i ddarllen gwybodaeth am wrthrychau Kubernetes ac adrodd am wallau.
Gellir dod o hyd i'r camau ar gyfer gosod Copr yn .
2.0.1 yw'r fersiwn ddiweddaraf o'r cyfleustodau hwn ar adeg ysgrifennu'r erthygl wreiddiol.
Fel config-lint, nid oes gan Copper unrhyw brofion mewnol. Gadewch i ni ysgrifennu un. Gadewch i ni ei wneud yn gwirio bod lleoliadau'n defnyddio delweddau cynwysyddion yn gyfan gwbl o ystorfeydd dibynadwy fel my-company.com.
Creu ffeil check_image_repo.js gyda'r cynnwys canlynol:
$$.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)
}
});
}
});
Nawr i wirio ein maniffesto base-valid.yaml, defnyddiwch y gorchymyn 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
Mae'n amlwg y gellir defnyddio copr i gynnal profion mwy cymhleth, fel gwirio enwau parth mewn maniffestau Ingress neu wrthod podiau sy'n rhedeg yn y modd breintiedig.
Mae gan gopr amryw o swyddogaethau cyfleustodau adeiledig:
DockerImageYn darllen y ffeil fewnbwn penodedig ac yn creu gwrthrych gyda'r priodoleddau canlynol:name— enw'r ddelwedd,tag— tag delwedd,registry— cofrestr o ddelweddau,registry_url— protocol (https://) a'r gofrestrfa o ddelweddau,fqin— lleoliad llawn y ddelwedd.
- Swyddogaeth
findByNameyn helpu i ddod o hyd i adnodd yn ôl math penodol (kind) ac enw (name) o'r ffeil fewnbwn. - Swyddogaeth
findByLabelsyn helpu i ddod o hyd i adnodd yn ôl y math penodedig (kind) a labeli (labels).
Gallwch weld yr holl swyddogaethau gwasanaeth sydd ar gael .
Yn ddiofyn, mae'n llwytho'r ffeil YAML fewnbwn gyfan i mewn i newidyn $$ ac yn ei gwneud ar gael i sgriptiau (dull cyfarwydd i'r rhai sydd â phrofiad gyda jQuery).
Mae prif fantais Copper yn amlwg: does dim angen i chi ddysgu iaith arbenigol a gallwch ddefnyddio amrywiol nodweddion JavaScript i greu eich profion eich hun, fel rhyngosod llinynnau, ffwythiannau, ac ati.
Mae hefyd yn werth nodi bod y fersiwn gyfredol o Copper yn gweithio gyda fersiwn ES5 o'r injan JavaScript, nid ES6.
Mae manylion ar gael yn .
Fodd bynnag, os nad ydych chi'n hoff iawn o JavaScript ac yn well gennych chi iaith sydd wedi'i chynllunio'n benodol ar gyfer creu ymholiadau a disgrifio polisïau, efallai yr hoffech chi ystyried conftest.
5. Cystadleuaeth
Mae Conftest yn fframwaith ar gyfer dilysu data ffurfweddu. Mae hefyd yn addas ar gyfer profi a gwirio maniffestau Kubernetes. Disgrifir profion gan ddefnyddio iaith ymholiadau arbenigol. .
Gallwch chi osod conftest gan ddefnyddio , wedi'i restru ar wefan y prosiect.
Ar adeg ysgrifennu'r erthygl wreiddiol, y fersiwn ddiweddaraf oedd ar gael oedd 0.18.2.
Yn debyg i config-lint a copper, mae conftest yn dod heb unrhyw brofion mewnol. Gadewch i ni roi cynnig arni ac ysgrifennu ein polisi ein hunain. Fel yn yr enghreifftiau blaenorol, byddwn yn gwirio a yw delweddau cynwysyddion wedi'u cymryd o ffynhonnell ddibynadwy.
Creu cyfeiriadur conftest-checks, ac ynddo mae ffeil o'r enw check_image_registry.rego gyda'r cynnwys canlynol:
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])
}
Nawr gadewch i ni ei brofi base-valid.yaml drwy 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
Methodd y prawf fel y disgwyliwyd, gan fod y delweddau wedi dod o ffynhonnell ddibynadwy.
Yn y ffeil Rego rydym yn diffinio bloc denyYstyrir ei wirionedd yn drosedd. Os yw blociau deny sawl un, mae conftest yn eu gwirio'n annibynnol ar ei gilydd, ac mae gwirionedd unrhyw un o'r blociau yn cael ei drin fel torri'r gyfraith.
Yn ogystal â'r allbwn diofyn, mae conftest yn cefnogi fformatau JSON, TAP, a thablau—nodwedd ddefnyddiol iawn os oes angen i chi fewnosod adroddiadau mewn piblinell CI sy'n bodoli eisoes. Gallwch nodi'r fformat a ddymunir gan ddefnyddio'r faner --output.
Er mwyn gwneud polisïau dadfygio yn haws, mae gan conftest faner --traceMae'n allbynnu olrhain o sut mae conftest yn dadansoddi'r ffeiliau polisi penodedig.
Gellir cyhoeddi a rhannu polisïau conftest mewn cofrestrfeydd OCI (Open Container Initiative) fel arteffactau.
Timau push и pull caniatáu ichi gyhoeddi arteffact neu dynnu arteffact presennol o gofrestrfa anghysbell. Gadewch i ni geisio cyhoeddi'r polisi a greon ni i gofrestrfa Docker leol gan ddefnyddio conftest push.
Dechreuwch gofrestrfa Docker leol:
$ docker run -it --rm -p 5000:5000 registry
Mewn terfynell arall, ewch i'r cyfeiriadur a grëwyd yn gynharach. conftest-checks a rhedeg y gorchymyn canlynol:
$ conftest push 127.0.0.1:5000/amitsaha/opa-bundle-example:latest
Os oedd y gorchymyn yn llwyddiannus, fe welwch neges debyg i'r canlynol:
2020/06/10 14:25:43 pushed bundle with digest: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609c
Nawr crëwch gyfeiriadur dros dro a rhedeg y gorchymyn ynddo conftest pullBydd yn lawrlwytho'r pecyn a grëwyd gan y gorchymyn blaenorol iddo:
$ cd $(mktemp -d)
$ conftest pull 127.0.0.1:5000/amitsaha/opa-bundle-example:latest
Bydd is-gyfeiriadur yn ymddangos yn y cyfeiriadur dros dro. policy, sy'n cynnwys ein ffeil polisi:
$ tree
.
└── policy
└── check_image_registry.rego
Gellir rhedeg profion yn uniongyrchol o'r storfa:
$ 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
Yn anffodus, nid yw DockerHub yn cael ei gefnogi eto. Felly ystyriwch eich hun yn lwcus os ydych chi'n defnyddio (ACR) neu'ch cofrestrfa eich hun.
Mae fformat yr arteffactau yr un fath â (OPA), sy'n caniatáu defnyddio conftest i redeg profion o becynnau OPA presennol.
Gallwch ddysgu mwy am rannu polisïau a nodweddion eraill conftest yn .
6. Polaris
Yr offeryn olaf a fydd yn cael ei drafod yn yr erthygl hon yw . (Gwelsom ei gyhoeddiad y llynedd - tua. traws.)
Gellir gosod Polaris ar glwstwr neu ei ddefnyddio yn y modd llinell orchymyn. Fel y gallech fod wedi dyfalu, mae'n caniatáu dadansoddiad statig o faniffestau Kubernetes.
Wrth redeg yn y modd llinell orchymyn, mae profion adeiledig sy'n cwmpasu meysydd fel diogelwch ac arferion gorau ar gael (yn debyg i kube-score). Gallwch hefyd greu eich profion eich hun (yn debyg i config-lint, copper, a conftest).
Hynny yw, mae Polaris yn cyfuno manteision y ddau gategori o offer: profion adeiledig a phrofion a ddiffiniwyd gan y defnyddiwr.
I osod Polaris yn y modd llinell orchymyn, defnyddiwch .
Ar adeg ysgrifennu'r erthygl wreiddiol, mae fersiwn 1.0.3 ar gael.
Unwaith y bydd y gosodiad wedi'i gwblhau, gallwch redeg polaris ar y maniffesto base-valid.yaml gan ddefnyddio'r gorchymyn canlynol:
$ polaris audit --audit-path base-valid.yaml
Bydd yn allbynnu llinyn JSON gyda disgrifiad manwl o'r profion a gynhaliwyd a'u canlyniadau. Bydd gan yr allbwn y strwythur canlynol:
{
"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": [
/* длинный список */
]
}
Mae allbwn llawn ar gael .
Fel sgôr-kube, mae Polaris yn nodi problemau mewn meysydd lle nad yw'r maniffesto yn cydymffurfio ag arferion gorau:
- Nid oes unrhyw wiriadau iechyd pod.
- Dim tagiau wedi'u nodi ar gyfer delweddau cynhwysydd.
- Mae'r cynhwysydd yn rhedeg o dan y gwreiddyn.
- Nid yw ceisiadau a therfynau ar gyfer cof a CPU wedi'u nodi.
Neilltuir lefel o feirniadaeth i bob prawf yn dibynnu ar ei ganlyniadau: rhybudd neu peryglI ddysgu mwy am y profion mewnol sydd ar gael, cyfeiriwch at .
Os nad oes angen manylion, gallwch nodi baner --format scoreYn yr achos hwn, bydd Polaris yn allbynnu rhif yn yr ystod o 1 i 100 - sgôr (h.y. asesiad):
$ polaris audit --audit-path test-data/base-valid.yaml --format score
68
Po agosaf yw'r sgôr at 100, yr uchaf yw'r graddau o gydymffurfiaeth. Os gwiriwch god ymadael y gorchymyn polaris audit, mae'n ymddangos ei fod yn hafal i 0.
Grym polaris audit Gallwch chi ymadael gyda chod nad yw'n sero gan ddefnyddio dau faner:
- Baner
--set-exit-code-below-scoreyn derbyn gwerth trothwy yn yr ystod 1-100 fel dadl. Yn yr achos hwn, bydd y gorchymyn yn dod i ben gyda chod ymadael 4 os yw'r sgôr yn disgyn islaw'r trothwy. Mae hyn yn gyfleus iawn pan fydd gennych werth trothwy (dyweder, 75) ac mae angen i chi gael rhybudd os yw'r sgôr yn disgyn islaw. - Baner
--set-exit-code-on-dangerbydd yn achosi i'r gorchymyn ymadael gyda chod 3 os bydd un o'r profion perygl yn methu.
Nawr, gadewch i ni geisio creu prawf personol sy'n gwirio a yw delwedd wedi'i thynnu o storfa ddibynadwy. Diffinnir profion personol ar ffurf YAML, a disgrifir y prawf ei hun gan ddefnyddio Cynllun JSON.
Mae'r darn YAML canlynol yn disgrifio prawf newydd o'r enw 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/.+$
Gadewch i ni edrych yn agosach arno:
successMessage- bydd y llinell hon yn cael ei hallbynnu os yw'r prawf yn llwyddiannus;failureMessage- bydd y neges hon yn cael ei dangos rhag ofn methiant;category— yn dynodi un o'r categorïau:Images,Health Checks,Security,NetworkingиResources;target—- yn pennu pa fath o wrthrych (spec) cymhwysir y prawf. Gwerthoedd posibl:Container,PodneuController;- Mae'r prawf ei hun wedi'i ddiffinio yn y gwrthrych
schemagan ddefnyddio cynllun JSON. Yn y prawf hwn, yr allweddairpatterna ddefnyddir i gymharu'r ddelwedd wreiddiol â'r un ofynnol.
I redeg y prawf uchod, mae angen i chi greu'r cyfluniad Polaris canlynol:
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)
Gadewch i ni ddadansoddi'r ffeil:
- Yn y cae
checksMae'r profion a'u lefel difrifoldeb wedi'u nodi. Gan ei bod yn ddymunol derbyn rhybudd pan gymerir delwedd o ffynhonnell ddiymddibynadwy, rydym yn gosod y lefel yma.danger. - Y prawf ei hun
checkImageRepoyna mae wedi'i gofrestru yn y gwrthrychcustomChecks.
Cadwch y ffeil fel custom_check.yamlNawr gallwch chi ei redeg. polaris audit gyda maniffest YAML sydd angen ei wirio.
Gadewch i ni brofi ein maniffesto base-valid.yaml:
$ polaris audit --config custom_check.yaml --audit-path base-valid.yaml
Tîm polaris audit Dim ond y prawf defnyddiwr uchod wnes i ei redeg ac nid oedd yn llwyddiannus.
Os ydych chi'n trwsio'r ddelwedd ar my-company.com/http-echo:1.0, Bydd Polaris yn cwblhau'n llwyddiannus. Mae'r maniffesto gyda'r newidiadau eisoes wedi'i gyflwyno , fel y gallwch wirio'r gorchymyn blaenorol ar y maniffesto image-valid-mycompany.yaml.
Nawr mae'r cwestiwn yn codi: sut ydw i'n rhedeg profion adeiledig ochr yn ochr â rhai wedi'u teilwra? Hawdd! Ychwanegwch yr IDau prawf adeiledig at y ffeil ffurfweddu. Bydd y ffeil sy'n deillio o hyn yn edrych fel hyn:
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)
Mae enghraifft o ffeil ffurfweddu gyflawn ar gael .
Gwiriwch y maniffest base-valid.yaml, gan ddefnyddio profion mewnol ac arferol, gallwch ddefnyddio'r gorchymyn:
$ polaris audit --config config_with_custom_check.yaml --audit-path base-valid.yaml
Mae Polaris yn ategu profion adeiledig gyda rhai wedi'u teilwra, a thrwy hynny'n cyfuno'r gorau o'r ddau fyd.
Ar y llaw arall, gall yr anallu i ddefnyddio ieithoedd mwy pwerus fel Rego neu JavaScript fod yn ffactor cyfyngol sy'n atal creu profion mwy soffistigedig.
Mae gwybodaeth ychwanegol am Polaris ar gael yn .
Crynodeb
Er bod llawer o offer ar gael i archwilio a gwerthuso ffeiliau YAML Kubernetes, Mae'n bwysig cael syniad clir o sut y bydd profion yn cael eu cynllunio a'u gweithredu.
Er enghraifft, Os ydych chi'n cymryd maniffestau Kubernetes sy'n mynd trwy biblinell, gallai kubeval fod y cam cyntaf yn y biblinell honno.Byddai'n monitro a yw diffiniadau gwrthrychau'n cydymffurfio â chynllun API Kubernetes.
Unwaith y bydd y math hwn o wirio wedi'i gwblhau, gallem symud ymlaen i brofion mwy soffistigedig, fel cydymffurfio ag arferion gorau safonol a pholisïau penodol. Dyma lle byddai kube-score a Polaris yn ddefnyddiol.
I'r rhai sydd â gofynion cymhleth a'r angen i fireinio profion, byddai copper, config-lint, a conftest yn addas..
Mae Conftest a config-lint yn defnyddio YAML i ddiffinio profion personol, tra bod copr yn darparu mynediad at iaith raglennu lawn, gan ei gwneud yn ddewis deniadol.
Ar y llaw arall, a yw'n werth defnyddio un o'r offer hyn ac felly creu'r holl brofion â llaw, neu ddewis Polaris ac ychwanegu dim ond yr hyn sydd ei angen? Nid oes ateb clir i'r cwestiwn hwn..
Mae'r tabl isod yn cynnwys disgrifiad byr o bob offeryn:
Offeryn
Pwrpas
Cyfyngiadau
Profion defnyddwyr
kubeval
Yn dilysu maniffestau YAML yn erbyn fersiwn benodol o'r cynllun API.
Methu gweithio gyda CRD
Dim
sgôr-ciwb
Yn dadansoddi maniffestau YAML ar gyfer arferion gorau
Ni allwch ddewis eich fersiwn API Kubernetes ar gyfer archwilio adnoddau.
Dim
copr
Fframwaith cyffredinol ar gyfer creu profion JavaScript personol ar gyfer maniffestau YAML
Dim profion mewnol. Dogfennaeth wael.
Oes
ffurfweddu-lint
Fframwaith cyffredinol ar gyfer creu profion mewn iaith benodol i'r parth (DSL) wedi'i fewnosod yn YAML. Yn cefnogi amrywiol fformatau ffurfweddu (e.e., Terraform).
Nid oes profion parod. Efallai na fydd honiadau a swyddogaethau mewnol yn ddigonol.
Oes
cystadleuaeth
Fframwaith ar gyfer creu profion personol gan ddefnyddio Rego (iaith ymholiadau arbenigol). Yn caniatáu rhannu polisïau trwy fwndeli OCI.
Nid oes unrhyw brofion mewnol. Rhaid i chi ddysgu Rego. Nid yw Docker Hub yn cael ei gefnogi ar gyfer cyhoeddi polisïau.
Oes
Polaris
Yn dadansoddi maniffestau YAML i sicrhau eu bod yn cydymffurfio ag arferion gorau safonol. Yn caniatáu ichi greu profion personol gan ddefnyddio Cynllun JSON.
Efallai na fydd profion sy'n seiliedig ar sgema JSON yn ddigon pwerus
Oes
Gan nad yw'r offer hyn yn dibynnu ar fynediad i glwstwr Kubernetes, maent yn hawdd i'w gosod. Maent yn caniatáu ichi hidlo ffeiliau ffynhonnell a rhoi adborth cyflym i awduron ceisiadau tynnu o fewn prosiectau.
PS gan y cyfieithydd
Darllenwch hefyd ar ein blog:
- «";
- «";
- «'.
Ffynhonnell: hab.com
