Dearbhaich Kubernetes YAML an aghaidh nan cleachdaidhean agus na poileasaidhean as fheàrr

Thoir an aire. eadar-theangachadh.: Leis an àireamh de rèiteachaidhean YAML a tha a’ sìor fhàs airson àrainneachdan K8s, tha an fheum air an dearbhadh fèin-ghluasadach aca a’ fàs nas èiginn. Chan e a-mhàin gun do thagh ùghdar an ath-bhreithneachaidh seo na fuasglaidhean a th’ ann mar-thà airson na h-obrach seo, ach chleachd e cuideachd Cleachdadh mar eisimpleir gus faicinn mar a tha iad ag obair. Bha e gu math fiosrachail dhaibhsan aig a bheil ùidh sa chuspair seo.

Dearbhaich Kubernetes YAML an aghaidh nan cleachdaidhean agus na poileasaidhean as fheàrr

TL; DR: Tha an artaigil seo a’ dèanamh coimeas eadar sia innealan statach gus faidhlichean Kubernetes YAML a dhearbhadh agus a mheasadh a rèir nan cleachdaidhean agus na riatanasan as fheàrr.

Mar as trice tha eallach obrach Kubernetes air am mìneachadh ann an cruth sgrìobhainnean YAML. Is e aon de na duilgheadasan le YAML an duilgheadas a bhith a’ comharrachadh cuingeadan no dàimhean eadar faidhlichean follaiseach.

Dè ma dh’ fheumas sinn dèanamh cinnteach gun tig a h-uile dealbh a thèid a chuir chun bhuidheann bho chlàr earbsach?

Ciamar as urrainn dhomh casg a chuir air cleachdadh aig nach eil PodDisruptionBudgets bho bhith air an cur chun bhuidheann?

Leigidh amalachadh deuchainn statach leat mearachdan agus brisidhean poileasaidh a chomharrachadh aig ìre leasachaidh. Tha seo a’ meudachadh a’ gheallaidh gu bheil mìneachaidhean ghoireasan ceart agus tèarainte, agus ga dhèanamh nas dualtaiche gun lean eallach obrach cinneasachaidh na cleachdaidhean as fheàrr.

Faodar eag-shiostam sgrùdaidh faidhle YAML statach Kubernetes a roinn anns na roinnean a leanas:

  • Luchd-dearbhaidh API. Bidh innealan san roinn seo a’ toirt sùil air an taisbeanadh YAML a rèir riatanasan frithealaiche Kubernetes API.
  • Luchd-dearbhaidh deiseil. Bidh innealan bhon roinn seo a’ tighinn le deuchainnean deiseil airson tèarainteachd, gèilleadh ris na cleachdaidhean as fheàrr, msaa.
  • Luchd-dearbhaidh gnàthaichte. Leigidh riochdairean bhon roinn seo leat deuchainnean gnàthaichte a chruthachadh ann an grunn chànanan, mar eisimpleir, Rego agus Javascript.

San artaigil seo bheir sinn cunntas air agus coimeas a dhèanamh eadar sia innealan eadar-dhealaichte:

  1. cubeval;
  2. cube-sgòr;
  3. config-lint;
  4. copar;
  5. farpais;
  6. polaris.

Uill, leig dhuinn tòiseachadh!

A 'sgrùdadh cleachdaidhean

Mus tòisich sinn a’ dèanamh coimeas eadar innealan, cruthaichidh sinn beagan cùl-fhiosrachaidh air an dèan sinn deuchainn orra.

Tha grunn mhearachdan anns a’ mhanifesto gu h-ìosal agus neo-ghèilleadh ris na cleachdaidhean as fheàrr: cia mheud dhiubh a lorgas tu?

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)

Cleachdaidh sinn an YAML seo gus coimeas a dhèanamh eadar diofar innealan.

Am manifesto gu h-àrd base-valid.yaml agus gheibhear manifestos eile bhon artaigil seo ann an Stòran Git.

Tha am manifest a’ toirt cunntas air aplacaid-lìn aig a bheil a’ phrìomh obair freagairt le teachdaireachd “Hello World” gu port 5678. Faodar a chleachdadh leis an àithne a leanas:

kubectl apply -f hello-world.yaml

Agus mar sin - thoir sùil air an obair:

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

A-nis rachaibh gu http://localhost:8080 agus dearbhaich gu bheil an tagradh ag obair. Ach a bheil e a’ leantainn nan cleachdaidhean as fheàrr? Feuch an dèan sinn sgrùdadh.

1. Kubeval

