د غوره عملونو او پالیسیو په وړاندې د Kubernetes YAML تایید کړئ

نوټ. ژباړه: د K8s چاپیریالونو لپاره د YAML تشکیلاتو ډیریدونکي شمیر سره ، د دوی اتوماتیک تایید ته اړتیا ورځ تر بلې بیړنۍ کیږي. د دې بیاکتنې لیکوال نه یوازې د دې کار لپاره موجوده حلونه غوره کړي، بلکې د استخدام د مثال په توګه کارول کیږي ترڅو وګوري چې دوی څنګه کار کوي. دا د هغو کسانو لپاره چې د دې موضوع سره علاقه لري خورا معلوماتي ثابت شو.

د غوره عملونو او پالیسیو په وړاندې د Kubernetes YAML تایید کړئ

د تمديد؛ DR: دا مقاله د غوره کړنو او اړتیاو په وړاندې د Kubernetes YAML فایلونو اعتبار او ارزولو لپاره شپږ جامد وسیلې پرتله کوي.

د Kubernetes کاري بارونه عموما د YAML اسنادو په بڼه تعریف شوي. د YAML سره یو له ستونزو څخه د څرګند فایلونو ترمینځ د خنډونو یا اړیکو مشخص کولو ستونزه ده.

څه که موږ اړتیا ولرو ډاډ ترلاسه کړو چې ټول عکسونه کلستر ته ځای په ځای شوي د باوري راجستر څخه راځي؟

زه څنګه کولی شم د هغه ځای پرځای کولو مخه ونیسم چې د پوډ ډیسپشن بودیجه نلري کلسټر ته لیږل کیږي؟

د جامد ازموینې ادغام تاسو ته اجازه درکوي چې د پراختیا په مرحله کې غلطۍ او د پالیسۍ سرغړونې وپیژني. دا تضمین زیاتوي چې د سرچینو تعریفونه سم او خوندي دي، او دا ډیر احتمال رامینځته کوي چې د تولید کاري بار به غوره عملونه تعقیب کړي.

د Kubernetes جامد YAML فایل تفتیش اکوسیستم په لاندې کټګوریو ویشل کیدی شي:

  • د API تصدیق کونکي. په دې کټګورۍ کې وسایل د YAML منشور د Kubernetes API سرور اړتیاو په مقابل کې ګوري.
  • چمتو ټیسټران. د دې کټګورۍ وسیلې د امنیت لپاره چمتو شوي ازموینې سره راځي ، د غوره عملونو اطاعت او داسې نور.
  • دودیز تاییدونکي. د دې کټګورۍ استازي تاسو ته اجازه درکوي په مختلفو ژبو کې دودیز ازموینې رامینځته کړئ، د بیلګې په توګه، ریګو او جاوا سکرپٹ.

پدې مقاله کې به موږ شپږ مختلف وسایل تشریح او پرتله کړو:

  1. کوبیوال;
  2. کیوب سکور
  3. config-lint;
  4. مسو
  5. مقابله
  6. پولاریس.

ښه، راځئ چې پیل وکړو!

د ګمارنې چک کول

مخکې له دې چې موږ د وسیلو پرتله کول پیل کړو، راځئ چې یو څه شالید جوړ کړو چې د دوی ازموینه وکړي.

لاندې منشور یو شمیر غلطۍ او د غوره عملونو نه اطاعت لري: تاسو څومره یې موندلی شئ؟

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)

موږ به دا YAML د مختلف وسیلو پرتله کولو لپاره وکاروو.

پورته منشور base-valid.yaml او د دې مقالې نور منشورونه په کې موندل کیدی شي د Git ذخیره.

منشور د ویب غوښتنلیک تشریح کوي چې اصلي دنده یې د 5678 پورټ ته د "هیلو ورلډ" پیغام سره ځواب ورکول دي. دا د لاندې کمانډ سره ځای په ځای کیدی شي:

kubectl apply -f hello-world.yaml

او همداسې - کار چیک کړئ:

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

اوس لاړ شه http://localhost:8080 او تایید کړئ چې غوښتنلیک کار کوي. مګر ایا دا غوره عملونه تعقیبوي؟ راځئ چې وګورو.

1. کوبیوال

د کوبیوال نظر دا دی چې د Kubernetes سره هر ډول تعامل د دې REST API له لارې واقع کیږي. په بل عبارت، تاسو کولی شئ د API سکیما وکاروئ ترڅو وګورئ چې ایا ورکړل شوی YAML ورته مطابقت لري. راځئ چې یو مثال وګورو.

د نصبولو لارښوونې kubeval د پروژې په ویب پاڼه کې شتون لري.

