Π’Π°Π»ΠΈΠ΄ΠΈΡ€Π°ΠΉΡ‚Π΅ Kubernetes YAML спрямо Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ

Π—Π°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠΏΡ€Π΅Π²ΠΎΠ΄: Π‘ нарастващия Π±Ρ€ΠΎΠΉ YAML ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π·Π° K8s срСди, нСобходимостта ΠΎΡ‚ тяхната Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€Π°Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° става всС ΠΏΠΎ-спСшна. ΠΠ²Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€Π΅Π³Π»Π΅Π΄ Π½Π΅ само Π΅ ΠΈΠ·Π±Ρ€Π°Π» ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π° Ρ‚Π°Π·ΠΈ Π·Π°Π΄Π°Ρ‡Π°, Π½ΠΎ Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π» ΠΈ Deployment ΠΊΠ°Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈ ΠΊΠ°ΠΊ работят. Оказа сС ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎ Π·Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ сС интСрСсуват ΠΎΡ‚ Ρ‚Π°Π·ΠΈ Ρ‚Π΅ΠΌΠ°.

Π’Π°Π»ΠΈΠ΄ΠΈΡ€Π°ΠΉΡ‚Π΅ Kubernetes YAML спрямо Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ

TL; DR: Π’Π°Π·ΠΈ статия сравнява ΡˆΠ΅ΡΡ‚ статични инструмСнта Π·Π° Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅ ΠΈ ΠΎΡ†Π΅Π½ΠΊΠ° Π½Π° Kubernetes YAML Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ спрямо Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΈ изисквания.

Π Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ натоварвания Π½Π° Kubernetes ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ сС Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Ρ‚ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π½Π° YAML Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈ. Π•Π΄ΠΈΠ½ ΠΎΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ с YAML Π΅ трудността ΠΏΡ€ΠΈ опрСдСлянС Π½Π° ограничСния ΠΈΠ»ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ манифСстнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅.

Какво Ρ‰Π΅ станС, Π°ΠΊΠΎ трябва Π΄Π° сС ΡƒΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Π΅ всички изобраТСния, Ρ€Π°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈ Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°, ΠΈΠ΄Π²Π°Ρ‚ ΠΎΡ‚ Π΄ΠΎΠ²Π΅Ρ€Π΅Π½ Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€?

Как ΠΌΠΎΠ³Π° Π΄Π° прСдотвратя ΠΈΠ·ΠΏΡ€Π°Ρ‰Π°Π½Π΅Ρ‚ΠΎ Π½Π° разполагания, ΠΊΠΎΠΈΡ‚ΠΎ нямат PodDisruptionBudgets, към ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°?

Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° статично тСстванС Π²ΠΈ позволява Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Ρ‚Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΈ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ‚Π° Π½Π° Π΅Ρ‚Π°ΠΏΠ° Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. Π’ΠΎΠ²Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π° гаранцията, Ρ‡Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ‚Π΅ Π½Π° рСсурситС са ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΈ ΠΈ сигурни ΠΈ ΠΏΡ€Π°Π²ΠΈ ΠΏΠΎ-вСроятно производствСнитС натоварвания Π΄Π° слСдват Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ.

Π‘Ρ‚Π°Ρ‚ΠΈΡ‡Π½Π°Ρ‚Π° СкосистСма Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° YAML Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° Kubernetes ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π° Π½Π° слСднитС ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ:

  • API Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ΠΈ. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ Π² Ρ‚Π°Π·ΠΈ катСгория провСряват YAML манифСста спрямо изискванията Π½Π° Kubernetes API ΡΡŠΡ€Π²ΡŠΡ€Π°.
  • Π“ΠΎΡ‚ΠΎΠ²ΠΈ тСстСри. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ Ρ‚Π°Π·ΠΈ катСгория ΠΈΠ΄Π²Π°Ρ‚ с Π³ΠΎΡ‚ΠΎΠ²ΠΈ тСстовС Π·Π° сигурност, ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ с Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΈ Π΄Ρ€.
  • ΠŸΠ΅Ρ€ΡΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ Π²Π°Π»ΠΈΠ΄Π°Ρ‚ΠΎΡ€ΠΈ. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚Π΅Π»ΠΈΡ‚Π΅ Π½Π° Ρ‚Π°Π·ΠΈ катСгория Π²ΠΈ позволяват Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ пСрсонализирани тСстовС Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΅Π·ΠΈΡ†ΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Rego ΠΈ Javascript.

Π’ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ опишСм ΠΈ сравним ΡˆΠ΅ΡΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ инструмСнта:

  1. ΠΊΡƒΠ±Π΅Π²Π°Π»;
  2. kube-Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚;
  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 Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°.

ΠœΠ°Π½ΠΈΡ„Π΅ΡΡ‚ΡŠΡ‚ описва ΡƒΠ΅Π± ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, чиято основна Π·Π°Π΄Π°Ρ‡Π° Π΅ Π΄Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈ със ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ β€žHello Worldβ€œ Π½Π° ΠΏΠΎΡ€Ρ‚ 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)

Ако успСС, kubeval Ρ‰Π΅ ΠΈΠ·Π»Π΅Π·Π΅ с ΠΈΠ·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ 0. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠΎ слСдния Π½Π°Ρ‡ΠΈΠ½:

$ echo $?
0