Aig a 'bhonn cubeval Is e am beachd gum bi eadar-obrachadh sam bith le Kubernetes a’ tachairt tron ​​​​API REST aige. Ann am faclan eile, faodaidh tu sgeama API a chleachdadh gus faighinn a-mach a bheil YAML sònraichte a’ gèilleadh ris. Bheir sinn sùil air eisimpleir.

Stiùireadh stàlaidh kubeval ri fhaighinn air làrach-lìn a’ phròiseict.

Aig àm sgrìobhaidh an artaigil thùsail, bha dreach 0.15.0 ri fhaighinn.

Nuair a bhios tu air a chuir a-steach, bheir sinn biadh dha am follaiseach gu h-àrd:

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

Ma shoirbhicheas leis, fàgaidh kubeval le còd fàgail 0. Faodaidh tu sgrùdadh a dhèanamh air mar a leanas:

$ echo $?
0

Feuch sinn a-nis kubeval le taisbeanadh eadar-dhealaichte:

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)

Am faic thu an duilgheadas le sùil? Nach cuir sinn air bhog:

$ 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

Chan eil an goireas air a dhearbhadh.

Cleachdaidhean a’ cleachdadh an dreach API apps/v1, feumaidh roghnaiche a bhith ann a tha a rèir leubail a’ pod. Chan eil am foillseachadh gu h-àrd a’ toirt a-steach an roghnaiche, agus mar sin thug kubeval cunntas air mearachd agus dh’ fhalbh e le còd neo-neoni.

Saoil dè thachras ma nì mi kubectl apply -f leis a’ mhanifesto seo?

Uill, feuch sinn:

$ 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

Is e seo dìreach a’ mhearachd a thug Kubeval rabhadh mu dheidhinn. Faodaidh tu a chàradh le bhith a’ cur roghnaichear ris:

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)

Is e buannachd innealan leithid kubeval gum faodar mearachdan mar seo a ghlacadh tràth sa chearcall cleachdadh.

A bharrachd air an sin, chan fheum na sgrùdaidhean sin ruigsinneachd don bhuidheann; faodar an coileanadh far-loidhne.

Gu gnàthach, bidh kubeval a’ sgrùdadh ghoireasan an aghaidh an sgeama Kubernetes API as ùire. Ach, sa mhòr-chuid de chùisean is dòcha gum feum thu sgrùdadh a dhèanamh an aghaidh brath sònraichte Kubernetes. Faodar seo a dhèanamh a 'cleachdadh a' bhratach --kubernetes-version:

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

Thoir an aire gum feum an dreach a bhith air a shònrachadh san cruth Major.Minor.Patch.

Airson liosta de dhreachan ris a bheil dearbhadh a’ faighinn taic, thoir sùil air Sgeama JSON air GitHub, a bhios kubeval a’ cleachdadh airson dearbhadh. Ma dh’ fheumas tu kubeval a ruith far loidhne, luchdaich sìos na sgeamaichean agus sònraich an t-àite ionadail aca a’ cleachdadh a’ bhratach --schema-location.

A bharrachd air faidhlichean YAML fa leth, faodaidh kubeval cuideachd obrachadh le clàran agus stdin.

A bharrachd air an sin, bidh Kubeval gu furasta a ’fighe a-steach don loidhne-phìoban CI. Bidh an fheadhainn a tha airson deuchainnean a ruith mus cuir iad manifestos chun bhuidheann toilichte fios a bhith aca gu bheil kubeval a’ toirt taic do thrì chruthan toraidh:

  1. Teacs soilleir;
  2. JSON;
  3. Dèan deuchainn air Pròtacal Rud sam bith (TAP).

Agus faodar gin de na cruthan a chleachdadh airson tuilleadh parsadh den toradh gus geàrr-chunntas a ghineadh de thoraidhean den t-seòrsa a tha thu ag iarraidh.

Is e aon de na h-eas-bhuannachdan a tha aig kubeval nach urrainn dha an-dràsta sgrùdadh a dhèanamh airson gèilleadh ri Mìneachaidhean Goireasan Gnàthaichte (CRDn). Ach, tha e comasach kubeval a rèiteachadh seachnaidh iad.

Tha Kubeval na inneal math airson goireasan a sgrùdadh agus a mheasadh; Ach, bu chòir a dhaingneachadh nach eil a bhith a’ dol seachad air an deuchainn a’ gealltainn gu bheil an goireas a’ cumail ris na cleachdaidhean as fheàrr.

Mar eisimpleir, a 'cleachdadh an taga latest ann an soitheach nach eil a 'leantainn nan cleachdaidhean as fheàrr. Ach, chan eil Kubeval den bheachd gur e mearachd a tha seo agus chan eil e ag aithris air. Is e sin, crìochnaichidh dearbhadh an leithid de YAML gun rabhadh.