د اصلي مقالې لیکلو په وخت کې، نسخه 0.15.0 شتون درلود.

یوځل چې نصب شو، راځئ چې دا پورته ښکاره کړئ:

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

که بریالی وي، کوبیوال به د وتلو کوډ 0 سره وځي. تاسو کولی شئ دا په لاندې ډول وګورئ:

$ echo $?
0

راځئ چې اوس د یو بل منشور سره کوبیوال هڅه وکړو:

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)

ایا تاسو د سترګو له لارې ستونزه پیژنئ؟ راځئ چې پیل وکړو:

$ 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

سرچینه نه ده تایید شوې.

د API نسخه په کارولو سره ځای پرځای کول apps/v1، باید یو انتخاب کونکی پکې شامل وي چې د پوډ لیبل سره سمون ولري. په پورتني منشور کې انتخاب کونکی شامل نه دی، نو کوبیوال یوه تېروتنه راپور کړې او د صفر غیر کوډ سره وتلی.

زه حیران یم چې زه به څه وکړم kubectl apply -f له دې منشور سره؟

ښه، راځئ هڅه وکړو:

$ 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

دا په حقیقت کې هغه تېروتنه ده چې کوبیوال یې په اړه خبرداری ورکړی. تاسو کولی شئ دا د انتخاب کونکي اضافه کولو سره حل کړئ:

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)

د کوبیوال په څیر د وسیلو ګټه دا ده چې د دې په څیر غلطۍ د ګمارنې دورې په پیل کې نیول کیدی شي.

سربیره پردې، دا چکونه کلستر ته لاسرسۍ ته اړتیا نلري؛ دوی کولی شي آفلاین ترسره شي.

په ډیفالټ کې، کوبیوال د وروستي Kubernetes API سکیما په وړاندې سرچینې چک کوي. په هرصورت، په ډیری قضیو کې تاسو اړتیا لرئ چې د یو ځانګړي کبرنیټ خوشې کولو په وړاندې وګورئ. دا د بیرغ په کارولو سره ترسره کیدی شي --kubernetes-version:

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

مهرباني وکړئ په یاد ولرئ چې نسخه باید په بڼه کې مشخص شي Major.Minor.Patch.

د هغو نسخو لیست لپاره چې تصدیق یې ملاتړ کیږي، مهرباني وکړئ مراجعه وکړئ په GitHub کې د JSON سکیما، کوم چې کوبیوال د اعتبار لپاره کاروي. که تاسو د کوبیوال آفلاین چلولو ته اړتیا لرئ، سکیما ډاونلوډ کړئ او د بیرغ په کارولو سره د دوی ځایی موقعیت مشخص کړئ --schema-location.

د انفرادي YAML فایلونو سربیره ، کوبیوال کولی شي د لارښودونو او stdin سره هم کار وکړي.

سربیره پردې ، کوبیوال په اسانۍ سره د CI پایپ لاین کې مدغم کیږي. هغه څوک چې غواړي کلستر ته د منشورونو لیږلو دمخه ازموینې پرمخ بوځي خوښ به شي چې پوه شي چې کوبیوال د دریو محصول فارمیټونو ملاتړ کوي:

  1. ساده متن
  2. JSON;
  3. د هر څه پروتوکول (TAP) ازموینه وکړئ.

او هر یو فارمیټ د مطلوب ډول پایلو لنډیز رامینځته کولو لپاره د محصول نور تحلیل لپاره کارول کیدی شي.

د کوبیوال یو نیمګړتیا دا ده چې دا اوس مهال نشي کولی د ګمرکي سرچینو تعریفونو (CRDs) سره موافقت وګوري. په هرصورت، دا ممکنه ده چې کوبیوال تنظیم کړئ دوی له پامه غورځول.

کوبیوال د سرچینو چک کولو او ارزولو لپاره یوه غوره وسیله ده؛ په هرصورت، دا باید ټینګار وشي چې د ازموینې پاس کول تضمین نه کوي چې سرچینې د غوره کړنو سره سمون لري.

د مثال په توګه، د ټګ کارول latest په کانټینر کې غوره عملونه نه تعقیبوي. په هرصورت، کوبیوال دا یوه تېروتنه نه ګڼي او راپور نه ورکوي. دا دی، د داسې YAML تایید به پرته له خبرتیا بشپړ شي.

مګر څه که تاسو غواړئ د YAML ارزونه وکړئ او د ټګ په څیر سرغړونې وپیژنئ latest؟ زه څنګه د غوره عملونو پروړاندې د YAML فایل چیک کړم؟