НСка сСга ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ kubeval с Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ манифСст:

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, трябва Π΄Π° Π²ΠΊΠ»ΡŽΡ‡Π²Π° сСлСктор, ΠΊΠΎΠΉΡ‚ΠΎ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° Π½Π° Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚Π° Π½Π° Π³Ρ€ΡƒΠΏΠ°Ρ‚Π°. ΠœΠ°Π½ΠΈΡ„Π΅ΡΡ‚ΡŠΡ‚ ΠΏΠΎ-Π³ΠΎΡ€Π΅ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π²Π° сСлСктора, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ kubeval ΡΡŠΠΎΠ±Ρ‰ΠΈ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ° ΠΈ ΠΈΠ·Π»Π΅Π·Π΅ с Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ ΠΎΡ‚ Π½ΡƒΠ»Π° ΠΊΠΎΠ΄.

Чудя сС ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ станС, Π°ΠΊΠΎ Π³ΠΎ направя 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

Π’ΠΎΠ²Π° Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ Π³Ρ€Π΅ΡˆΠΊΠ°Ρ‚Π°, Π·Π° която kubeval ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅Π΄ΠΈ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ ΠΏΠΎΠΏΡ€Π°Π²ΠΈΡ‚Π΅, ΠΊΠ°Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ сСлСктор:

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)

ΠŸΠΎΠ»Π·Π°Ρ‚Π° ΠΎΡ‚ инструмСнти ΠΊΠ°Ρ‚ΠΎ kubeval Π΅, Ρ‡Π΅ Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅Π·ΠΈ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΡƒΠ»ΠΎΠ²Π΅Π½ΠΈ Π² Π½Π°Ρ‡Π°Π»ΠΎΡ‚ΠΎ Π½Π° Ρ†ΠΈΠΊΡŠΠ»Π° Π½Π° внСдряванС.

ОсвСн Ρ‚ΠΎΠ²Π° Ρ‚Π΅Π·ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π΅ изискват Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°; Ρ‚Π΅ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ ΠΎΡ„Π»Π°ΠΉΠ½.

По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ kubeval провСрява рСсурситС спрямо Π½Π°ΠΉ-Π½ΠΎΠ²Π°Ρ‚Π° API схСма Π½Π° Kubernetes. Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π² ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ случаи ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°Π»ΠΎΠΆΠΈ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ спрямо ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π° Kubernetes. Π’ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° станС с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ„Π»Π°Π³Π° --kubernetes-version:

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

Моля, ΠΈΠΌΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ вСрсията трябва Π΄Π° бъдС посочСна във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Major.Minor.Patch.

Π—Π° списък с вСрсии, Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°, Π²ΠΈΠΆΡ‚Π΅ JSON схСма Π² GitHub, ΠΊΠΎΠΉΡ‚ΠΎ kubeval ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅. Ако трябва Π΄Π° стартиратС kubeval ΠΎΡ„Π»Π°ΠΉΠ½, ΠΈΠ·Ρ‚Π΅Π³Π»Π΅Ρ‚Π΅ схСмитС ΠΈ посочСтС Π»ΠΎΠΊΠ°Π»Π½ΠΎΡ‚ΠΎ ΠΈΠΌ мСстополоТСниС с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ„Π»Π°Π³Π° --schema-location.

Π’ допълнСниС към ΠΎΡ‚Π΄Π΅Π»Π½ΠΈΡ‚Π΅ YAML Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, kubeval ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ с Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ stdin.

Π’ допълнСниС, Kubeval лСсно сС ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π° Π² CI Ρ‚Ρ€ΡŠΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°. Π’Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ТСлаят Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΡΡ‚ тСстовС, ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° изпратят манифСсти към ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°, Ρ‰Π΅ сС Ρ€Π°Π΄Π²Π°Ρ‚ Π΄Π° знаят, Ρ‡Π΅ kubeval ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Ρ‚Ρ€ΠΈ ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°:

  1. ОбикновСн тСкст;
  2. JSON;
  3. Test Anything Protocol (TAP).

ВсСки ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ‚Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ…ΠΎΠ΄Π°, Π·Π° Π΄Π° сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΎΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π½Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ ТСлания Ρ‚ΠΈΠΏ.

Π•Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈΡ‚Π΅ Π½Π° kubeval Π΅, Ρ‡Π΅ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° провСрява Π·Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ с пСрсонализирани Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΠΈ Π½Π° рСсурси (CRD). Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π° Π΅ възмоТно Π΄Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Ρ‚Π΅ kubeval ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€Π°ΠΉ Π³ΠΈ.

Kubeval Π΅ чудСсСн инструмСнт Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΈ ΠΎΡ†Π΅Π½ΠΊΠ° Π½Π° рСсурси; Врябва ΠΎΠ±Π°Ρ‡Π΅ Π΄Π° сС ΠΏΠΎΠ΄Ρ‡Π΅Ρ€Ρ‚Π°Π΅, Ρ‡Π΅ ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° тСста Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ Ρ€Π΅ΡΡƒΡ€ΡΡŠΡ‚ отговаря Π½Π° Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ.

НапримСр с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚Π° latest Π² ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π΅ слСдва Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ. Kubeval ΠΎΠ±Π°Ρ‡Π΅ Π½Π΅ счита Ρ‚ΠΎΠ²Π° Π·Π° Π³Ρ€Π΅ΡˆΠΊΠ° ΠΈ Π½Π΅ я Π΄ΠΎΠΊΠ»Π°Π΄Π²Π°. Π’ΠΎΠ²Π° ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° Π½Π° Ρ‚Π°ΠΊΡŠΠ² YAML Ρ‰Π΅ Π·Π°Π²ΡŠΡ€ΡˆΠΈ Π±Π΅Π· прСдупрСТдСния.

Но ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ станС, Π°ΠΊΠΎ искатС Π΄Π° ΠΎΡ†Π΅Π½ΠΈΡ‚Π΅ YAML ΠΈ Π΄Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Ρ‚Π΅ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΡ ΠΊΠ°Ρ‚ΠΎ Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚Π° latest? Как Π΄Π° провСря YAML Ρ„Π°ΠΉΠ» спрямо Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ?