Ach dè ma tha thu airson measadh a dhèanamh air YAML agus brisidhean mar an taga a chomharrachadh latest? Ciamar a nì mi sgrùdadh air faidhle YAML an aghaidh nan cleachdaidhean as fheàrr?

2. Kube-sgòr

Kube-sgòr parsadh YAML a’ nochdadh agus gam measadh mu choinneamh deuchainnean togte. Tha na deuchainnean sin air an taghadh a rèir stiùiridhean tèarainteachd agus na cleachdaidhean as fheàrr, leithid:

  • A 'ruith an container chan ann mar freumh.
  • Sgrùdaidhean slàinte pod rim faighinn.
  • A’ suidheachadh iarrtasan agus crìochan airson goireasan.

Stèidhichte air toraidhean an deuchainn, tha trì toraidhean air an toirt seachad: OK, RABHADH и CRITICIG.

Faodaidh tu feuchainn air Kube-score air-loidhne no stàlaich e gu h-ionadail.

Aig àm sgrìobhaidh an artaigil thùsail, b’ e 1.7.0 an dreach as ùire de sgòr kube.

Feuch sinn e air ar 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.

Bidh YAML a’ dol seachad air deuchainnean kubeval, agus tha sgòr kube a’ comharrachadh na lochdan a leanas:

  • Chan eil sgrùdaidhean ullachaidh air an rèiteachadh.
  • Chan eil iarrtasan no crìochan ann airson goireasan CPU agus cuimhne.
  • Chan eil buidseatan brisidh pod air an sònrachadh.
  • Chan eil riaghailtean dealachaidh ann (an-aghaidh dàimh) gus an ruigsinneachd as motha fhaighinn.
  • Bidh an soitheach a’ ruith mar fhreumh.

Tha iad sin uile nam puingean dligheach mu uireasbhaidhean ris am feumar dèiligeadh gus cleachdadh a dhèanamh nas èifeachdaiche agus nas earbsaiche.

sgioba kube-score a’ taisbeanadh fiosrachadh ann an cruth a ghabhas leughadh le daoine a’ toirt a-steach gach seòrsa brisidh RABHADH и CRITICIG, a tha a 'cuideachadh mòran rè leasachadh.

Faodaidh an fheadhainn a tha airson an inneal seo a chleachdadh taobh a-staigh loidhne-phìoban CI barrachd toradh teann a chomasachadh a’ cleachdadh a’ bhratach --output-format ci (anns a’ chùis seo, tha deuchainnean leis an toradh air an taisbeanadh cuideachd 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

Coltach ri kubeval, tillidh kube-score còd fàgail neo-neoni nuair a bhios deuchainn ann a dh’ fhailicheas CRITICIG. Faodaidh tu cuideachd giollachd coltach ris a chomasachadh airson RABHADH.

A bharrachd air an sin, tha e comasach sgrùdadh a dhèanamh air goireasan airson gèilleadh ri diofar dhreachan API (mar ann an kubeval). Ach, tha am fiosrachadh seo air a chòdachadh gu cruaidh anns an sgòr kube fhèin: chan urrainn dhut dreach eile de Kubernetes a thaghadh. Faodaidh an cuingeachadh seo a bhith na dhuilgheadas mòr ma tha thu am beachd an cruinneachadh agad ùrachadh no ma tha grunn chlàran agad le dreachan eadar-dhealaichte de K8n.

thoir fa-near sin tha cùis ann mu thràth le moladh an cothrom seo a thoirt gu buil.

Gheibhear tuilleadh fiosrachaidh mu kube-sgòr aig làrach-lìn oifigeil.

Tha deuchainnean sgòr Kube nan inneal math airson na cleachdaidhean as fheàrr a chuir an gnìomh, ach dè ma dh’ fheumas tu an deuchainn atharrachadh no na riaghailtean agad fhèin a chuir ris? Och, chan urrainn seo a dhèanamh.

Chan urrainnear Kube-score a leudachadh: chan urrainn dhut poileasaidhean a chur ris no an atharrachadh.

Ma dh’ fheumas tu deuchainnean àbhaisteach a sgrìobhadh gus dearbhadh gu bheilear a’ cumail ri poileasaidhean companaidh, faodaidh tu aon de na ceithir innealan a leanas a chleachdadh: config-lint, copar, contest, no polaris.

3.Config-lint

Tha Config-lint na inneal airson faidhlichean rèiteachaidh YAML, JSON, Terraform, CSV agus taisbeanaidhean Kubernetes a dhearbhadh.

Faodaidh tu a stàladh le bhith a 'cleachdadh stiùireadh air làrach-lìn a’ phròiseict.

Is e an sgaoileadh làithreach aig àm sgrìobhaidh an artaigil thùsail 1.5.0.

Chan eil deuchainnean togte aig Config-lint airson dearbhadh Kubernetes manifests.

Gus deuchainnean sam bith a dhèanamh, feumaidh tu riaghailtean iomchaidh a chruthachadh. Tha iad sgrìobhte ann am faidhlichean YAML ris an canar “rulesets” (roghainnean), agus tha an structar a leanas aca:

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

(rule.yaml)

Nì sinn sgrùdadh nas mionaidiche air:

  • achadh type a’ sònrachadh dè an seòrsa rèiteachaidh a chleachdas config-lint. Airson taisbeanaidhean K8s tha seo an-còmhnaidh Kubernetes.
  • Anns an achadh files A bharrachd air na faidhlichean fhèin, faodaidh tu eòlaire a shònrachadh.
  • achadh rules an dùil airson deuchainnean cleachdaiche a shuidheachadh.

Canaidh sinn gu bheil thu airson dèanamh cinnteach gu bheil ìomhaighean ann an cleachdadh an-còmhnaidh air an luchdachadh sìos bho stòr earbsach mar my-company.com/myapp:1.0. Bhiodh riaghailt config-lint a nì sgrùdadh mar seo a’ coimhead mar seo:

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

Feumaidh na buadhan a leanas a bhith aig gach riaghailt:

  • id - aithnichear sònraichte den riaghailt;
  • severity - Faodaidh a bhith FAILURE, RABHADH и GUN_COMPLIANT;
  • message - ma thèid riaghailt a bhriseadh, tha susbaint na loidhne seo air a thaisbeanadh;
  • resource - an seòrsa goireas ris a bheil an riaghailt seo a’ buntainn;
  • assertions - liosta de na suidheachaidhean a thèid a mheasadh a thaobh a’ ghoireas seo.

Anns an riaghailt gu h-àrd assertion fon ainm every dèanamh cinnteach gu bheil na soithichean uile ann an cleachdadh (key: spec.templates.spec.containers) cleachd ìomhaighean earbsach (i.e. a’ tòiseachadh le my-company.com/).

Tha an seata iomlan de riaghailtean a 'coimhead mar seo:

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)