2. کیوب سکور

کیوب سکور د YAML څرګندونه تحلیلوي او د جوړ شوي ازموینو پروړاندې یې ارزوي. دا ازموینې د امنیتي لارښوونو او غوره کړنو پراساس غوره شوي، لکه:

  • د کانټینر چلول د ریښی په توګه نه.
  • د پوډ روغتیایی معایناتو شتون.
  • د سرچینو لپاره غوښتنې او محدودیتونه تنظیم کول.

د ازموینې د پایلو پراساس، درې پایلې ورکول کیږي: OK, خبرتیا и انتقادي.

تاسو کولی شئ د کیوب سکور آنلاین هڅه وکړئ یا په محلي توګه یې نصب کړئ.

د اصلي مقالې لیکلو په وخت کې، د کیوب سکور وروستۍ نسخه 1.7.0 وه.

راځئ چې دا زموږ په منشور کې هڅه وکړو 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 د کوبیوال ازموینې پاس کوي، پداسې حال کې چې د کیوب سکور لاندې نیمګړتیاو ته اشاره کوي:

  • د چمتووالي چکونه ترتیب شوي ندي.
  • د CPU سرچینو او حافظې لپاره هیڅ غوښتنې یا محدودیتونه شتون نلري.
  • د پوډ اختلال بودیجه نه ده مشخصه شوې.
  • د جلا کولو قواعد شتون نلري (د تړاو ضد) د شتون اعظمي کولو لپاره.
  • کانټینر د ریښی په توګه پرمخ ځي.

دا ټول د نیمګړتیاوو په اړه باوري ټکي دي چې باید په نښه شي ترڅو ګمارل ډیر اغیزمن او د باور وړ وي.

ټیم kube-score د هر ډول سرغړونو په شمول د انسان د لوستلو وړ بڼه کې معلومات ښکاره کوي خبرتیا и انتقادي، کوم چې د پرمختګ په جریان کې ډیره مرسته کوي.

هغه څوک چې غواړي دا وسیله د CI پایپ لاین کې وکاروي کولی شي د بیرغ په کارولو سره ډیر فشار شوي محصول فعال کړي --output-format ci (په دې حالت کې، د پایلې سره ازموینې هم ښودل شوي 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

د کوبیوال په څیر، کیوب سکور د غیر صفر وتلو کوډ بیرته راګرځوي کله چې یوه ازموینه وي چې ناکامه وي انتقادي. تاسو کولی شئ د ورته پروسس کولو لپاره هم فعال کړئ خبرتیا.

سربیره پردې ، دا ممکنه ده چې د مختلف API نسخو سره موافقت لپاره سرچینې چیک کړئ (لکه څنګه چې کوبیوال کې). په هرصورت، دا معلومات پخپله د کیوب سکور کې هارډ کوډ شوي دي: تاسو نشئ کولی د Kubernetes بله نسخه غوره کړئ. دا محدودیت یوه لویه ستونزه کیدی شي که تاسو غواړئ خپل کلستر لوړ کړئ یا که تاسو د K8s مختلف نسخو سره ډیری کلسترونه لرئ.

هغه یاداښت کړه لا دمخه یوه مسله شتون لري د دې فرصت د درک کولو لپاره د وړاندیز سره.

د کیوب سکور په اړه نور معلومات په کې موندل کیدی شي رسمي ویب پاڼه.

د کیوب سکور ازموینې د غوره تمرینونو پلي کولو لپاره عالي وسیله ده ، مګر که تاسو اړتیا لرئ په ازموینه کې بدلونونه رامینځته کړئ یا خپل قواعد اضافه کړئ؟ افسوس، دا نشي ترسره کیدی.

د کیوب سکور د توزیع وړ ندی: تاسو نشئ کولی پدې کې پالیسۍ اضافه کړئ یا یې تنظیم کړئ.

که تاسو د شرکت پالیسیو سره موافقت تصدیق کولو لپاره دودیز ازموینې لیکلو ته اړتیا لرئ، تاسو کولی شئ د لاندې څلورو وسیلو څخه یو وکاروئ: config-lint، copper، confest، یا polaris.

3.Config-lint

Config-lint د YAML، JSON، Terraform، CSV ترتیب کولو فایلونو او Kubernetes manifests اعتبار کولو لپاره یوه وسیله ده.

تاسو کولی شئ دا په کارولو سره نصب کړئ لارښوونې د پروژې په ویب پاڼه کې.

د اصلي مقالې لیکلو په وخت کې اوسنۍ خپرونه 1.5.0 ده.

Config-lint د Kubernetes manifests د اعتبار لپاره جوړ شوي ازموینې نلري.

د هر ډول ازموینې ترسره کولو لپاره، تاسو اړتیا لرئ چې مناسب قواعد جوړ کړئ. دوی د YAML فایلونو کې لیکل شوي چې "قواعدونه" نومیږي (قوانين)، او لاندې جوړښت لري:

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

(rule.yaml)

راځئ چې دا ډیر نږدې مطالعه کړو:

  • ډګر type مشخص کوي چې کوم ډول ترتیب config-lint به کاروي. د K8s لپاره دا څرګندیږي تل Kubernetes.
  • په ساحه files پخپله د فایلونو سربیره ، تاسو کولی شئ لارښود مشخص کړئ.
  • ډګر rules د کارونکي ازموینې تنظیم کولو لپاره ټاکل شوي.

راځئ چې ووایو تاسو غواړئ ډاډ ترلاسه کړئ چې په ځای پرځای شوي عکسونه تل د باوري ذخیره څخه ډاونلوډ کیږي لکه my-company.com/myapp:1.0. د config-lint قاعده چې دا ډول چک ترسره کوي داسې ښکاري:

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

هر قاعده باید لاندې ځانګړتیاوې ولري:

  • id - د حاکمیت ځانګړی پیژندونکی؛
  • severity - امکان لری ناکامي, خبرتیا и NON_COMPLIANT;
  • message - که یو قانون سرغړونه وي، د دې کرښې مینځپانګې ښودل کیږي؛
  • resource - د سرچینې ډول چې دا قاعده پلي کیږي؛
  • assertions - د شرایطو لیست چې د دې سرچینې په اړه به ارزول کیږي.

په پورته قاعده کې assertion د نوم لاندې every چک کوي چې ټول کانټینرونه په ځای پرځای شوي دي (key: spec.templates.spec.containers) د باور وړ انځورونه وکاروئ (د مثال په توګه my-company.com/).

بشپړ قواعد داسې ښکاري:

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)