2. ΠšΡƒΠ±Π΅-Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚

ΠšΡƒΠ±Π΅-Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° YAML манифСсти ΠΈ Π³ΠΈ оцСнява спрямо Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ тСстовС. Π’Π΅Π·ΠΈ тСстовС са ΠΈΠ·Π±Ρ€Π°Π½ΠΈ въз основа Π½Π° указания Π·Π° сигурност ΠΈ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ, ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

  • ИзпълнСниС Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° Π½Π΅ ΠΊΠ°Ρ‚ΠΎ root.
  • НаличиС Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° Π·Π΄Ρ€Π°Π²Π΅Ρ‚ΠΎ Π½Π° капсулитС.
  • Π—Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° заявки ΠΈ Π»ΠΈΠΌΠΈΡ‚ΠΈ Π·Π° рСсурси.

Π’ΡŠΠ· основа Π½Π° Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ тСста сС Π΄Π°Π²Π°Ρ‚ Ρ‚Ρ€ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚Π°: OK, ΠŸΠ Π•Π”Π£ΠŸΠ Π•Π–Π”Π•ΠΠ˜Π• ΠΈ КРИВИЧНО.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΡ€ΠΎΠ±Π²Π°Ρ‚Π΅ Kube-score ΠΎΠ½Π»Π°ΠΉΠ½ ΠΈΠ»ΠΈ Π΄Π° Π³ΠΎ инсталиратС Π»ΠΎΠΊΠ°Π»Π½ΠΎ.

Към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° писанС Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° статия Π½Π°ΠΉ-Π½ΠΎΠ²Π°Ρ‚Π° вСрсия Π½Π° kube-score бСшС 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 ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π° kubeval тСстовС, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ kube-score посочва слСднитС Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈ:

  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΡ‚Π΅ Π·Π° готовност Π½Π΅ са ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΈ.
  • Няма заявки ΠΈΠ»ΠΈ ограничСния Π·Π° CPU рСсурси ΠΈ ΠΏΠ°ΠΌΠ΅Ρ‚.
  • Π‘ΡŽΠ΄ΠΆΠ΅Ρ‚ΠΈΡ‚Π΅ Π·Π° ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅ Π½Π° капсулитС Π½Π΅ са посочСни.
  • Няма ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° раздСлянС (Π°Π½Ρ‚ΠΈ-Π°Ρ„ΠΈΠ½ΠΈΡ‚Π΅Ρ‚) Π·Π° Π΄Π° ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚Π΅ максимално наличността.
  • ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΡŠΡ‚ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ root.

Π’ΠΎΠ²Π° са всички Π²Π°Π»ΠΈΠ΄Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ относно Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ†ΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ трябва Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈ, Π·Π° Π΄Π° бъдС Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅Ρ‚ΠΎ ΠΏΠΎ-Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎ.

ΠžΡ‚Π±ΠΎΡ€ 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

Подобно Π½Π° kubeval, kube-score Π²Ρ€ΡŠΡ‰Π° Π½Π΅Π½ΡƒΠ»Π΅Π² ΠΈΠ·Ρ…ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΠ³Π°Ρ‚ΠΎ ΠΈΠΌΠ° тСст, ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ΅Π½ КРИВИЧНО. ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π΄Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Ρ‚Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π·Π° ΠŸΠ Π•Π”Π£ΠŸΠ Π•Π–Π”Π•ΠΠ˜Π•.

ОсвСн Ρ‚ΠΎΠ²Π° Π΅ възмоТно Π΄Π° сС провСряват рСсурситС Π·Π° ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ вСрсии Π½Π° API (ΠΊΠ°ΠΊΡ‚ΠΎ Π² kubeval). Π’Π°Π·ΠΈ информация ΠΎΠ±Π°Ρ‡Π΅ Π΅ Ρ‚Π²ΡŠΡ€Π΄ΠΎ ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π° Π² самия kube-score: Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° вСрсия Π½Π° Kubernetes. Π’ΠΎΠ²Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС голям ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, Π°ΠΊΠΎ Π²ΡŠΠ·Π½Π°ΠΌΠ΅Ρ€ΡΠ²Π°Ρ‚Π΅ Π΄Π° надстроитС своя ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ ΠΈΠ»ΠΈ Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ няколко ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ вСрсии Π½Π° K8s.

Моля, ΠΈΠΌΠ°ΠΉΡ‚Π΅ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ Π²Π΅Ρ‡Π΅ ΠΈΠΌΠ° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Ρ‚Π°Π·ΠΈ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚.

ΠŸΠΎΠ²Π΅Ρ‡Π΅ информация Π·Π° kube-score ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π΅Π½ сайт.

Kube-score тСстовСтС са чудСсСн инструмСнт Π·Π° внСдряванС Π½Π° Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ, Π½ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ станС, Π°ΠΊΠΎ трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² тСста ΠΈΠ»ΠΈ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ свои собствСни ΠΏΡ€Π°Π²ΠΈΠ»Π°? Π£Π²ΠΈ, Ρ‚ΠΎΠ²Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° станС.

Kube-score Π½Π΅ Π΅ Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ΅ΠΌ: Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° добавятС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ към Π½Π΅Π³ΠΎ ΠΈΠ»ΠΈ Π΄Π° Π³ΠΈ ΠΊΠΎΡ€ΠΈΠ³ΠΈΡ€Π°Ρ‚Π΅.