Gus an deuchainn fheuchainn, sàbhail sinn e mar check_image_repo.yaml. Feuch an ruith sinn seic air an fhaidhle 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"
  }
]

Dh'fhàillig an t-seic. A-nis leig dhuinn sùil a thoirt air an fhoillseachadh a leanas leis an stòr ìomhaigh cheart:

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)

Bidh sinn a’ ruith an aon deuchainn leis an fhoillseachadh gu h-àrd. Cha deach duilgheadas sam bith a lorg:

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

Tha Config-lint na fhrèam gealltanach a leigeas leat na deuchainnean agad fhèin a chruthachadh gus dearbhadh Kubernetes YAML manifests a’ cleachdadh an YAML DSL.

Ach dè ma tha feum agad air loidsig agus deuchainnean nas iom-fhillte? Nach eil YAML ro chuingealaichte airson seo? Dè nam b’ urrainn dhut deuchainnean a chruthachadh ann an làn chànan prògramaidh?

4. Copar

Copar V2 na fhrèam airson taisbeanaidhean a dhearbhadh a’ cleachdadh deuchainnean àbhaisteach (coltach ri config-lint).

Ach, tha e eadar-dhealaichte bhon fhear mu dheireadh leis nach eil e a’ cleachdadh YAML airson cunntas a thoirt air deuchainnean. Faodar deuchainnean a sgrìobhadh ann an JavaScript an àite sin. Tha copar a 'toirt seachad leabharlann le grunn innealan bunaiteach, a chuidicheas tu gus fiosrachadh a leughadh mu nithean Kubernetes agus aithris air mearachdan.

Gheibhear na ceumannan airson Copper a chuir a-steach sgrìobhainnean oifigeil.

Is e 2.0.1 an sgaoileadh as ùire den ghoireas seo aig àm sgrìobhaidh an artaigil thùsail.

Coltach ri config-lint, chan eil deuchainnean togte aig Copper. Sgrìobhamaid aon. Leig leis dèanamh cinnteach gu bheil cleachdadh a’ cleachdadh ìomhaighean container a-mhàin bho stòran earbsach mar my-company.com.

Cruthaich faidhle check_image_repo.js leis an t-susbaint a leanas:

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

A-nis airson deuchainn a dhèanamh air ar follaiseachd base-valid.yaml, cleachd an àithne 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