د آزموینې د ترسره کولو لپاره، راځئ چې دا په توګه خوندي کړو check_image_repo.yaml. راځئ چې په دوتنې کې یو چک وکړو 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"
  }
]

چک ناکام شو. اوس راځئ چې د سم عکس ذخیره کولو سره لاندې منشور وګورو:

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)

موږ د پورته منشور سره ورته ازموینه ترسره کوو. کومه ستونزه ونه موندل شوه:

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

Config-lint یو امید لرونکی چوکاټ دی چې تاسو ته اجازه درکوي د YAML DSL په کارولو سره د Kubernetes YAML منشورونو اعتبار کولو لپاره خپل ازموینې رامینځته کړئ.

مګر څه که تاسو ډیر پیچلي منطق او ازموینې ته اړتیا لرئ؟ ایا YAML د دې لپاره خورا محدود ندی؟ څه که تاسو کولی شئ په بشپړ پروګرامینګ ژبه کې ازموینې رامینځته کړئ؟

4. مسو

کاپر V2 د دودیز ازموینو په کارولو سره د مینیفیسټونو اعتبار کولو لپاره یو چوکاټ دی (د config-lint سره ورته).

په هرصورت، دا د وروستي څخه توپیر لري چې دا د ازموینې تشریح کولو لپاره YAML نه کاروي. ازموینې په جاواسکریپټ کې لیکل کیدی شي. کاپر د څو بنسټیزو وسایلو سره یو کتابتون چمتو کوي، کوم چې تاسو سره د Kubernetes شیانو په اړه معلومات لوستلو او د غلطیو راپور ورکولو کې مرسته کوي.

د مسو د نصبولو مرحلې په کې موندل کیدی شي رسمي اسناد.

2.0.1 د اصلي مقالې لیکلو په وخت کې د دې افادیت وروستۍ خپرونه ده.

د config-lint په څیر، کاپر جوړ شوي ازموینې نلري. راځئ چې یو یې ولیکو. اجازه راکړئ چې وګورو چې ګمارنې د کانټینر عکسونه په ځانګړي ډول د باوري زیرمو څخه کاروي لکه my-company.com.

یو فایل جوړ کړئ check_image_repo.js د لاندې منځپانګې سره:

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

اوس زموږ د منشور ازموینې لپاره base-valid.yaml، کمانډ وکاروئ 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

دا روښانه ده چې د مسو په مرسته تاسو کولی شئ ډیرې پیچلې ازموینې ترسره کړئ - د بیلګې په توګه، په انګریس کې د ډومین نومونو چک کول یا په امتیازي حالت کې روان پوډونه رد کول.