Ако трябва Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ пСрсонализирани тСстовС, Π·Π° Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅Ρ‚ΠΎ с Ρ„ΠΈΡ€ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ слСднитС Ρ‡Π΅Ρ‚ΠΈΡ€ΠΈ инструмСнта: config-lint, copper, conftest ΠΈΠ»ΠΈ polaris.

3.Config-lint

Config-lint Π΅ инструмСнт Π·Π° Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° YAML, JSON, Terraform, CSV ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ манифСсти Π½Π° Kubernetes.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ инсталиратС с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° инструкции Π½Π° уСбсайта Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π’Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° вСрсия към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° писанС Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° статия Π΅ 1.5.0.

Config-lint няма Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ тСстовС Π·Π° Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° манифСститС Π½Π° Kubernetes.

Π—Π° Π΄Π° ΠΏΡ€ΠΎΠ²Π΅ΠΆΠ΄Π°Ρ‚Π΅ тСстовС, трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ подходящи ΠΏΡ€Π°Π²ΠΈΠ»Π°. Π’Π΅ са написани Π² YAML Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΈ "rulesets" (Π½Π°Π±ΠΎΡ€ΠΈ ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π°)ΠΈ ΠΈΠΌΠ°Ρ‚ слСдната структура:

version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
  - "*.yaml"
rules:
   # список ΠΏΡ€Π°Π²ΠΈΠ»

(rule.yaml)

НСка Π³ΠΎ ΠΏΡ€ΠΎΡƒΡ‡ΠΈΠΌ ΠΏΠΎ-ΠΎΡ‚Π±Π»ΠΈΠ·ΠΎ:

  • ΠžΠ±Π»Π°ΡΡ‚ type ΡƒΠΊΠ°Π·Π²Π° какъв Ρ‚ΠΈΠΏ конфигурация Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° config-lint. Π—Π° манифСститС Π½Π° K8s Ρ‚ΠΎΠ²Π° Π΅ Π²ΠΈΠ½Π°Π³ΠΈ Kubernetes.
  • Π’ областта files Π’ допълнСниС към самитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° посочитС дирСктория.
  • ΠžΠ±Π»Π°ΡΡ‚ rules ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Π·Π° настройка Π½Π° потрСбитСлски тСстовС.

Π”Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ΅ΠΌ, Ρ‡Π΅ искатС Π΄Π° стС сигурни, Ρ‡Π΅ изобраТСнията Π² Deployment Π²ΠΈΠ½Π°Π³ΠΈ сС изтСглят ΠΎΡ‚ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΊΠ°Ρ‚ΠΎ 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 Π΅ ΠΎΠ±Π΅Ρ‰Π°Π²Π°Ρ‰Π° Ρ€Π°ΠΌΠΊΠ°, която Π²ΠΈ позволява Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ свои собствСни тСстовС Π·Π° Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° Kubernetes YAML манифСсти с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° YAML DSL.

Но ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ станС, Π°ΠΊΠΎ ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ ΠΏΠΎ-слоТна Π»ΠΎΠ³ΠΈΠΊΠ° ΠΈ тСстовС? YAML Π½Π΅ Π΅ Π»ΠΈ Ρ‚Π²ΡŠΡ€Π΄Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π·Π° Ρ‚ΠΎΠ²Π°? Какво Ρ‰Π΅ станС, Π°ΠΊΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ тСстовС Π½Π° пълСн Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅?

4. МСд

МСд V2 Π΅ Ρ€Π°ΠΌΠΊΠ° Π·Π° Π²Π°Π»ΠΈΠ΄ΠΈΡ€Π°Π½Π΅ Π½Π° манифСсти с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° пСрсонализирани тСстовС (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° config-lint).

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Ρ‚ΠΎΠΉ сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° ΠΎΡ‚ послСдния ΠΏΠΎ Ρ‚ΠΎΠ²Π°, Ρ‡Π΅ Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° YAML Π·Π° описванС Π½Π° тСстовС. ВмСсто Ρ‚ΠΎΠ²Π° тСстовСтС ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ написани Π½Π° JavaScript. Copper прСдоставя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с няколко основни инструмСнта, ΠΊΠΎΠΈΡ‚ΠΎ Π²ΠΈ ΠΏΠΎΠΌΠ°Π³Π°Ρ‚ Π΄Π° Ρ‡Π΅Ρ‚Π΅Ρ‚Π΅ информация Π·Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈΡ‚Π΅ Π½Π° Kubernetes ΠΈ Π΄Π° ΡΡŠΠΎΠ±Ρ‰Π°Π²Π°Ρ‚Π΅ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ.

Π‘Ρ‚ΡŠΠΏΠΊΠΈΡ‚Π΅ Π·Π° инсталиранС Π½Π° Copper ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π½Π°ΠΌΠ΅Ρ€Π΅Π½ΠΈ Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π° докумСнтация.

2.0.1 Π΅ Π½Π°ΠΉ-Π½ΠΎΠ²Π°Ρ‚Π° вСрсия Π½Π° Ρ‚Π°Π·ΠΈ ΠΏΠΎΠΌΠΎΡ‰Π½Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠ° към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° писанС Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° статия.

Подобно Π½Π° config-lint, Copper няма Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ тСстовС. Π”Π° напишСм Π΅Π΄Π½ΠΎ. НСка ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ Π΄Π°Π»ΠΈ внСдряванията ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ изобраТСния Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΎΡ‚ Π½Π°Π΄Π΅ΠΆΠ΄Π½ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΊΠ°Ρ‚ΠΎ 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