Tha e soilleir gun urrainn dhut deuchainnean nas iom-fhillte a dhèanamh le cuideachadh bho copar - mar eisimpleir, a’ sgrùdadh ainmean fearainn ann am manifestos Ingress no a’ diùltadh pods a tha a’ ruith ann am modh sochair.

Tha grunn dhleastanasan goireis air an togail a-steach do copar:

  • DockerImage a’ leughadh am faidhle cuir a-steach ainmichte agus a’ cruthachadh nì leis na buadhan a leanas:
    • name - ainm an ìomhaigh,
    • tag - tag ìomhaigh,
    • registry - clàradh dhealbhan,
    • registry_url - pròtacal (https://) agus clàr dhealbhan,
    • fqin - làn shuidheachadh na h-ìomhaigh.
  • gnìomh findByName cuideachadh gus goireas a lorg a rèir seòrsa sònraichte (kind) agus ainm (name) bhon fhaidhle cuir a-steach.
  • gnìomh findByLabels a’ cuideachadh le goireas a lorg a rèir seòrsa sònraichte (kind) agus bileagan (labels).

Chì thu a h-uile gnìomh seirbheis a tha ri fhaighinn an seo.

Gu gnàthach bidh e a’ luchdachadh am faidhle YAML a-steach gu caochladair $$ agus ga dhèanamh ri fhaighinn airson sgriobtadh (innleachd air a bheil iad eòlach dhaibhsan aig a bheil eòlas jQuery).

Tha prìomh bhuannachd Copper follaiseach: chan fheum thu cànan sònraichte a mhaighstir agus faodaidh tu diofar fheartan JavaScript a chleachdadh gus na deuchainnean agad fhèin a chruthachadh, leithid eadar-theachd sreang, gnìomhan, msaa.

Bu chòir a thoirt fa-near cuideachd gu bheil an dreach làithreach de Copper ag obair leis an dreach ES5 den einnsean JavaScript, chan e ES6.

Mion-fhiosrachadh ri fhaighinn aig Làrach-lìn oifigeil pròiseact a.

Ach, mura h-eil JavaScript a’ còrdadh riut gu mòr agus mas fheàrr leat cànan a chaidh a dhealbhadh gu sònraichte airson a bhith a’ cruthachadh cheistean agus a’ toirt cunntas air poileasaidhean, bu chòir dhut aire a thoirt do chonnspaid.

5.Conftest

Tha Contest na fhrèam airson dàta rèiteachaidh a dhearbhadh. Cuideachd freagarrach airson deuchainn / dearbhadh Kubernetes manifests. Bithear a’ toirt cunntas air deuchainnean a’ cleachdadh cànan ceist sònraichte Rego.

Faodaidh tu farpais a chuir a-steach le bhith a’ cleachdadh stiùireadhair a liostadh air làrach-lìn a’ phròiseict.

Aig àm sgrìobhaidh an artaigil thùsail, b’ e 0.18.2 an dreach as ùire a bha ri fhaighinn.

Coltach ri config-lint agus copar, thig connsachadh às aonais deuchainnean togte sam bith. Feuchaidh sinn e agus sgrìobh sinn ar poileasaidh fhèin. Mar a chithear ann an eisimpleirean roimhe seo, nì sinn sgrùdadh a bheil na h-ìomhaighean container air an toirt bho stòr earbsach.

Cruthaich eòlaire conftest-checks, agus innte tha faidhle air a bheil ainm check_image_registry.rego leis an t-susbaint a leanas:

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

A-nis leig dhuinn deuchainn base-valid.yaml через 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

Dh'fhàillig an deuchainn a rèir coltais oir thàinig na h-ìomhaighean bho stòr neo-earbsach.

Anns an fhaidhle Rego bidh sinn a’ mìneachadh a’ bhloc deny. Thathas den bheachd gu bheil an fhìrinn aige na bhriseadh. Ma tha blocaichean deny grunn, bidh farpais gan sgrùdadh gu neo-eisimeileach bho chèile, agus thathas a’ làimhseachadh fìrinn gin de na blocaichean mar bhriseadh.

A bharrachd air an toradh bunaiteach, tha contest a’ toirt taic do chruth JSON, TAP agus clàr - feart air leth feumail ma dh’ fheumas tu aithisgean fhighe a-steach do loidhne-phìoban CI a tha ann mu thràth. Faodaidh tu an cruth a tha thu ag iarraidh a shuidheachadh leis a’ bhratach --output.

Gus a dhèanamh nas fhasa poileasaidhean dì-bhugachaidh, tha bratach aig farpais --trace. Bidh e a’ toirt a-mach lorg air mar a bhios connspaid a’ parsadh nam faidhlichean poileasaidh ainmichte.

Faodar poileasaidhean farpais fhoillseachadh agus a roinn ann an clàran OCI (Open Container Initiative) mar artifacts.

Sgioban push и pull leigeil leat artifact fhoillseachadh no artifact gnàthaichte fhaighinn air ais bho chlàr iomallach. Feuchaidh sinn ri am poileasaidh a chruthaich sinn fhoillseachadh don chlàr Docker ionadail a’ cleachdadh conftest push.

Tòisich do chlàr Docker ionadail:

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

Ann an ceann-uidhe eile, rachaibh chun an eòlaire a chruthaich thu na bu thràithe conftest-checks agus ruith an òrdugh a leanas:

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

Ma bha an àithne soirbheachail, chì thu teachdaireachd mar seo:

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

A-nis cruthaich eòlaire sealach agus ruith an àithne ann conftest pull. Luchdaichidh e sìos am pasgan a chaidh a chruthachadh leis an òrdugh roimhe:

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

Nochdaidh fo-eòlaire anns an eòlaire sealach policyanns a bheil am faidhle poileasaidh againn:

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

Faodar deuchainnean a ruith gu dìreach bhon stòr:

$ 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

Gu mì-fhortanach, chan eil taic aig DockerHub fhathast. Mar sin smaoinich thu fhèin fortanach ma chleachdas tu Clàr-gleidhidh Azure Container (ACR) no an clàr agad fhèin.

Tha cruth artifact mar an ceudna Fosgail pasganan àidseant poileasaidh (OPA), a leigeas leat contest a chleachdadh gus deuchainnean a ruith bho phasganan OPA a tha ann mu thràth.

Faodaidh tu barrachd ionnsachadh mu cho-roinn phoileasaidhean agus feartan eile de chonnspaid aig Làrach-lìn oifigeil pròiseact a.

6. Polaris

Is e an inneal mu dheireadh a thèid a dheasbad san artaigil seo Polaris. (An naidheachd aige an-uiridh tha sinn air eadar-theangachadh mar-thà - mu thuairmeas. eadar-theangachadh)

Faodar Polaris a chuir a-steach ann am brabhsair no a chleachdadh ann am modh loidhne-àithne. Mar is dòcha gu bheil thu air smaoineachadh, leigidh e leat mion-sgrùdadh statach a dhèanamh air taisbeanaidhean Kubernetes.

Nuair a bhios tu a’ ruith ann am modh loidhne-àithne, tha deuchainnean togte rim faighinn a’ còmhdach raointean leithid tèarainteachd agus na cleachdaidhean as fheàrr (coltach ri kube-score). A bharrachd air an sin, faodaidh tu na deuchainnean agad fhèin a chruthachadh (mar ann an config-lint, copar agus contest).

Ann am faclan eile, bidh Polaris a ’cothlamadh buannachdan an dà sheòrsa innealan: le deuchainnean togte agus gnàthaichte.

Gus Polaris a stàladh ann am modh loidhne-àithne, cleachd stiùireadh air làrach-lìn a’ phròiseict.

Aig àm sgrìobhaidh an artaigil thùsail, tha dreach 1.0.3 ri fhaighinn.

Aon uair ‘s gu bheil an stàladh deiseil faodaidh tu polaris a ruith air a’ nochdadh base-valid.yaml leis an òrdugh a leanas:

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

Cuiridh e a-mach sreang ann an cruth JSON le tuairisgeul mionaideach air na deuchainnean a chaidh a dhèanamh agus na toraidhean aca. Bidh an structar a leanas aig an toradh:

{
  "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": [
    /* длинный список */
  ]
}

Toradh slàn ri fhaighinn an seo.

Coltach ri kube-score, tha Polaris a’ comharrachadh chùisean ann an raointean far nach eil am follaiseach a’ coinneachadh ris na cleachdaidhean as fheàrr:

  • Chan eil sgrùdaidhean slàinte ann airson pods.
  • Chan eil tagaichean airson ìomhaighean container air an sònrachadh.
  • Bidh an soitheach a’ ruith mar fhreumh.
  • Chan eil iarrtasan agus crìochan airson cuimhne agus CPU air an sònrachadh.

Bithear a’ toirt ìre èiginneach do gach deuchainn, a rèir a thoraidhean: rabhadh no cunnart. Gus barrachd ionnsachadh mu na deuchainnean togte a tha rim faighinn, thoir sùil air sgrìobhainnean.

Mura h-eil feum air mion-fhiosrachadh, faodaidh tu am bratach a shònrachadh --format score. Anns a 'chùis seo, cuiridh Polaris a-mach àireamh eadar 1 agus 100 - sgòr (i.e. measadh):

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

Mar as fhaisge a tha an sgòr gu 100, is ann as àirde an ìre aonta. Ma bheir thu sùil air còd fàgail na h-àithne polaris audit, thionndaidh e a-mach gu bheil e co-ionann ri 0.

Feachd polaris audit Faodaidh tu crìoch a chuir air obair le còd neo-neoni a’ cleachdadh dà bhratach:

  • Didòmhnaich --set-exit-code-below-score a’ gabhail mar argamaid luach stairsnich anns an raon 1-100. Anns a 'chùis seo, fàgaidh an àithne le còd fàgail 4 ma tha an sgòr fon stairsnich. Tha seo glè fheumail nuair a tha luach stairsnich sònraichte agad (can 75) agus feumaidh tu rabhadh fhaighinn ma thèid an sgòr gu h-ìosal.
  • Didòmhnaich --set-exit-code-on-danger bheir seo air an àithne fàiligeadh le còd 3 ma dh’ fhailicheas aon de na deuchainnean cunnart.

A-nis feuchaidh sinn ri deuchainn àbhaisteach a chruthachadh a nì cinnteach a bheil an ìomhaigh air a thoirt bho stòr earbsach. Tha deuchainnean gnàthaichte air an sònrachadh ann an cruth YAML, agus tha an deuchainn fhèin air a mhìneachadh le bhith a’ cleachdadh JSON Schema.

Tha an earrann còd YAML a leanas a’ toirt cunntas air deuchainn ùr ris an canar 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/.+$

Bheir sinn sùil nas mionaidiche air:

  • successMessage - thèid an loidhne seo a chlò-bhualadh ma thig an deuchainn gu crìch gu soirbheachail;
  • failureMessage - thèid an teachdaireachd seo a shealltainn ma dh'fhàilligeas;
  • category - a’ comharrachadh aon de na roinnean: Images, Health Checks, Security, Networking и Resources;
  • target--- a’ dearbhadh dè an seòrsa nì (spec) deuchainn air a chuir an sàs. Luachan comasach: Container, Pod no Controller;
  • Tha an deuchainn fhèin air a shònrachadh anns an nì schema a’ cleachdadh sgeama JSON. Is e am prìomh fhacal anns an deuchainn seo pattern air a chleachdadh gus coimeas a dhèanamh eadar stòr an ìomhaigh agus an tè a tha a dhìth.

Gus an deuchainn gu h-àrd a ruith, feumaidh tu an rèiteachadh Polaris a leanas a chruthachadh:

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)