مسو مختلف افادیت لري چې په دې کې جوړ شوي دي:

  • DockerImage ټاکل شوې ان پټ فایل لولي او د لاندې ځانګړتیاو سره یو اعتراض رامینځته کوي:
    • name - د انځور نوم،
    • tag - د انځور نښه،
    • registry - د انځور ثبت،
    • registry_url - پروتوکول (https://) او د انځور ثبت،
    • fqin - د انځور بشپړ ځای.
  • دنده findByName د ورکړل شوي ډول لخوا د سرچینې موندلو کې مرسته کوي (kind) او نوم (name) د ننوت فایل څخه.
  • دنده findByLabels د یو ځانګړي ډول لخوا د سرچینې موندلو کې مرسته کوي (kind) او لیبلونه (labels).

تاسو کولی شئ د خدماتو ټول موجود فعالیتونه وګورئ دلته.

د ډیفالټ په واسطه دا ټول ان پټ YAML فایل په متغیر کې بار کوي $$ او دا د سکریپټینګ لپاره چمتو کوي (د هغو کسانو لپاره چې د jQuery تجربه لري یو پیژندل شوی تخنیک).

د کاپر اصلي ګټه څرګنده ده: تاسو اړتیا نلرئ په ځانګړې ژبه کې مهارت ولرئ او تاسو کولی شئ د جاوا سکریپټ مختلف خصوصیات وکاروئ ترڅو خپل ازموینې رامینځته کړئ ، لکه د سټرینګ انټرپولیشن ، افعال او نور.

دا هم باید په یاد ولرئ چې د کاپر اوسنی نسخه د جاواسکریپټ انجن ES5 نسخه سره کار کوي، نه ES6.

تفصیلات په کې شتون لري د پروژې رسمي ویب پاڼه.

په هرصورت، که تاسو واقعیا جاوا سکریپټ نه خوښوئ او هغه ژبه غوره کړئ چې په ځانګړي ډول د پوښتنو رامینځته کولو او د پالیسیو تشریح کولو لپاره ډیزاین شوې وي ، تاسو باید د سیالۍ ته پاملرنه وکړئ.

5. Conftest

Confest د ترتیب کولو ډاټا ازموینې لپاره یو چوکاټ دی. د Kubernetes manifests ازموینې / تصدیق کولو لپاره هم مناسب. ازموینې د یوې ځانګړې پوښتنې ژبې په کارولو سره تشریح شوي ریګو.

تاسو کولی شئ د کنفټیسټ په کارولو سره نصب کړئ لارښوونېد پروژې په ویب پاڼه کې لیست شوي.

د اصلي مقالې لیکلو په وخت کې، وروستۍ نسخه موجوده وه 0.18.2.

د config-lint او مسو په څیر، Confest پرته له کوم جوړ شوي ازموینې راځي. راځئ چې دا هڅه وکړو او خپله پالیسي ولیکئ. لکه څنګه چې په تیرو مثالونو کې، موږ به وګورو چې آیا د کانټینر انځورونه د باوري سرچینې څخه اخیستل شوي دي.

یو لارښود جوړ کړئ conftest-checks، او پدې کې د نوم فایل شتون لري check_image_registry.rego د لاندې منځپانګې سره:

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

اوس راځئ چې ازموینه وکړو 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

ازموینه د وړاندوینې وړ ناکامه شوه ځکه چې عکسونه د باوري سرچینې څخه راغلي.

په ریګو فایل کې موږ بلاک تعریف کوو deny. د دې حقیقت سرغړونه ګڼل کیږي. که بلاکونه deny څو، مقابله دوی په خپلواکه توګه د یو بل څخه چک کوي، او د هر بلاک حقیقت د سرغړونې په توګه چلند کیږي.

د ډیفالټ محصول سربیره ، کنفټسټ د JSON ، TAP او میز ب formatه ملاتړ کوي - یو خورا ګټور خصوصیت که تاسو اړتیا لرئ راپورونه په موجوده CI پایپ لاین کې ځای په ځای کړئ. تاسو کولی شئ د بیرغ په کارولو سره مطلوب شکل تنظیم کړئ --output.

د دې لپاره چې د پالیسیو ډیبګ کول اسانه کړي، کنفټیسټ بیرغ لري --trace. دا د دې څرګندونه کوي چې څنګه کنفټسټ د ټاکل شوي پالیسي فایلونه تجزیه کوي.

د سیالۍ پالیسي د آثارو په توګه د OCI (د خلاص کانټینر نوښت) راجسترونو کې خپره او شریک کیدی شي.

کنوانډیټ push и pull تاسو ته اجازه درکوي یو هنري اثار خپاره کړئ یا د لرې پرتو ثبت څخه موجوده آثار بیرته ترلاسه کړئ. راځئ هڅه وکړو هغه پالیسي خپره کړو چې موږ یې په کارولو سره محلي ډاکر راجسټرې ته رامینځته کړې conftest push.

خپل ځایی ډاکر راجسټری پیل کړئ:

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

په بل ټرمینل کې، هغه لارښود ته لاړ شئ چې تاسو مخکې جوړ کړی conftest-checks او لاندې کمانډ چل کړئ:

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

که کمانډ بریالی و، تاسو به د دې په څیر یو پیغام وګورئ:

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

اوس یو لنډمهاله لارښود جوړ کړئ او په هغې کې کمانډ چل کړئ conftest pull. دا به د پخوانی کمانډ لخوا رامینځته شوی بسته ډاونلوډ کړي:

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

یوه فرعي لارښود به په لنډمهاله لارښود کې څرګند شي policyزموږ د پالیسۍ فایل لري:

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

ازموینې مستقیم له ذخیره څخه پرمخ وړل کیدی شي:

$ 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

له بده مرغه، DockerHub لا تر اوسه ملاتړ شوی نه دی. نو خپل ځان بختور وګڼئ که تاسو کاروئ د Azure کانټینر راجستر (ACR) یا ستاسو خپل راجستر.

د هنري بڼه بڼه ورته ده د پالیسۍ اجنټ کڅوړې خلاص کړئ (OPA)، کوم چې تاسو ته اجازه درکوي د موجوده OPA کڅوړو څخه د ازموینو چلولو لپاره کنفټیسټ وکاروئ.

تاسو کولی شئ د پالیسۍ شریکولو او د سیالۍ نورو ځانګړتیاو په اړه نور معلومات په کې زده کړئ د پروژې رسمي ویب پاڼه.

6. پولاریس

وروستی وسیله چې په دې مقاله کې به بحث وشي پولاریان. (د هغه د تیر کال اعلان موږ دمخه ژباړل شوی - نږدې ژباړه)

پولاریس په کلستر کې نصب کیدی شي یا د کمانډ لاین حالت کې کارول کیدی شي. لکه څنګه چې تاسو اټکل کړی وي، دا تاسو ته اجازه درکوي په ثابت ډول د کبرنیټس څرګندونه تحلیل کړئ.

کله چې د کمانډ لاین حالت کې روان وي ، جوړ شوي ازموینې شتون لري چې ساحې پوښي لکه امنیت او غوره تمرینونه (د کیوب سکور ته ورته). برسېره پردې، تاسو کولی شئ خپل ازموینې جوړې کړئ (لکه څنګه چې په config-lint، copper او confest کې).

په بل عبارت، پولاریس د وسیلو د دواړو کټګوریو ګټې سره یوځای کوي: د جوړ شوي او دودیز ازموینې سره.

د کمانډ لاین حالت کې پولاریس نصبولو لپاره ، وکاروئ د پروژې په ویب پاڼه کې لارښوونې.

د اصلي مقالې لیکلو په وخت کې، نسخه 1.0.3 شتون لري.

یوځل چې نصب بشپړ شي تاسو کولی شئ په منشور کې پولاریس چل کړئ base-valid.yaml د لاندې کمانډ سره:

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

دا به د JSON فارمیټ کې د ترسره شوي ازموینو او د دوی پایلو تفصيلي توضیحاتو سره یو تار تولید کړي. محصول به لاندې جوړښت ولري:

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

بشپړ محصول شتون لري دلته.

د کیوب سکور په څیر، پولاریس په هغو سیمو کې مسلې پیژني چیرې چې منشور غوره عملونه نه پوره کوي:

  • د پوډرو لپاره هیڅ روغتیایی معاینه شتون نلري.
  • د کانټینر عکسونو لپاره ټاګونه ندي مشخص شوي.
  • کانټینر د ریښی په توګه پرمخ ځي.
  • د حافظې او CPU لپاره غوښتنې او حدود ندي مشخص شوي.

هره ازموینه، د هغې د پایلو پورې اړه لري، د انتقاد درجه ټاکل شوې ده: خبرداری او یا خطر. د شته جوړ شوي ازموینو په اړه د نورو معلوماتو لپاره، مهرباني وکړئ مراجعه وکړئ اسناد.

که توضیحاتو ته اړتیا نه وي، تاسو کولی شئ بیرغ مشخص کړئ --format score. په دې حالت کې، پولاریس به د 1 څخه تر 100 - پورې شمیره تولید کړي نمره (لکه ارزونه):

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

څومره چې نمره 100 ته نږدې وي، د موافقې درجه لوړه وي. که تاسو د کمانډ د وتلو کوډ وګورئ polaris audit، دا معلومه شوه چې دا د 0 سره مساوي دی.

زور polaris audit تاسو کولی شئ د دوه بیرغونو په کارولو سره د غیر صفر کوډ سره کار پای ته ورسوئ:

  • پرچم --set-exit-code-below-score د دلیل په توګه د 1-100 حد کې د حد ارزښت اخلي. په دې حالت کې، کمانډ به د وتلو کوډ 4 سره وځي که نمرې د حد څخه ښکته وي. دا خورا ګټور دی کله چې تاسو یو ټاکلی حد ارزښت ولرئ (وایی 75) او تاسو اړتیا لرئ خبرتیا ترلاسه کړئ که چیرې نمرې لاندې وي.
  • پرچم --set-exit-code-on-danger کمانډ به د کوډ 3 سره د ناکامۍ لامل شي که چیرې د خطر ازموینې څخه یوه ناکامه شي.

اوس راځئ چې یو دودیز ټیسټ رامینځته کولو هڅه وکړو چې دا وګوري چې ایا عکس د باوري ذخیره څخه اخیستل شوی. دودیز ازموینې د YAML ب formatه کې مشخص شوي ، او ازموینه پخپله د JSON سکیما په کارولو سره تشریح شوې.

لاندې د YAML کوډ snippet یوه نوې ازموینه تشریح کوي چې نومیږي 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/.+$

راځئ چې نږدې ورته وګورو:

  • successMessage - دا کرښه به چاپ شي که چیرې ازموینه په بریالیتوب سره بشپړه شي؛
  • failureMessage - دا پیغام به د ناکامۍ په صورت کې وښودل شي؛
  • category - یو له کټګوریو څخه اشاره کوي: Images, Health Checks, Security, Networking и Resources;
  • target--- مشخص کوي کوم ډول څیز (spec) ازموینه پلي کیږي. احتمالي ارزښتونه: Container, Pod او یا Controller;
  • ازموینه پخپله په اعتراض کې مشخص شوې schema د JSON سکیما کارول. په دې ازموینه کې کلیدي کلمه ده pattern د اړتیا وړ سره د عکس سرچینې پرتله کولو لپاره کارول کیږي.

د پورته ازموینې پرمخ وړلو لپاره، تاسو اړتیا لرئ چې لاندې پولاریس ترتیب جوړ کړئ:

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)