Ясно Π΅, Ρ‡Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° ΠΌΠ΅Π΄ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚Π΅ ΠΏΠΎ-слоТни тСстовС - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΈΠΌΠ΅Π½Π°Ρ‚Π° Π½Π° Π΄ΠΎΠΌΠ΅ΠΉΠ½ΠΈ Π² манифСститС Π½Π° Ingress ΠΈΠ»ΠΈ ΠΎΡ‚Ρ…Π²ΡŠΡ€Π»ΡΠ½Π΅ Π½Π° ΠΏΠΎΠ΄ΠΎΠ²Π΅, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ Π² ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ Ρ€Π΅ΠΆΠΈΠΌ.

ΠœΠ΅Π΄Ρ‚Π° ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ Π² нСя:

  • DockerImage Ρ‡Π΅Ρ‚Π΅ посочСния Π²Ρ…ΠΎΠ΄Π΅Π½ Ρ„Π°ΠΉΠ» ΠΈ създава ΠΎΠ±Π΅ΠΊΡ‚ със слСднитС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΈ:
    • name - ΠΈΠΌΠ΅ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ,
    • tag - Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ,
    • registry - Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€ Π½Π° изобраТСнията,
    • registry_url - ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» (https://) ΠΈ Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€ Π½Π° изобраТСнията,
    • fqin β€” пълно мСстополоТСниС Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ.
  • Ѐункция findByName ΠΏΠΎΠΌΠ°Π³Π° Π·Π° Π½Π°ΠΌΠΈΡ€Π°Π½Π΅ Π½Π° рСсурс ΠΏΠΎ Π΄Π°Π΄Π΅Π½ Ρ‚ΠΈΠΏ (kind) ΠΈ ΠΈΠΌΠ΅ (name) ΠΎΡ‚ входния Ρ„Π°ΠΉΠ».
  • Ѐункция findByLabels ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° сС Π½Π°ΠΌΠ΅Ρ€ΠΈ рСсурс ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ‚ΠΈΠΏ (kind) ΠΈ Π΅Ρ‚ΠΈΠΊΠ΅Ρ‚ΠΈ (labels).

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ всички Π½Π°Π»ΠΈΡ‡Π½ΠΈ сСрвизни Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ‚ΡƒΠΊ.

По ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Ρ‚ΠΎΠΉ Π·Π°Ρ€Π΅ΠΆΠ΄Π° цСлия Π²Ρ…ΠΎΠ΄Π΅Π½ YAML Ρ„Π°ΠΉΠ» Π² ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° $$ ΠΈ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ Π·Π° скриптовС (ΠΏΠΎΠ·Π½Π°Ρ‚Π° Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° Π·Π° Ρ‚Π΅Π·ΠΈ с ΠΎΠΏΠΈΡ‚ Π² jQuery).

ΠžΡΠ½ΠΎΠ²Π½ΠΎΡ‚ΠΎ прСдимство Π½Π° Copper Π΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ: Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π²Π»Π°Π΄Π΅Π΅Ρ‚Π΅ спСциализиран Π΅Π·ΠΈΠΊ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° JavaScript, Π·Π° Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ свои собствСни тСстовС, ΠΊΠ°Ρ‚ΠΎ интСрполация Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ‚.Π½.

Врябва ΡΡŠΡ‰ΠΎ Π΄Π° сС ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠΈ, Ρ‡Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π°Ρ‚Π° вСрсия Π½Π° Copper Ρ€Π°Π±ΠΎΡ‚ΠΈ с вСрсията ES5 Π½Π° двигатСля Π½Π° JavaScript, Π° Π½Π΅ с ES6.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ са Π½Π°Π»ΠΈΡ‡Π½ΠΈ Π½Π° официалния уСбсайт Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Ако ΠΎΠ±Π°Ρ‡Π΅ наистина Π½Π΅ харСсватС JavaScript ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚Π΅ Π΅Π·ΠΈΠΊ, спСциално създадСн Π·Π° създаванС Π½Π° заявки ΠΈ описванС Π½Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, трябва Π΄Π° ΠΎΠ±ΡŠΡ€Π½Π΅Ρ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° conftest.

5. ΠšΠΎΠ½ΠΊΡƒΡ€Ρ

Conftest Π΅ Ρ€Π°ΠΌΠΊΠ° Π·Π° тСстванС Π½Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Π΄Π°Π½Π½ΠΈ. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° подходящ Π·Π° тСстванС/ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Kubernetes манифСсти. ВСстовСтС са описани с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° спСциализиран Π΅Π·ΠΈΠΊ Π·Π° заявки Π Π΅Π³ΠΎ.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° инсталиратС conftest, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ инструкцииизброСни Π½Π° уСбсайта Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° писанС Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° статия послСдната Π½Π°Π»ΠΈΡ‡Π½Π° вСрсия бСшС 0.18.2.

Подобно Π½Π° config-lint ΠΈ copper, conftest ΠΈΠ΄Π²Π° Π±Π΅Π· Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ тСстовС. НСка Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΡ€ΠΎΠ±Π²Π°ΠΌΠ΅ ΠΈ Π΄Π° напишСм Π½Π°ΡˆΠ°Ρ‚Π° собствСна ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°. ΠšΠ°ΠΊΡ‚ΠΎ Π² ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ, Ρ‰Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π΄Π°Π»ΠΈ изобраТСнията Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π° са Π²Π·Π΅Ρ‚ΠΈ ΠΎΡ‚ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ.

Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ дирСктория 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

Π’Π΅ΡΡ‚ΡŠΡ‚ ΠΎΡ‡Π°ΠΊΠ²Π°Π½ΠΎ сС ΠΏΡ€ΠΎΠ²Π°Π»ΠΈ, Π·Π°Ρ‰ΠΎΡ‚ΠΎ изобраТСнията ΠΈΠ΄Π²Π°Ρ‚ ΠΎΡ‚ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ.

Π’ΡŠΠ² Ρ„Π°ΠΉΠ»Π° Rego Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ Π±Π»ΠΎΠΊΠ° deny. Π˜ΡΡ‚ΠΈΠ½Π°Ρ‚Π° ΠΌΡƒ сС счита Π·Π° Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅. Ако Π±Π»ΠΎΠΊΠΎΠ²Π΅ deny няколко, conftest Π³ΠΈ провСрява нСзависимо Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ ΠΈ истинността Π½Π° всСки ΠΎΡ‚ Π±Π»ΠΎΠΊΠΎΠ²Π΅Ρ‚Π΅ сС Ρ‚Ρ€Π΅Ρ‚ΠΈΡ€Π° ΠΊΠ°Ρ‚ΠΎ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅.

Π’ допълнСниС към ΠΈΠ·Ρ…ΠΎΠ΄Π° ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅, conftest ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° JSON, TAP ΠΈ Ρ‚Π°Π±Π»ΠΈΡ‡Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ - ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Π° функция, Π°ΠΊΠΎ трябва Π΄Π° Π²Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ Π² ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ CI ΠΊΠ°Π½Π°Π». ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅Ρ‚Π΅ ТСлания Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Ρ„Π»Π°Π³Π° --output.

Π—Π° Π΄Π° улСсни отстраняванСто Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ Π² ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈΡ‚Π΅, conftest ΠΈΠΌΠ° Ρ„Π»Π°Π³ --trace. Π’ΠΎΠΉ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° слСда Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ conftest Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π° посочСнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ с ΠΏΡ€Π°Π²ΠΈΠ»Π°.

ΠŸΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈΡ‚Π΅ Π½Π° конкурса ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ΠΈ ΠΈ сподСляни Π² рСгистритС Π½Π° OCI (Open Container Initiative) ΠΊΠ°Ρ‚ΠΎ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ΠΈ.

ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ push ΠΈ pull Π²ΠΈ позволяват Π΄Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Ρ‚Π΅ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Ρ‚Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚ ΠΎΡ‚ ΠΎΡ‚Π΄Π°Π»Π΅Ρ‡Π΅Π½ Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€. НСка ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°Ρ‚Π°, която ΡΡŠΠ·Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅, Π² локалния Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€ Π½Π° Docker, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ conftest push.

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ вашия Π»ΠΎΠΊΠ°Π»Π΅Π½ Ρ€Π΅Π³ΠΈΡΡ‚ΡŠΡ€ Π½Π° Docker:

$ 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), ΠΊΠΎΠ΅Ρ‚ΠΎ Π²ΠΈ позволява Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ conftest Π·Π° изпълнСниС Π½Π° тСстовС ΠΎΡ‚ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈ OPA ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° сподСлянСто Π½Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° confest Π½Π° официалния уСбсайт Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