Dèanamaid sgrùdadh air an fhaidhle:

  • Anns an achadh checks tha deuchainnean agus an ìre riatanachd air an òrdachadh. Leis gu bheil e ion-mhiannaichte rabhadh fhaighinn nuair a thèid ìomhaigh a thogail bho stòr neo-earbsach, shuidhich sinn an ìre an seo danger.
  • An deuchainn fhèin checkImageRepo an uairsin clàraichte san nì customChecks.

Sàbhail am faidhle mar custom_check.yaml. A-nis faodaidh tu ruith polaris audit le foillseachadh YAML a dh’ fheumas dearbhadh.

Feuch an dèan sinn deuchainn air a’ mhanifesto againn base-valid.yaml:

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

sgioba polaris audit ruith dìreach an deuchainn cleachdaiche a chaidh a shònrachadh gu h-àrd agus dh'fhàillig e.

Ma shocraicheas tu an dealbh gu my-company.com/http-echo:1.0, bidh Polaris a 'crìochnachadh gu soirbheachail. Tha am manifesto leis na h-atharrachaidhean a-staigh mu thràth tasgaidhgus an urrainn dhut sùil a thoirt air an àithne roimhe air a’ nochdadh image-valid-mycompany.yaml.

A-nis tha a ’cheist ag èirigh: ciamar a ruitheas tu deuchainnean togte còmhla ri feadhainn àbhaisteach? Gu furasta! Feumaidh tu dìreach na aithnichearan deuchainn togte a chur ris an fhaidhle rèiteachaidh. Mar thoradh air an sin, bidh e san fhoirm a leanas:

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)