راځئ چې فایل تجزیه کړو:

  • په ساحه checks ازموینې او د دوی د انتقاد کچه ټاکل شوې. ځکه چې دا د پام وړ دی چې خبرداری ترلاسه کړئ کله چې یو عکس د بې باوره سرچینې څخه اخیستل کیږي، موږ دلته کچه تنظیم کوو danger.
  • پخپله ازموینه checkImageRepo بیا په اعتراض کې ثبت شوی customChecks.

د فایل په توګه خوندي کړئ custom_check.yaml. اوس تاسو چلولی شئ polaris audit د YAML منشور سره چې تصدیق ته اړتیا لري.

راځئ چې خپل منشور و ازموئ base-valid.yaml:

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

ټیم polaris audit یوازې د کاروونکي ازموینه پورته شوه چې پورته مشخص شوی او دا ناکام شو.

که تاسو عکس سم کړئ my-company.com/http-echo:1.0، پولاریس به په بریالیتوب سره بشپړ شي. د بدلونونو سره منشور لا دمخه شتون لري ذخیرهنو تاسو کولی شئ په منشور کې پخوانی کمانډ چیک کړئ image-valid-mycompany.yaml.

اوس پوښتنه راپورته کیږي: څنګه د دودیز سره یوځای جوړ شوي ازموینې پرمخ وړئ؟ په اسانۍ سره! تاسو یوازې اړتیا لرئ د تشکیلاتو فایل کې جوړ شوي ازموینې پیژندونکي اضافه کړئ. د پایلې په توګه، دا به لاندې بڼه واخلي:

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)