6. ΠŸΠΎΠ»ΡΡ€Π½Π°Ρ‚Π° Π·Π²Π΅Π·Π΄Π°

ΠŸΠΎΡΠ»Π΅Π΄Π½ΠΈΡΡ‚ инструмСнт, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ бъдС обсъдСн Π² Ρ‚Π°Π·ΠΈ статия, Π΅ ΠŸΠΎΠ»ΡΡ€Π½Π°Ρ‚Π° Π·Π²Π΅Π·Π΄Π°. (НСговото миналогодишно ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ Π½ΠΈΠ΅ Π²Π΅Ρ‡Π΅ Π΅ ΠΏΡ€Π΅Π²Π΅Π΄Π΅Π½ΠΎ - ΠΏΡ€ΠΈΠ±Π». ΠΏΡ€Π΅Π²ΠΎΠ΄)

Polaris ΠΌΠΎΠΆΠ΅ Π΄Π° сС инсталира Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ ΠΈΠ»ΠΈ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅Π½ Ρ€Π΅Π΄. ΠšΠ°ΠΊΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π±ΠΈ сС досСщатС, Ρ‚ΠΎΠ²Π° Π²ΠΈ позволява Π΄Π° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€Π°Ρ‚Π΅ статично манифСститС Π½Π° Kubernetes.

ΠšΠΎΠ³Π°Ρ‚ΠΎ сС изпълнява Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅Π½ Ρ€Π΅Π΄, са Π½Π°Π»ΠΈΡ‡Π½ΠΈ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ тСстовС, ΠΎΠ±Ρ…Π²Π°Ρ‰Π°Ρ‰ΠΈ области ΠΊΠ°Ρ‚ΠΎ сигурност ΠΈ Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π½Π° kube-score). ОсвСн Ρ‚ΠΎΠ²Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ свои собствСни тСстовС (ΠΊΠ°ΠΊΡ‚ΠΎ Π² config-lint, copper ΠΈ conftest).

Π‘ Π΄Ρ€ΡƒΠ³ΠΈ Π΄ΡƒΠΌΠΈ, Polaris ΡΡŠΡ‡Π΅Ρ‚Π°Π²Π° прСдимствата Π½Π° Π΄Π²Π΅Ρ‚Π΅ ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ инструмСнти: с Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ ΠΈ пСрсонализирани тСстовС.

Π—Π° Π΄Π° инсталиратС Polaris Π² Ρ€Π΅ΠΆΠΈΠΌ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π΅Π½ Ρ€Π΅Π΄, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ инструкции Π½Π° уСбсайта Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° писанС Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° статия Π΅ Π½Π°Π»ΠΈΡ‡Π½Π° вСрсия 1.0.3.

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ инсталацията ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° стартиратС polaris Π½Π° манифСста 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": [
    /* Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ список */
  ]
}