Tha eisimpleir de fhaidhle rèiteachaidh iomlan ri fhaighinn an seo.

Thoir sùil air manifesto base-valid.yamla’ cleachdadh deuchainnean togte agus gnàthaichte, faodaidh tu an àithne a chleachdadh:

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

Bidh Polaris a’ cur ris na deuchainnean togte le feadhainn àbhaisteach, agus mar sin a’ cothlamadh a’ chuid as fheàrr den dà shaoghal.

Air an làimh eile, faodaidh neo-chomas cànanan nas cumhachdaiche leithid Rego no JavaScript a chleachdadh a bhith na fheart cuibhrichte a chuireas casg air cruthachadh deuchainnean nas ionnsaichte.

Tha tuilleadh fiosrachaidh mu Polaris ri fhaighinn aig làrach a ’phròiseict.

Geàrr-chunntas

Ged a tha mòran innealan rim faighinn gus faidhlichean Kubernetes YAML a sgrùdadh agus a mheasadh, tha e cudromach tuigse shoilleir a bhith agad air mar a thèid na deuchainnean a dhealbhadh agus a chur an gnìomh.

Mar eisimpleir, ma ghabhas thu taisbeanaidhean Kubernetes a’ dol tro loidhne-phìoban, is dòcha gur e kubeval a’ chiad cheum ann an leithid de loidhne-phìoban. Dhèanadh e sùil a bheil mìneachaidhean nithean a rèir sgeama Kubernetes API.