د بشپړ ترتیب فایل یوه بیلګه شتون لري دلته.

منشور چک کړئ base-valid.yamlد جوړ شوي او دودیز ازموینې په کارولو سره، تاسو کولی شئ کمانډ وکاروئ:

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

پولاریس د ګمرکونو سره جوړ شوي ازموینې بشپړوي، په دې توګه د دواړو نړۍ غوره ترکیب کوي.

له بلې خوا، د ډیرو پیاوړو ژبو لکه ریګو یا جاواسکریپټ کارولو کې پاتې راتلل ممکن یو محدود فاکتور وي چې د ډیرو پیچلو ازموینو رامینځته کیدو مخه نیسي.

د ‏‎Polaris‎‏ پاڼې اړوند نور معلومات په فسبوک کې اوګورئ د پروژې ویب پاڼه.

لنډیز

پداسې حال کې چې د Kubernetes YAML فایلونو معاینه او ارزولو لپاره ډیری وسیلې شتون لري، دا مهمه ده چې روښانه پوهه ولرئ چې ازموینې به څنګه ډیزاین او اجرا شي.

د مثال په توګه، که تاسو د نل لیکې له لارې د کبرنیټس څرګندونه واخلئ ، کوبیوال ممکن په ورته پایپ لاین کې لومړی ګام وي. دا به څارنه وکړي چې آیا د اعتراض تعریفونه د Kubernetes API سکیما سره سمون لري.