НаличСн пълСн ΠΈΠ·Ρ…ΠΎΠ΄ Ρ‚ΡƒΠΊ.

Подобно Π½Π° kube-score, Polaris ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π² области, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΠΌΠ°Π½ΠΈΡ„Π΅ΡΡ‚ΡŠΡ‚ Π½Π΅ отговаря Π½Π° Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ:

  • Няма Π·Π΄Ρ€Π°Π²Π½ΠΈ ΠΏΡ€Π΅Π³Π»Π΅Π΄ΠΈ Π·Π° подс.
  • Π’Π°Π³ΠΎΠ²Π΅ Π·Π° изобраТСния Π½Π° ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈ Π½Π΅ са посочСни.
  • ΠšΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΡŠΡ‚ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ root.
  • Заявки ΠΈ Π»ΠΈΠΌΠΈΡ‚ΠΈ Π·Π° ΠΏΠ°ΠΌΠ΅Ρ‚ ΠΈ процСсор Π½Π΅ са посочСни.

На всСки тСст, Π² зависимост ΠΎΡ‚ Π½Π΅Π³ΠΎΠ²ΠΈΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ, сС опрСдСля стСпСн Π½Π° критичност: ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ опасност. Π—Π° Π΄Π° Π½Π°ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Π½Π°Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ тСстовС, Π²ΠΈΠΆΡ‚Π΅ докумСнтация.

Ако Π½Π΅ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ подробности, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° посочитС Ρ„Π»Π°Π³Π° --format score. Π’ Ρ‚ΠΎΠ·ΠΈ случай Polaris Ρ‰Π΅ ΠΈΠ·Π²Π΅Π΄Π΅ число Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π° ΠΎΡ‚ 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, Π° самият тСст Π΅ описан с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° JSON схСма.

БлСдният YAML ΠΊΠΎΠ΄ΠΎΠ² Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ описва Π½ΠΎΠ² тСст, ΠΈΠ·Π²ΠΈΠΊΠ°Π½ 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 ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° сС Π·Π° сравняванС Π½Π° ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с нСобходимия.

Π—Π° Π΄Π° ΠΈΠ·ΠΏΡŠΠ»Π½ΠΈΡ‚Π΅ горния тСст, трябва Π΄Π° ΡΡŠΠ·Π΄Π°Π΄Π΅Ρ‚Π΅ слСдната конфигурация Π½Π° Polaris:

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, Polaris Ρ‰Π΅ Π·Π°Π²ΡŠΡ€ΡˆΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ. ΠœΠ°Π½ΠΈΡ„Π΅ΡΡ‚ΡŠΡ‚ с ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²Π΅Ρ‡Π΅ Π΅ Π² сила Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°Ρ‚Π°ΠΊΠ° Ρ‡Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π΅Π΄ΠΈΡˆΠ½Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² манифСста 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 допълва Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈΡ‚Π΅ тСстовС с пСрсонализирани, ΠΊΠ°Ρ‚ΠΎ ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ ΡΡŠΡ‡Π΅Ρ‚Π°Π²Π° Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΎΡ‚ΠΎ ΠΎΡ‚ Π΄Π²Π°Ρ‚Π° свята.

ΠžΡ‚ Π΄Ρ€ΡƒΠ³Π° страна, Π½Π΅Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ ΠΏΠΎ-ΠΌΠΎΡ‰Π½ΠΈ Π΅Π·ΠΈΡ†ΠΈ ΠΊΠ°Ρ‚ΠΎ Rego ΠΈΠ»ΠΈ JavaScript ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π°Ρ‰ Ρ„Π°ΠΊΡ‚ΠΎΡ€, прСдотвратяващ ΡΡŠΠ·Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΠΎ-слоТни тСстовС.

ΠŸΠΎΠ²Π΅Ρ‡Π΅ информация Π·Π° Polaris ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° сайт Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

ΠžΠ±ΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅

Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°Π»ΠΈΡ‡Π½ΠΈ инструмСнти Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΈ ΠΎΡ†Π΅Π½ΠΊΠ° Π½Π° Kubernetes YAML Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, Π²Π°ΠΆΠ½ΠΎ Π΅ Π΄Π° ΠΈΠΌΠ°Ρ‚Π΅ ясно Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½ΠΈ ΠΈ изпълнСни тСстовСтС.

НапримСр, Π°ΠΊΠΎ Π²Π·Π΅ΠΌΠ΅Ρ‚Π΅ манифСститС Π½Π° Kubernetes, ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Ρ‰ΠΈ ΠΏΡ€Π΅Π· Ρ‚Ρ€ΡŠΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄, kubeval ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС ΠΏΡŠΡ€Π²Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° Π² Ρ‚Π°ΠΊΡŠΠ² Ρ‚Ρ€ΡŠΠ±ΠΎΠΏΡ€ΠΎΠ²ΠΎΠ΄. Π©Π΅ слСди Π΄Π°Π»ΠΈ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ‚Π΅ Π½Π° ΠΎΠ±Π΅ΠΊΡ‚ΠΈ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π°Ρ‚ Π½Π° схСмата Π½Π° Kubernetes API.

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π°ΠΊΡŠΠ² ΠΏΡ€Π΅Π³Π»Π΅Π΄ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡ΠΈ, ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΏΡ€Π΅ΠΌΠΈΠ½Π΅ към ΠΏΠΎ-слоТни тСстовС, ΠΊΠ°Ρ‚ΠΎ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΈΠ΅ със стандартнитС Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΈ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ. Π’ΠΎΠ²Π° Π΅ мястото, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ kube-score ΠΈ Polaris Π±ΠΈΡ…Π° Π±ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ.