Aon uair ‘s gu bheil an leithid de sgrùdadh deiseil, dh’ fhaodadh aon gluasad air adhart gu deuchainnean nas ionnsaichte, leithid gèilleadh ri cleachdaidhean àbhaisteach as fheàrr agus poileasaidhean sònraichte. Seo far am biodh kube-score agus Polaris feumail.

Dhaibhsan aig a bheil riatanasan iom-fhillte agus a dh’ fheumas deuchainnean a ghnàthachadh gu mionaideach, bhiodh copar, config-lint agus contest freagarrach.

Bidh contest agus config-lint a’ cleachdadh YAML gus deuchainnean gnàthaichte a mhìneachadh, agus bheir copar cothrom dhut air làn chànan prògramaidh, ga dhèanamh na roghainn gu math tarraingeach.

Air an làimh eile, is fhiach e aon de na h-innealan sin a chleachdadh agus, mar sin, na deuchainnean gu lèir a chruthachadh le làimh, no is fheàrr leat Polaris agus cuir ris na tha a dhìth air a-mhàin? Chan eil freagairt soilleir ann don cheist seo.

Tha an clàr gu h-ìosal a’ toirt cunntas goirid air gach inneal:

Inneal
Adhbhar
uireasbhaidhean
Deuchainnean luchd-cleachdaidh

cubeval
A’ dearbhadh tha YAML a’ nochdadh an aghaidh dreach sònraichte den sgeama API
Chan urrainn dhomh obrachadh le CRD
Chan eil

cube-sgòr
A’ dèanamh anailis air YAML a’ nochdadh an aghaidh nan cleachdaidhean as fheàrr
Chan urrainn dhuinn an tionndadh Kubernetes API agad a thaghadh gus sùil a thoirt air goireasan
Chan eil

copair
Tha frèam coitcheann airson deuchainnean JavaScript àbhaisteach a chruthachadh airson YAML a’ nochdadh
Gun deuchainnean togte. Sgrìobhainnean truagh
gu bheil

config-lint
Frèam coitcheann airson deuchainnean a chruthachadh ann an cànan a tha sònraichte don àrainn stèidhichte ann an YAML. A 'toirt taic do dhiofar chruthan rèiteachaidh (me Terraform)
Chan eil deuchainnean deiseil ann. Is dòcha nach bi dearbhaidhean agus gnìomhan togte gu leòr
gu bheil

connsachadh
Frèam airson na deuchainnean agad fhèin a chruthachadh a’ cleachdadh Rego (cànan ceiste sònraichte). A’ ceadachadh roinneadh phoileasaidhean tro phasganan OCI
Gun deuchainnean togte. Feumaidh mi Rego ionnsachadh. Chan eil taic ri Docker Hub nuair a thathar a’ foillseachadh phoileasaidhean
gu bheil

Polaris
Lèirmheasan Tha YAML a’ nochdadh an aghaidh nan cleachdaidhean àbhaisteach as fheàrr. Leigidh seo leat na deuchainnean agad fhèin a chruthachadh a’ cleachdadh JSON Schema
Is dòcha nach bi comasan deuchainn stèidhichte air sgeama JSON gu leòr
gu bheil

Leis nach eil na h-innealan sin an urra ri ruigsinneachd gu cruinneachadh Kubernetes, tha iad furasta an stàladh. Leigidh iad leat faidhlichean tùsail a shìoladh agus fios air ais sgiobalta a thoirt do ùghdaran iarrtasan tarraing ann am pròiseactan.

PS bhon eadar-theangair

Leugh cuideachd air ar blog:

Source: www.habr.com

Cuir beachd ann