یوځل چې دا ډول بیاکتنه بشپړه شي، یو څوک کولی شي ډیرو پیچلو ازموینو ته لاړ شي، لکه د معیاري غوره کړنو او ځانګړو پالیسیو اطاعت. دا هغه ځای دی چې کیوب سکور او پولاریس به په لاس کې راشي.

د هغو کسانو لپاره چې پیچلې اړتیاوې لري او په تفصیل سره ازموینې تنظیم کولو ته اړتیا لري، مسو، کنفف لینټ او کنفیسټ به مناسب وي.

Confest او config-lint د دودیز ازموینې تعریف کولو لپاره YAML کاروي، او مسو تاسو ته د بشپړ پروګرام کولو ژبې ته لاسرسی درکوي، دا یو ښکلی په زړه پورې انتخاب جوړوي.

له بلې خوا ، ایا دا د دې وسیلو څخه د کارولو ارزښت لري او له همدې امله ، په لاسي ډول ټولې ازموینې رامینځته کړئ ، یا پولاریس ته ترجیح ورکړئ او یوازې هغه څه اضافه کړئ چې ورته اړتیا وي؟ د دې پوښتنې لپاره روښانه ځواب نشته.

لاندې جدول د هرې وسیلې لنډ تفصیل وړاندې کوي:

اوزار
موخه
نيمګړتياوې
د کارونکي ازموینې

کوبیوال
د API سکیما د ځانګړي نسخې پروړاندې YAML څرګندونه تاییدوي
د CRD سره کار نشي کولی
نه

کیوب سکور
د YAML تحلیل د غوره عملونو پروړاندې څرګندیږي
د سرچینو چک کولو لپاره ستاسو د Kubernetes API نسخه نشي غوره کولی
نه

مسو
د YAML منشور لپاره د دودیز جاواسکریپټ ازموینې رامینځته کولو لپاره عمومي چوکاټ
هیڅ جوړ شوي ازموینې ندي. ضعیف اسناد
چې

config-lint
په YAML کې ځای پرځای شوي په ډومین ځانګړي ژبه کې د ازموینو رامینځته کولو لپاره عمومي چوکاټ. د مختلف ترتیب فارمیټونو ملاتړ کوي (د مثال په توګه Terraform)
هیڅ چمتو شوي ازموینې شتون نلري. جوړ شوي ادعاګانې او دندې ممکن کافي نه وي
چې

سیالۍ
د ریګو په کارولو سره ستاسو د خپلو ازموینو رامینځته کولو لپاره چوکاټ (د ځانګړې پوښتنې ژبه). د OCI بنډلونو له لارې د پالیسیو شریکولو ته اجازه ورکوي
هیڅ جوړ شوي ازموینې ندي. زه باید ریګو زده کړم. د ډاکر هب ملاتړ نه کیږي کله چې پالیسۍ خپروي
چې

پولاریان
د YAML بیاکتنې د معیاري غوره کړنو پروړاندې څرګندیږي. تاسو ته اجازه درکوي د JSON سکیما په کارولو سره خپل ازموینې رامینځته کړئ
د JSON سکیما پراساس د ازموینې وړتیا ممکن کافي نه وي
چې

ځکه چې دا وسیلې د Kubernetes کلستر ته په لاسرسي تکیه نه کوي، د دوی نصب کول اسانه دي. دوی تاسو ته اجازه درکوي د سرچینې فایلونه فلټر کړئ او په پروژو کې د پلټ غوښتنو لیکوالانو ته ګړندي فیډبیک چمتو کړئ.

PS د ژباړونکي څخه

زموږ په بلاګ کې هم ولولئ:

سرچینه: www.habr.com

Add a comment