Π—Π° Ρ‚Π΅Π·ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ ΠΈΠΌΠ°Ρ‚ слоТни изисквания ΠΈ трябва Π΄Π° пСрсонализират тСстовСтС Π² Π΄Π΅Ρ‚Π°ΠΉΠ»ΠΈ, ΠΌΠ΅Π΄, config-lint ΠΈ conftest Π±ΠΈΡ…Π° Π±ΠΈΠ»ΠΈ подходящи.

Conftest ΠΈ config-lint ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ YAML Π·Π° Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π°Π½Π΅ Π½Π° пСрсонализирани тСстовС, Π° copper Π²ΠΈ Π΄Π°Π²Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ пълСн Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅, ΠΊΠΎΠ΅Ρ‚ΠΎ Π³ΠΎ ΠΏΡ€Π°Π²ΠΈ доста ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ°Ρ‚Π΅Π»Π΅Π½ ΠΈΠ·Π±ΠΎΡ€.

ΠžΡ‚ Π΄Ρ€ΡƒΠ³Π° страна, струва Π»ΠΈ си Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Ρ‚Π΅Π·ΠΈ инструмСнти ΠΈ слСдоватСлно Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ всички тСстовС Ρ€ΡŠΡ‡Π½ΠΎ ΠΈΠ»ΠΈ Π΄Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ Polaris ΠΈ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ само Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ към Π½Π΅Π³ΠΎ? Няма ясСн ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ Π½Π° Ρ‚ΠΎΠ·ΠΈ Π²ΡŠΠΏΡ€ΠΎΡ.

Π’Π°Π±Π»ΠΈΡ†Π°Ρ‚Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ прСдоставя ΠΊΡ€Π°Ρ‚ΠΊΠΎ описаниС Π½Π° всСки инструмСнт:

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚
съдба
ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ
ΠŸΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡΠΊΠΈ тСстовС

ΠΊΡƒΠ±Π΅Π²Π°Π»
Π’Π°Π»ΠΈΠ΄ΠΈΡ€Π° YAML манифСститС спрямо ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π° вСрсия Π½Π° API схСмата
НС ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ с CRD
НС

kube-Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚
Анализира YAML манифСститС спрямо Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ
НС ΠΌΠΎΠ³Π° Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π° Π²Π°ΡˆΠ°Ρ‚Π° вСрсия Π½Π° Kubernetes API Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° рСсурситС
НС

ΠΌΠ΅Π΄
ΠžΠ±Ρ‰Π° Ρ€Π°ΠΌΠΊΠ° Π·Π° създаванС Π½Π° пСрсонализирани JavaScript тСстовС Π·Π° YAML манифСсти
Няма Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ тСстовС. Π›ΠΎΡˆΠ° докумСнтация
Π”Π°

config-lint
ΠžΠ±Ρ‰Π° Ρ€Π°ΠΌΠΊΠ° Π·Π° създаванС Π½Π° тСстовС Π½Π° спСцифичСн Π·Π° Π΄ΠΎΠΌΠ΅ΠΉΠ½ Π΅Π·ΠΈΠΊ, Π²Π³Ρ€Π°Π΄Π΅Π½ Π² YAML. ΠŸΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈ (Π½Π°ΠΏΡ€. Terraform)
Няма Π³ΠΎΡ‚ΠΎΠ²ΠΈ тСстовС. Π’Π³Ρ€Π°Π΄Π΅Π½ΠΈΡ‚Π΅ Ρ‚Π²ΡŠΡ€Π΄Π΅Π½ΠΈΡ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ са Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΈ
Π”Π°

конкурс
Π Π°ΠΌΠΊΠ° Π·Π° създаванС Π½Π° ваши собствСни тСстовС с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Rego (спСциализиран Π΅Π·ΠΈΠΊ Π·Π° заявки). Позволява сподСлянС Π½Π° ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ Ρ‡Ρ€Π΅Π· OCI ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ
Няма Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ тСстовС. Врябва Π΄Π° Π½Π°ΡƒΡ‡Π° Rego. Docker Hub Π½Π΅ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΏΡ€ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½Π΅ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°
Π”Π°

ΠŸΠΎΠ»ΡΡ€Π½Π°Ρ‚Π° Π·Π²Π΅Π·Π΄Π°
ΠŸΡ€Π΅Π³Π»Π΅ΠΆΠ΄Π° YAML манифСститС спрямо стандартнитС Π½Π°ΠΉ-Π΄ΠΎΠ±Ρ€ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ. Позволява Π²ΠΈ Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ свои собствСни тСстовС с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° JSON Schema
Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈΡ‚Π΅ Π·Π° тСстванС Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° JSON схСма ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ са Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΈ
Π”Π°

Въй ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅Π·ΠΈ инструмСнти Π½Π΅ Ρ€Π°Π·Ρ‡ΠΈΡ‚Π°Ρ‚ Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° Kubernetes, Ρ‚Π΅ са лСсни Π·Π° инсталиранС. Π’Π΅ Π²ΠΈ позволяват Π΄Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°Ρ‚Π΅ ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ Π΄Π° прСдоставятС Π±ΡŠΡ€Π·Π° ΠΎΠ±Ρ€Π°Ρ‚Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ° Π½Π° Π°Π²Ρ‚ΠΎΡ€ΠΈΡ‚Π΅ Π½Π° заявки Π·Π° изтСглянС Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ.

PS ΠΎΡ‚ ΠΏΡ€Π΅Π²ΠΎΠ΄Π°Ρ‡Π°

ΠŸΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π² нашия Π±Π»ΠΎΠ³:

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€