เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฅเชพเช“ เช…เชจเซ‡ เชจเซ€เชคเชฟเช“ เชธเชพเชฎเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ YAML เชจเซ‡ เชฎเชพเชจเซเชฏ เช•เชฐเซ‹

เชจเซ‰เซ…เชง. เช…เชจเซเชตเชพเชฆ: K8s เชชเชฐเซเชฏเชพเชตเชฐเชฃเซ‹ เชฎเชพเชŸเซ‡ YAML เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจเซ‹เชจเซ€ เชตเชงเชคเซ€ เชœเชคเซ€ เชธเช‚เช–เซเชฏเชพ เชธเชพเชฅเซ‡, เชคเซ‡เชฎเชจเซ€ เชธเซเชตเชšเชพเชฒเชฟเชค เชšเช•เชพเชธเชฃเซ€เชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชค เชตเชงเซเชจเซ‡ เชตเชงเซ เชคเชพเช•เซ€เชฆเชจเซ€ เชฌเชจเซ€ เชฐเชนเซ€ เช›เซ‡. เช† เชธเชฎเซ€เช•เซเชทเชพเชจเชพ เชฒเซ‡เช–เช•เซ‡ เช† เช•เชพเชฐเซเชฏ เชฎเชพเชŸเซ‡ เชฎเชพเชคเซเชฐ เชนเชพเชฒเชจเชพ เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธ เชœ เชชเชธเช‚เชฆ เช•เชฐเซเชฏเชพ เชจเชฅเซ€, เชชเชฐเช‚เชคเซ เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเซ‡เช“ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชชเชฃ เชœเซ‹เชฏเซเช‚ เช›เซ‡. เช† เชตเชฟเชทเชฏเชฎเชพเช‚ เชฐเชธ เชงเชฐเชพเชตเชคเชพ เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡ เชคเซ‡ เช–เซ‚เชฌ เชœ เชฎเชพเชนเชฟเชคเซ€เชชเซเชฐเชฆ เชนเซ‹เชตเชพเชจเซเช‚ เชฌเชนเชพเชฐ เช†เชตเซเชฏเซเช‚ เช›เซ‡.

เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฅเชพเช“ เช…เชจเซ‡ เชจเซ€เชคเชฟเช“ เชธเชพเชฎเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ YAML เชจเซ‡ เชฎเชพเชจเซเชฏ เช•เชฐเซ‹

TL; DR: เช† เชฒเซ‡เช– เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฏเชพเชธเซ‹ เช…เชจเซ‡ เช†เชตเชถเซเชฏเช•เชคเชพเช“ เชธเชพเชฎเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ YAML เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชฎเชพเชจเซเชฏ เช…เชจเซ‡ เชฎเซ‚เชฒเซเชฏเชพเช‚เช•เชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช› เชธเซเชฅเชฟเชฐ เชธเชพเชงเชจเซ‹เชจเซ€ เชคเซเชฒเชจเชพ เช•เชฐเซ‡ เช›เซ‡.

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชตเชฐเซเช•เชฒเซ‹เชก เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ YAML เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹เชจเชพ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. YAML เชจเซ€ โ€‹โ€‹เชธเชฎเชธเซเชฏเชพเช“เชฎเชพเช‚เชจเซ€ เชเช• เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชซเชพเช‡เชฒเซ‹ เชตเชšเซเชšเซ‡เชจเชพ เช…เชตเชฐเซ‹เชงเซ‹ เช…เชฅเชตเชพ เชธเช‚เชฌเช‚เชงเซ‹เชจเซ‡ เชธเซเชชเชทเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเซเชถเซเช•เซ‡เชฒเซ€ เช›เซ‡.

เชœเซ‹ เช†เชชเชฃเซ‡ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เช•เซ‡ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชœเชฎเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชฌเชงเซ€ เช›เชฌเซ€เช“ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€เชฎเชพเช‚เชฅเซ€ เช†เชตเซ‡ เช›เซ‡?

PodDisruptionBudgets เชจ เชนเซ‹เชฏ เชคเซ‡เชตเชพ เชกเชฟเชชเซเชฒเซ‹เชฏเชฎเซ‡เชจเซเชŸเชจเซ‡ เชนเซเช‚ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชฎเซ‹เช•เชฒเชคเชพ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชฐเซ‹เช•เซ€ เชถเช•เซเช‚?

เชธเซเชŸเซ‡เชŸเชฟเช• เชŸเซ‡เชธเซเชŸเชฟเช‚เช—เชจเซเช‚ เชเช•เซ€เช•เชฐเชฃ เชคเชฎเชจเซ‡ เชตเชฟเช•เชพเชธเชจเชพ เชคเชฌเช•เซเช•เซ‡ เชญเซ‚เชฒเซ‹ เช…เชจเซ‡ เชจเซ€เชคเชฟเชจเชพ เช‰เชฒเซเชฒเช‚เช˜เชจเซ‹เชจเซ‡ เช“เชณเช–เชตเชพ เชฆเซ‡ เช›เซ‡. เช† เชฌเชพเช‚เชฏเชงเชฐเซ€ เชตเชงเชพเชฐเซ‡ เช›เซ‡ เช•เซ‡ เชธเช‚เชธเชพเชงเชจ เชตเซเชฏเชพเช–เซเชฏเชพเช“ เชธเชพเชšเซ€ เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เช›เซ‡, เช…เชจเซ‡ เช‰เชคเซเชชเชพเชฆเชจ เชตเชฐเซเช•เชฒเซ‹เชก เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฅเชพเช“เชจเซเช‚ เชชเชพเชฒเชจ เช•เชฐเชถเซ‡ เชคเซ‡เชตเซ€ เชถเช•เซเชฏเชคเชพ เชตเชงเชพเชฐเซ‡ เช›เซ‡.

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเซเชŸเซ‡เชŸเชฟเช• YAML เชซเชพเช‡เชฒ เชจเชฟเชฐเซ€เช•เซเชทเชฃ เช‡เช•เซ‹เชธเชฟเชธเซเชŸเชฎเชจเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชถเซเชฐเซ‡เชฃเซ€เช“เชฎเชพเช‚ เชตเชฟเชญเชพเชœเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡:

  • API เชฎเชพเชจเซเชฏเช•เชฐเซเชคเชพเช“. เช† เช•เซ‡เชŸเซ‡เช—เชฐเซ€เชจเชพ เชธเชพเชงเชจเซ‹ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ API เชธเชฐเซเชตเชฐเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹ เชธเชพเชฎเซ‡ YAML เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชคเชชเชพเชธเซ‡ เช›เซ‡.
  • เชคเซˆเชฏเชพเชฐ เชชเชฐเซ€เช•เซเชทเช•เซ‹. เช† เช•เซ‡เชŸเซ‡เช—เชฐเซ€เชจเชพ เชธเชพเชงเชจเซ‹ เชธเซเชฐเช•เซเชทเชพ, เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฅเชพเช“เชจเซเช‚ เชชเชพเชฒเชจ เชตเช—เซ‡เชฐเซ‡ เชฎเชพเชŸเซ‡ เชคเซˆเชฏเชพเชฐ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชธเชพเชฅเซ‡ เช†เชตเซ‡ เช›เซ‡.
  • เช•เชธเซเชŸเชฎ เชฎเชพเชจเซเชฏเช•เชฐเซเชคเชพเช“. เช† เช•เซ‡เชŸเซ‡เช—เชฐเซ€เชจเชพ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟเช“ เชคเชฎเชจเซ‡ เชตเชฟเชตเชฟเชง เชญเชพเชทเชพเช“เชฎเชพเช‚ เช•เชธเซเชŸเชฎ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฐเซ‡เช—เซ‹ เช…เชจเซ‡ เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸ.

เช† เชฒเซ‡เช–เชฎเชพเช‚ เช†เชชเชฃเซ‡ เช› เชœเซเชฆเชพ เชœเซเชฆเชพ เชธเชพเชงเชจเซ‹เชจเซเช‚ เชตเชฐเซเชฃเชจ เช…เชจเซ‡ เชคเซเชฒเชจเชพ เช•เชฐเซ€เชถเซเช‚:

  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 เช…เชจเซ‡ เช† เชฒเซ‡เช–เชฎเชพเช‚เชฅเซ€ เช…เชจเซเชฏ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเซ‹เชฎเชพเช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เช—เชฟเชŸ เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เช.

เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชเช• เชตเซ‡เชฌ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡ เชœเซ‡เชจเซเช‚ เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏ เชชเซ‹เชฐเซเชŸ 5678 เชชเชฐ "เชนเซ‡เชฒเซ‹ เชตเชฐเซเชฒเซเชก" เชธเช‚เชฆเซ‡เชถ เชธเชพเชฅเซ‡ เชชเซเชฐเชคเชฟเชธเชพเชฆ เช†เชชเชตเชพเชจเซเช‚ เช›เซ‡. เชคเซ‡เชจเซ‡ เชจเซ€เชšเซ‡เชจเชพ เช†เชฆเซ‡เชถ เชธเชพเชฅเซ‡ เช—เซ‹เช เชตเซ€ เชถเช•เชพเชฏ เช›เซ‡:

kubectl apply -f hello-world.yaml

เช…เชจเซ‡ เชคเซ‡เชฅเซ€ - เช•เชพเชฐเซเชฏ เชคเชชเชพเชธเซ‹:

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

เชนเชตเซ‡ เชชเชฐ เชœเชพเช“ http://localhost:8080 เช…เชจเซ‡ เช–เชพเชคเชฐเซ€ เช•เชฐเซ‹ เช•เซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เช•เชพเชฎ เช•เชฐเซ€ เชฐเชนเซ€ เช›เซ‡. เชชเชฐเช‚เชคเซ เชถเซเช‚ เชคเซ‡ เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฏเชพเชธเซ‹เชจเซเช‚ เชชเชพเชฒเชจ เช•เชฐเซ‡ เช›เซ‡? เชšเชพเชฒเซ‹ เชคเชชเชพเชธเซ€เช.

1. เช•เซเชฌเซ‡เชตเชฒ

เชจเชพ เชนเซƒเชฆเชฏ เชชเชฐ เช•เซเชฌเซ‡เชตเชฒ เชตเชฟเชšเชพเชฐ เช เช›เซ‡ เช•เซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชธเชพเชฅเซ‡เชจเซ€ เช•เซ‹เชˆเชชเชฃ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชคเซ‡เชจเชพ REST API เชฆเซเชตเชพเชฐเชพ เชฅเชพเชฏ เช›เซ‡. เชฌเซ€เชœเชพ เชถเชฌเซเชฆเซ‹เชฎเชพเช‚ เช•เชนเซ€เช เชคเซ‹, เช†เชชเซ‡เชฒ YAML เชคเซ‡เชจเซเช‚ เช…เชจเซเชฐเซ‚เชช เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเซ‡ API เชธเซเช•เซ€เชฎเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹. เชšเชพเชฒเซ‹ เชเช• เช‰เชฆเชพเชนเชฐเชฃ เชœเซ‹เชˆเช.

เชธเซเชฅเชพเชชเชจ เชธเซ‚เชšเชจเซ‹ เช•เซเชฌเซ‡เชตเชฒ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชตเซ‡เชฌเชธเชพเช‡เชŸ เชชเชฐ เช‰เชชเชฒเชฌเซเชง เช›เซ‡.

เชฎเซ‚เชณ เชฒเซ‡เช– เชฒเช–เชคเซ€ เชตเช–เชคเซ‡, เชธเช‚เชธเซเช•เชฐเชฃ 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 เชซเชพเช‡เชฒเซ‹ เช‰เชชเชฐเชพเช‚เชค, kubeval เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€เช“ เช…เชจเซ‡ 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 เชธเช‚เชธเซเช•เชฐเชฃเซ‹ (เช•เซเชฌเซ‡เชตเชฒเชจเซ€ เชœเซ‡เชฎ) เชธเชพเชฅเซ‡ เช…เชจเซเชชเชพเชฒเชจ เชฎเชพเชŸเซ‡ เชธเช‚เชธเชพเชงเชจเซ‹ เชคเชชเชพเชธเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เช›เซ‡. เชœเซ‹ เช•เซ‡, เช† เชฎเชพเชนเชฟเชคเซ€ เช•เซเชฌเซ‡-เชธเซเช•เซ‹เชฐเชฎเชพเช‚ เชœ เชนเชพเชฐเซเชกเช•เซ‹เชก เช•เชฐเซ‡เชฒเซ€ เช›เซ‡: เชคเชฎเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธเชจเซเช‚ เช…เชฒเช— เชธเช‚เชธเซเช•เชฐเชฃ เชชเชธเช‚เชฆ เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€. เชœเซ‹ เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เช•เซเชฒเชธเซเชŸเชฐเชจเซ‡ เช…เชชเช—เซเชฐเซ‡เชก เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชนเซ‹เชต เช…เชฅเชตเชพ เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ K8s เชจเซ€ เชตเชฟเชตเชฟเชง เช†เชตเซƒเชคเซเชคเชฟเช“ เชธเชพเชฅเซ‡ เชฌเชนเซเชตเชฟเชง เช•เซเชฒเชธเซเชŸเชฐ เชนเซ‹เชฏ เชคเซ‹ เช† เชฎเชฐเซเชฏเชพเชฆเชพ เชฎเซ‹เชŸเซ€ เชธเชฎเชธเซเชฏเชพ เชฌเชจเซ€ เชถเช•เซ‡ เช›เซ‡.

เชคเซ‡ เชจเซ‹เช‚เชง เชฒเซ‹ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชเช• เชธเชฎเชธเซเชฏเชพ เช›เซ‡ เช† เชคเช•เชจเซ‡ เชธเชพเช•เชพเชฐ เช•เชฐเชตเชพเชจเซ€ เชฆเชฐเช–เชพเชธเซเชค เชธเชพเชฅเซ‡.

เช•เซเชฌเซ‡-เชธเซเช•เซ‹เชฐ เชตเชฟเชถเซ‡ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ€ เช…เชนเซ€เช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เชธเชคเซเชคเชพเชตเชพเชฐ เชตเซ‡เชฌเชธเชพเช‡เชŸ.

เช•เซเชฌเซ‡-เชธเซเช•เซ‹เชฐ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชฎเชพเชŸเซ‡ เชเช• เชถเซเชฐเซ‡เชทเซเช  เชธเชพเชงเชจ เช›เซ‡, เชชเชฐเช‚เชคเซ เชœเซ‹ เชคเชฎเชพเชฐเซ‡ เชชเชฐเซ€เช•เซเชทเชฃเชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐ เช•เชฐเชตเชพเชจเซ€ เช…เชฅเชตเชพ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชจเชฟเชฏเชฎเซ‹ เช‰เชฎเซ‡เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชคเซ‹ เชถเซเช‚? เช…เชฐเซ‡, เช† เช•เชฐเซ€ เชถเช•เชพเชคเซเช‚ เชจเชฅเซ€.

เช•เซเชฌเซ‡-เชธเซเช•เซ‹เชฐ เชเช•เซเชธเซเชŸเซ‡เชจเซเชธเชฟเชฌเชฒ เชจเชฅเซ€: เชคเชฎเซ‡ เชคเซ‡เชฎเชพเช‚ เชจเซ€เชคเชฟเช“ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€ เช…เชฅเชตเชพ เชคเซ‡เชจเซ‡ เชธเชฎเชพเชฏเซ‹เชœเชฟเชค เช•เชฐเซ€ เชถเช•เชคเชพ เชจเชฅเซ€.

เชœเซ‹ เชคเชฎเชพเชฐเซ‡ เช•เช‚เชชเชจเซ€เชจเซ€ เชจเซ€เชคเชฟเช“เชจเซเช‚ เชชเชพเชฒเชจ เชšเช•เชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เช•เชธเซเชŸเชฎ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฒเช–เชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เชคเซ‹ เชคเชฎเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชšเชพเชฐ เชธเชพเชงเชจเซ‹เชฎเชพเช‚เชฅเซ€ เชเช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹: config-lint, copper, confest, เช…เชฅเชตเชพ polaris.

3.เช•เซ‹เชจเซเชซเชฟเช—-เชฒเชฟเชจเซเชŸ

Config-lint เช YAML, JSON, Terraform, CSV เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเชพเช‡เชฒเซ‹ เช…เชจเซ‡ Kubernetes เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ‡ เชฎเชพเชจเซเชฏ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชเช• เชธเชพเชงเชจ เช›เซ‡.

เชคเชฎเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชธเซ‚เชšเชจเชพเช“ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชตเซ‡เชฌเชธเชพเช‡เชŸ เชชเชฐ.

เชฎเซ‚เชณ เชฒเซ‡เช– เชฒเช–เชตเชพเชจเชพ เชธเชฎเชฏเชฅเซ€ เชตเชฐเซเชคเชฎเชพเชจ เชชเซเชฐเช•เชพเชถเชจ 1.5.0 เช›เซ‡.

Config-lint เชชเชพเชธเซ‡ Kubernetes เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ‡ เชฎเชพเชจเซเชฏ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชจเชฅเซ€.

เช•เซ‹เชˆเชชเชฃ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชฏเซ‹เช—เซเชฏ เชจเชฟเชฏเชฎเซ‹ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชคเซ‡เช“ "เชจเชฟเชฏเชฎเซ‹เชธเซ‡เชŸเซเชธ" เชคเชฐเซ€เช•เซ‡ เช“เชณเช–เชพเชคเซ€ 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. เชฐเซ‚เชชเชฐเซ‡เช–เชพ-เชฒเชฟเช‚เชŸ เชจเชฟเชฏเชฎ เช•เซ‡ เชœเซ‡ เช†เชตเซ€ เชคเชชเชพเชธ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เช†เชจเชพ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชถเซ‡:

- 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 - เช•เชฆเชพเชš เชจเชฟเชทเซเชซเชณเชคเชพ, เชšเซ‡เชคเชตเชฃเซ€ ะธ เชฌเชฟเชจ เชธเซเชธเช‚เช—เชค;
  • 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 เชตเซˆเชตเชฟเชงเซเชฏเชชเซ‚เชฐเซเชฃ เชชเชฐเซ€เช•เซเชทเชฃเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ‡ เชฎเชพเชจเซเชฏ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชฎเชพเชณเช–เซเช‚ เช›เซ‡ (เช•เซ‹เชจเซเชซเชฟเช—-เชฒเชฟเชจเซเชŸ เชœเซ‡เชตเซเช‚ เชœ).

เชœเซ‹ เช•เซ‡, เชคเซ‡ เชชเช›เซ€เชจเชพ เช•เชฐเชคเชพ เช…เชฒเช— เช›เซ‡ เช•เซ‡ เชคเซ‡ เชชเชฐเซ€เช•เซเชทเชฃเซ‹เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ YAML เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซเช‚ เชจเชฅเซ€. เชคเซ‡เชจเชพ เชฌเชฆเชฒเซ‡ เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸเชฎเชพเช‚ เชŸเซ‡เชธเซเชŸ เชฒเช–เซ€ เชถเช•เชพเชฏ เช›เซ‡. เช•เซ‹เชชเชฐ เช˜เชฃเชพ เชฎเซ‚เชณเชญเซ‚เชค เชธเชพเชงเชจเซ‹ เชธเชพเชฅเซ‡ เชชเซเชธเซเชคเช•เชพเชฒเชฏ เชชเซ‚เชฐเซเช‚ เชชเชพเชกเซ‡ เช›เซ‡, เชœเซ‡ เชคเชฎเชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช‘เชฌเซเชœเซ‡เช•เซเชŸเซเชธ เชตเชฟเชถเซ‡เชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เชตเชพเช‚เชšเชตเชพเชฎเชพเช‚ เช…เชจเซ‡ เชญเซ‚เชฒเซ‹เชจเซ€ เชœเชพเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡.

เช•เซ‹เชชเชฐ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพเชจเชพเช‚ เชชเช—เชฒเชพเช‚เช“ เช†เชฎเชพเช‚ เชฎเชณเซ€ เชถเช•เซ‡ เช›เซ‡ เชธเชคเซเชคเชพเชตเชพเชฐ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ.

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

เชคเซ‡ เชธเซเชชเชทเซเชŸ เช›เซ‡ เช•เซ‡ เช•เซ‹เชชเชฐเชจเซ€ เชฎเชฆเชฆเชฅเซ€ เชคเชฎเซ‡ เชตเชงเซ เชœเชŸเชฟเชฒ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ - เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เช‡เชจเซเช—เซเชฐเซ‡เชธ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชฎเชพเช‚ เชกเซ‹เชฎเซ‡เชจ เชจเชพเชฎเซ‹ เชคเชชเชพเชธเชตเชพ เช…เชฅเชตเชพ เชตเชฟเชถเซ‡เชทเชพเชงเชฟเช•เซƒเชค เชฎเซ‹เชกเชฎเชพเช‚ เชšเชพเชฒเชคเชพ เชชเซ‹เชกเซเชธเชจเซ‡ เชจเช•เชพเชฐเชตเชพ.

เช•เซ‹เชชเชฐเชฎเชพเช‚ เชตเชฟเชตเชฟเชง เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช•เชพเชฐเซเชฏเซ‹ เช›เซ‡ เชœเซ‡ เชคเซ‡เชฎเชพเช‚ เชฌเชจเซ‡เชฒ เช›เซ‡:

  • DockerImage เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช‡เชจเชชเซเชŸ เชซเชพเช‡เชฒ เชตเชพเช‚เชšเซ‡ เช›เซ‡ เช…เชจเซ‡ เชจเซ€เชšเซ‡เชจเชพ เชฒเช•เซเชทเชฃเซ‹ เชธเชพเชฅเซ‡ เชเช• เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชฌเชจเชพเชตเซ‡ เช›เซ‡:
    • name - เช›เชฌเซ€เชจเซเช‚ เชจเชพเชฎ,
    • tag - เช›เชฌเซ€ เชŸเซ‡เช—,
    • registry - เช›เชฌเซ€ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€,
    • registry_url - เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ (https://) เช…เชจเซ‡ เช‡เชฎเซ‡เชœ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€,
    • fqin - เช›เชฌเซ€เชจเซเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เชธเซเชฅเชพเชจ.
  • เช•เชพเชฐเซเชฏ findByName เช†เชชเซ‡เชฒ เชชเซเชฐเช•เชพเชฐ เชฆเซเชตเชพเชฐเชพ เชธเช‚เชธเชพเชงเชจ เชถเซ‹เชงเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡ (kind) เช…เชจเซ‡ เชจเชพเชฎ (name) เช‡เชจเชชเซเชŸ เชซเชพเช‡เชฒเชฎเชพเช‚เชฅเซ€.
  • เช•เชพเชฐเซเชฏ findByLabels เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชชเซเชฐเช•เชพเชฐ เชฆเซเชตเชพเชฐเชพ เชธเช‚เชธเชพเชงเชจ เชถเซ‹เชงเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเซ‡ เช›เซ‡ (kind) เช…เชจเซ‡ เชฒเซ‡เชฌเชฒเซเชธ (labels).

เชคเชฎเซ‡ เชฌเชงเชพ เช‰เชชเชฒเชฌเซเชง เชธเซ‡เชตเชพ เช•เชพเชฐเซเชฏเซ‹ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช…เชนเซ€เช‚.

เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ เชคเซ‡ เชธเชฎเช—เซเชฐ เช‡เชจเชชเซเชŸ YAML เชซเชพเช‡เชฒเชจเซ‡ เชšเชฒเชฎเชพเช‚ เชฒเซ‹เชก เช•เชฐเซ‡ เช›เซ‡ $$ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชธเซเช•เซเชฐเชฟเชชเซเชŸเซ€เช‚เช— เชฎเชพเชŸเซ‡ เช‰เชชเชฒเชฌเซเชง เชฌเชจเชพเชตเซ‡ เช›เซ‡ (jQuery เช…เชจเซเชญเชต เชงเชฐเชพเชตเชคเชพ เชฒเซ‹เช•เซ‹ เชฎเชพเชŸเซ‡ เชเช• เชชเชฐเชฟเชšเชฟเชค เชŸเซ‡เช•เชจเชฟเช•).

เช•เซ‹เชชเชฐเชจเซ‹ เชฎเซเช–เซเชฏ เชซเชพเชฏเชฆเซ‹ เชธเซเชชเชทเซเชŸ เช›เซ‡: เชคเชฎเชพเชฐเซ‡ เชตเชฟเชถเชฟเชทเซเชŸ เชญเชพเชทเชพเชฎเชพเช‚ เชจเชฟเชชเซเชฃเชคเชพ เชฎเซ‡เชณเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€ เช…เชจเซ‡ เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฟเชตเชฟเชง JavaScript เชธเซเชตเชฟเชงเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹, เชœเซ‡เชฎ เช•เซ‡ เชธเซเชŸเซเชฐเชฟเช‚เช— เช‡เชจเซเชŸเชฐเชชเซ‹เชฒเซ‡เชถเชจ, เชซเช‚เช•เซเชถเชจเซเชธ เชตเช—เซ‡เชฐเซ‡.

เช เชชเชฃ เชจเซ‹เช‚เชงเชตเซเช‚ เชœเซ‹เชˆเช เช•เซ‡ เช•เซ‹เชชเชฐเชจเซเช‚ เชตเชฐเซเชคเชฎเชพเชจ เชธเช‚เชธเซเช•เชฐเชฃ JavaScript เชเชจเซเชœเชฟเชจเชจเชพ ES5 เชธเช‚เชธเซเช•เชฐเชฃ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ‡ เช›เซ‡, ES6 เชธเชพเชฅเซ‡ เชจเชนเซ€เช‚.

เชชเชฐ เช‰เชชเชฒเชฌเซเชง เชตเชฟเช—เชคเซ‹ เชธเชคเซเชคเชพเชตเชพเชฐ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชตเซ‡เชฌเชธเชพเช‡เชŸ.

เชœเซ‹ เช•เซ‡, เชœเซ‹ เชคเชฎเชจเซ‡ เช–เชฐเซ‡เช–เชฐ JavaScript เชชเชธเช‚เชฆ เชจ เชนเซ‹เชฏ เช…เชจเซ‡ เช•เซเชตเซ‡เชฐเซ€ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชจเซ€เชคเชฟเช“เชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช–เชพเชธ เชฐเชšเชพเชฏเซ‡เชฒ เชญเชพเชทเชพ เชชเชธเช‚เชฆ เช•เชฐเซ‹, เชคเซ‹ เชคเชฎเชพเชฐเซ‡ เช•เซ‹เชจเซเชŸเซ‡เชธเซเชŸ เชชเชฐ เชงเซเชฏเชพเชจ เช†เชชเชตเซเช‚ เชœเซ‹เชˆเช.

5. เช•เซ‹เชจเซเชซเซ‡เชธเซเชŸ

เช•เซ‹เชจเซเชซเชŸเซ‡เชธเซเชŸ เช เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชกเซ‡เชŸเชพเชจเชพ เชชเชฐเซ€เช•เซเชทเชฃ เชฎเชพเชŸเซ‡เชจเซเช‚ เชฎเชพเชณเช–เซเช‚ เช›เซ‡. Kubernetes เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ€ เชšเช•เชพเชธเชฃเซ€/เชšเช•เชพเชธเชฃเซ€ เชฎเชพเชŸเซ‡ เชชเชฃ เชฏเซ‹เช—เซเชฏ. เชชเชฐเซ€เช•เซเชทเชฃเซ‹เชจเซเช‚ เชตเชฐเซเชฃเชจ เชตเชฟเชถเชฟเชทเซเชŸ เช•เซเชตเซ‡เชฐเซ€ เชญเชพเชทเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชฐเซ‡เช—เซ‹.

เชคเชฎเซ‡ confest เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชธเซ‚เชšเชจเชพเช“เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชตเซ‡เชฌเชธเชพเช‡เชŸ เชชเชฐ เชธเซ‚เชšเชฟเชฌเชฆเซเชง.

เชฎเซ‚เชณ เชฒเซ‡เช– เชฒเช–เชคเซ€ เชตเช–เชคเซ‡, เช‰เชชเชฒเชฌเซเชง เชจเชตเซ€เชจเชคเชฎ เชธเช‚เชธเซเช•เชฐเชฃ 0.18.2 เชนเชคเซเช‚.

config-lint เช…เชจเซ‡ copper เชจเซ€ เชœเซ‡เชฎ เชœ, เช•เซ‹เชจเซเชŸเซ‡เชธเซเชŸ เช•เซ‹เชˆเชชเชฃ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชŸเซ‡เชธเซเชŸ เชตเชฟเชจเชพ เช†เชตเซ‡ เช›เซ‡. เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เช…เชœเชฎเชพเชตเซ€เช เช…เชจเซ‡ เช†เชชเชฃเซ€ เชชเซ‹เชคเชพเชจเซ€ เชจเซ€เชคเชฟ เชฒเช–เซ€เช. เช…เช—เชพเช‰เชจเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ€ เชœเซ‡เชฎ, เช…เชฎเซ‡ เชคเชชเชพเชธ เช•เชฐเซ€เชถเซเช‚ เช•เซ‡ เช•เชจเซเชŸเซ‡เชจเชฐเชจเซ€ เช›เชฌเซ€เช“ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชธเซเชคเซเชฐเซ‹เชคเชฎเชพเช‚เชฅเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ.

เชกเชฟเชฐเซ‡เช•เซเชŸเชฐเซ€ เชฌเชจเชพเชตเซ‹ 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 เช…เชจเซ‡ เชŸเซ‡เชฌเชฒ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡ - เชœเซ‹ เชคเชฎเชพเชฐเซ‡ เชนเชพเชฒเชจเซ€ 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 เชนเชœเซ เชธเซเชงเซ€ เชธเชฎเชฐเซเชฅเชฟเชค เชจเชฅเซ€. เชคเซ‡เชฅเซ€ เชœเซ‹ เชคเชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ เช›เซ‹ เชคเซ‹ เชคเชฎเชพเชฐเซ€ เชœเชพเชคเชจเซ‡ เชจเชธเซ€เชฌเชฆเชพเชฐ เชฎเชพเชจเซ‹ เชเชเซเชฏเซเชฐ เช•เชจเซเชŸเซ‡เชจเชฐ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€ (ACR) เช…เชฅเชตเชพ เชคเชฎเชพเชฐเซ€ เชชเซ‹เชคเชพเชจเซ€ เชฐเชœเชฟเชธเซเชŸเซเชฐเซ€.

เช†เชฐเซเชŸเชฟเชซเซ‡เช•เซเชŸ เชซเซ‹เชฐเซเชฎเซ‡เชŸ เชœเซ‡เชตเซเช‚ เชœ เช›เซ‡ เชชเซ‹เชฒเชฟเชธเซ€ เชเชœเชจเซเชŸ เชชเซ‡เช•เซ‡เชœเซ‹ เช–เซ‹เชฒเซ‹ (OPA), เชœเซ‡ เชคเชฎเชจเซ‡ เชนเชพเชฒเชจเชพ OPA เชชเซ‡เช•เซ‡เชœเซ‹เชฎเชพเช‚เชฅเซ€ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เช•เซ‹เชจเซเชŸเซ‡เชธเซเชŸเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชคเชฎเซ‡ เชชเซ‹เชฒเชฟเชธเซ€ เชถเซ‡เชฐเชฟเช‚เช— เช…เชจเซ‡ เช•เซ‹เชจเซเชŸเซ‡เชธเซเชŸเชจเซ€ เช…เชจเซเชฏ เชธเซเชตเชฟเชงเชพเช“ เชตเชฟเชถเซ‡ เช…เชนเซ€เช‚ เชตเชงเซ เชœเชพเชฃเซ€ เชถเช•เซ‹ เช›เซ‹ เชธเชคเซเชคเชพเชตเชพเชฐ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชตเซ‡เชฌเชธเชพเช‡เชŸ.

6. เชชเซ‹เชฒเชพเชฐเชฟเชธ

เช† เชฒเซ‡เช–เชฎเชพเช‚ เชšเชฐเซเชšเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชคเซ‡ เช›เซ‡เชฒเซเชฒเซเช‚ เชธเชพเชงเชจ เช›เซ‡ เชชเซ‹เชฒเชพเชฐเชฟเชธ. (เชคเซ‡เชฎเชจเซ€ เช—เชฏเชพ เชตเชฐเซเชทเชจเซ€ เชœเชพเชนเซ‡เชฐเชพเชค เช…เชฎเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช…เชจเซเชตเชพเชฆเชฟเชค - เช†เชถเชฐเซ‡ เช…เชจเซเชตเชพเชฆ)

เชชเซ‹เชฒเชพเชฐเชฟเชธเชจเซ‡ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ เช…เชฅเชตเชพ เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจ เชฎเซ‹เชกเชฎเชพเช‚ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชœเซ‡เชฎ เชคเชฎเซ‡ เช…เชจเซเชฎเชพเชจ เชฒเช—เชพเชตเซเชฏเซเช‚ เชนเชถเซ‡, เชคเซ‡ เชคเชฎเชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซเช‚ เชธเซเชŸเซ‡เชŸเชฟเช•เชฒเซ€ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชœเซเชฏเชพเชฐเซ‡ เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจ เชฎเซ‹เชกเชฎเชพเช‚ เชšเชพเชฒเซ€ เชฐเชนเซเชฏเซเช‚ เชนเซ‹เชฏ, เชคเซเชฏเชพเชฐเซ‡ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชŸเซ‡เชธเซเชŸ เช‰เชชเชฒเชฌเซเชง เชนเซ‹เชฏ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เชธเซเชฐเช•เซเชทเชพ เช…เชจเซ‡ เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเซ‡เช•เซเชŸเชฟเชธ (เช•เซเชฌเซ‡-เชธเซเช•เซ‹เชฐเชจเซ€ เชœเซ‡เชฎ) เชœเซ‡เชตเชพ เช•เซเชทเซ‡เชคเซเชฐเซ‹เชจเซ‡ เช†เชตเชฐเซ€ เชฒเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชตเชงเซเชฎเชพเช‚, เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฌเชจเชพเชตเซ€ เชถเช•เซ‹ เช›เซ‹ (เชœเซ‡เชฎ เช•เซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพ-เชฒเชฟเช‚เชŸ, เช•เซ‹เชชเชฐ เช…เชจเซ‡ เช•เซ‹เชจเซเชซเซ‡เชธเซเชŸเชฎเชพเช‚).

เชฌเซ€เชœเชพ เชถเชฌเซเชฆเซ‹เชฎเชพเช‚ เช•เชนเซ€เช เชคเซ‹, เชชเซ‹เชฒเชพเชฐเชฟเชธ เชŸเซ‚เชฒเซเชธเชจเซ€ เชฌเช‚เชจเซ‡ เชถเซเชฐเซ‡เชฃเซ€เช“เชจเชพ เชซเชพเชฏเชฆเชพเช“เชจเซ‡ เชœเซ‹เชกเซ‡ เช›เซ‡: เชฌเชฟเชฒเซเชŸ-เช‡เชจ เช…เชจเซ‡ เช•เชธเซเชŸเชฎ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชธเชพเชฅเซ‡.

เช•เชฎเชพเชจเซเชก เชฒเชพเช‡เชจ เชฎเซ‹เชกเชฎเชพเช‚ เชชเซ‹เชฒเชพเชฐเชฟเชธ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชตเซ‡เชฌเชธเชพเช‡เชŸ เชชเชฐ เชธเซ‚เชšเชจเชพเช“.

เชฎเซ‚เชณ เชฒเซ‡เช– เชฒเช–เชคเซ€ เชตเช–เชคเซ‡, เชธเช‚เชธเซเช•เชฐเชฃ 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 เชซเซ‹เชฐเซเชฎเซ‡เชŸเชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เช›เซ‡, เช…เชจเซ‡ เชชเชฐเซ€เช•เซเชทเชฃ เชชเซ‹เชคเซ‡ 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 เชœเชฐเซ‚เชฐเซ€ เชเช• เชธเชพเชฅเซ‡ เช‡เชฎเซ‡เชœ เชธเซเชคเซเชฐเซ‹เชคเชจเซ€ เชธเชฐเช–เชพเชฎเชฃเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชชเชฐเชพเชฏ เช›เซ‡.

เช‰เชชเชฐเซ‹เช•เซเชค เชชเชฐเซ€เช•เซเชทเชฃ เชšเชฒเชพเชตเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชจเซ€เชšเซ‡เชจเซ€ เชชเซ‹เชฒเชพเชฐเชฟเชธ เช—เซ‹เช เชตเชฃเซ€ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡:

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

เชชเซ‹เชฒเชพเชฐเชฟเชธ เช•เชธเซเชŸเชฎ เชŸเซ‡เชธเซเชŸ เชธเชพเชฅเซ‡ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชŸเซ‡เชธเซเชŸเชจเซ‡ เชชเซ‚เชฐเช• เชฌเชจเชพเชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเช‚เชฅเซ€ เชฌเช‚เชจเซ‡ เชตเชฟเชถเซเชตเชจเชพ เชถเซเชฐเซ‡เชทเซเช เชจเซ‡ เชธเช‚เชฏเซ‹เชœเชฟเชค เช•เชฐเซ‡ เช›เซ‡.

เชฌเซ€เชœเซ€ เชฌเชพเชœเซ, เชฐเซ‡เช—เซ‹ เช…เชฅเชตเชพ เชœเชพเชตเชพเชธเซเช•เซเชฐเชฟเชชเซเชŸ เชœเซ‡เชตเซ€ เชตเชงเซ เชถเช•เซเชคเชฟเชถเชพเชณเซ€ เชญเชพเชทเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช…เชธเชฎเชฐเซเชฅเชคเชพ เชตเชงเซ เช…เชคเซเชฏเชพเชงเซเชจเชฟเช• เชชเชฐเซ€เช•เซเชทเชฃเซ‹เชจเชพ เชจเชฟเชฐเซเชฎเชพเชฃเชจเซ‡ เช…เชŸเช•เชพเชตเชคเซเช‚ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชชเชฐเชฟเชฌเชณ เชฌเชจเซ€ เชถเช•เซ‡ เช›เซ‡.

เชชเซ‹เชฒเชพเชฐเชฟเชธ เชตเชฟเชถเซ‡ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ€ เช…เชนเซ€เช‚ เช‰เชชเชฒเชฌเซเชง เช›เซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ เชตเซ‡เชฌเชธเชพเช‡เชŸ.

เชธเชพเชฐเชพเช‚เชถ

เชœเซเชฏเชพเชฐเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ YAML เชซเชพเช‡เชฒเซ‹เชจเซเช‚ เชจเชฟเชฐเซ€เช•เซเชทเชฃ เช…เชจเซ‡ เชฎเซ‚เชฒเซเชฏเชพเช‚เช•เชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเชพ เชธเชพเชงเชจเซ‹ เช‰เชชเชฒเชฌเซเชง เช›เซ‡, เชชเชฐเซ€เช•เซเชทเชฃเซ‹เชจเซ€ เชฐเชšเชจเชพ เช…เชจเซ‡ เช…เชฎเชฒ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชคเซ‡เชจเซ€ เชธเซเชชเชทเซเชŸ เชธเชฎเชœ เชนเซ‹เชตเซ€ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡.

เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชœเซ‹ เชคเชฎเซ‡ เชชเชพเช‡เชชเชฒเชพเช‡เชจเชฎเชพเช‚เชฅเซ€ เชชเชธเชพเชฐ เชฅเชคเชพ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชฒเซ‹ เช›เซ‹, เชคเซ‹ เช•เซเชฌเซ‡เชตเชฒ เช†เชตเซ€ เชชเชพเช‡เชชเชฒเชพเช‡เชจเชฎเชพเช‚ เชชเซเชฐเชฅเชฎ เชชเช—เชฒเซเช‚ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เชคเซ‡ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชตเซเชฏเชพเช–เซเชฏเชพเช“ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ API เชธเซเช•เซ€เชฎเชพเชจเซ‡ เช…เชจเซเชฐเซ‚เชช เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡เชจเซเช‚ เชจเชฟเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชถเซ‡.

เชเช•เชตเชพเชฐ เช†เชตเซ€ เชธเชฎเซ€เช•เซเชทเชพ เชชเซ‚เชฐเซเชฃ เชฅเชˆ เชœเชพเชฏ เชชเช›เซ€, เชตเซเชฏเช•เซเชคเชฟ เชตเชงเซ เช…เชคเซเชฏเชพเชงเซเชจเชฟเช• เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชคเชฐเชซ เช†เช—เชณ เชตเชงเซ€ เชถเช•เซ‡ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฅเชพเช“ เช…เชจเซ‡ เชšเซ‹เช•เซเช•เชธ เชจเซ€เชคเชฟเช“เชจเซเช‚ เชชเชพเชฒเชจ. เช† เชคเซ‡ เช›เซ‡ เชœเซเชฏเชพเช‚ เช•เซเชฌเซ‡-เชธเซเช•เซ‹เชฐ เช…เชจเซ‡ เชชเซ‹เชฒเชพเชฐเชฟเชธ เช•เชพเชฎเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชœเซ‡เช“ เชœเชŸเชฟเชฒ เช†เชตเชถเซเชฏเช•เชคเชพเช“ เชงเชฐเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชชเชฐเซ€เช•เซเชทเชฃเซ‹เชจเซ‡ เช•เชธเซเชŸเชฎเชพเช‡เช เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชคเซ‡เชฎเชจเชพ เชฎเชพเชŸเซ‡, เช•เซ‹เชชเชฐ, เช•เซ‹เชจเซเชซเชฟเช—-เชฒเชฟเชจเซเชŸ เช…เชจเซ‡ เช•เซ‹เชจเซเชซเซ‡เชธเซเชŸ เชฏเซ‹เช—เซเชฏ เชฐเชนเซ‡เชถเซ‡..

เช•เชจเซเชซเชŸเซ‡เชธเซเชŸ เช…เชจเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพ-เชฒเชฟเชจเซเชŸ เช•เชธเซเชŸเชฎ เชชเชฐเซ€เช•เซเชทเชฃเซ‹เชจเซ‡ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ YAML เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡, เช…เชจเซ‡ เช•เซ‹เชชเชฐ เชคเชฎเชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชญเชพเชทเชพเชจเซ€ เชเช•เซเชธเซ‡เชธ เช†เชชเซ‡ เช›เซ‡, เชœเซ‡ เชคเซ‡เชจเซ‡ เชเช• เชธเซเช‚เชฆเชฐ เช†เช•เชฐเซเชทเช• เชชเชธเช‚เชฆเช—เซ€ เชฌเชจเชพเชตเซ‡ เช›เซ‡.

เชฌเซ€เชœเซ€ เชฌเชพเชœเซ, เชถเซเช‚ เช†เชฎเชพเช‚เชฅเซ€ เช•เซ‹เชˆ เชเช• เชŸเซ‚เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชฅเซ€, เชœเชพเชคเซ‡ เชœ เชคเชฎเชพเชฎ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฌเชจเชพเชตเชตเซ€, เช…เชฅเชตเชพ เชชเซ‹เชฒเชพเชฐเชฟเชธเชจเซ‡ เชชเซเชฐเชพเชงเชพเชจเซเชฏ เช†เชชเชตเซเช‚ เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚ เชœเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ เชคเซ‡ เชœ เช‰เชฎเซ‡เชฐเซ‹? เช† เชชเซเชฐเชถเซเชจเชจเซ‹ เช•เซ‹เชˆ เชธเซเชชเชทเซเชŸ เชœเชตเชพเชฌ เชจเชฅเซ€.

เชจเซ€เชšเซ‡เชจเซเช‚ เช•เซ‹เชทเซเชŸเช• เชฆเชฐเซ‡เช• เชธเชพเชงเชจเชจเซเช‚ เชธเช‚เช•เซเชทเชฟเชชเซเชค เชตเชฐเซเชฃเชจ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡:

เชŸเซ‚เชฒ
เชฒเช•เซเชทเซเชฏเชธเซเชฅเชพเชจ
เช–เชพเชฎเซ€เช“
เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เชชเชฐเซ€เช•เซเชทเชฃเซ‹

เช•เซเชฌเซ‡เชตเชฒ
API เชธเซเช•เซ€เชฎเชพเชจเชพ เชšเซ‹เช•เซเช•เชธ เชธเช‚เชธเซเช•เชฐเชฃ เชธเชพเชฎเซ‡ YAML เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸเชจเซ‡ เชฎเชพเชจเซเชฏ เช•เชฐเซ‡ เช›เซ‡
CRD เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเซ€ เชถเช•เชพเชคเซเช‚ เชจเชฅเซ€
เช•เซ‹เชˆ

เช•เซเชฌเซ‡-เชธเซเช•เซ‹เชฐ
เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฅเชพเช“ เชธเชพเชฎเซ‡ YAML เชฎเซ‡เชจเซ€เชซเซ‡เชธเซเชŸเชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เช•เชฐเซ‡ เช›เซ‡
เชธเช‚เชธเชพเชงเชจเซ‹ เชคเชชเชพเชธเชตเชพ เชฎเชพเชŸเซ‡ เชคเชฎเชพเชฐเซเช‚ Kubernetes API เชธเช‚เชธเซเช•เชฐเชฃ เชชเชธเช‚เชฆ เช•เชฐเซ€ เชถเช•เชคเชพเช‚ เชจเชฅเซ€
เช•เซ‹เชˆ

เชคเชพเช‚เชฌเซ
YAML เชฎเซ‡เชจเชฟเชซเซ‡เชธเซเชŸ เชฎเชพเชŸเซ‡ เช•เชธเซเชŸเชฎ JavaScript เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชฎเชพเชณเช–เซเช‚
เช•เซ‹เชˆ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชจเชฅเซ€. เชจเชฌเชณเชพ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ€เช•เชฐเชฃ
เชนเชพ

config-lint
YAML เชฎเชพเช‚ เชเชฎเซเชฌเซ‡เชก เช•เชฐเซ‡เชฒเซ€ เชกเซ‹เชฎเซ‡เชจ-เชตเชฟเชถเชฟเชทเซเชŸ เชญเชพเชทเชพเชฎเชพเช‚ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชธเชพเชฎเชพเชจเซเชฏ เชฎเชพเชณเช–เซเช‚. เชตเชฟเชตเชฟเชง เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡ (เชฆเชพ.เชค. เชŸเซ‡เชฐเชพเชซเซ‹เชฐเซเชฎ)
เชคเซเชฏเชพเช‚ เช•เซ‹เชˆ เชคเซˆเชฏเชพเชฐ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชจเชฅเซ€. เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชจเชฟเชตเซ‡เชฆเชจเซ‹ เช…เชจเซ‡ เช•เชพเชฐเซเชฏเซ‹ เชชเซ‚เชฐเชคเชพ เชจ เชนเซ‹เชˆ เชถเช•เซ‡
เชนเชพ

เชนเชฐเซ€เชซเชพเชˆ
เชฐเซ‡เช—เซ‹ (เชเช• เชตเชฟเชถเชฟเชทเซเชŸ เช•เซเชตเซ‡เชฐเซ€ เชญเชพเชทเชพ) เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡เชจเซเช‚ เชฎเชพเชณเช–เซเช‚. OCI เชฌเช‚เชกเชฒเซเชธ เชฆเซเชตเชพเชฐเชพ เชชเซ‹เชฒเชฟเชธเซ€ เชถเซ‡เชฐ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡
เช•เซ‹เชˆ เชฌเชฟเชฒเซเชŸ-เช‡เชจ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชจเชฅเซ€. เชฎเชพเชฐเซ‡ เชฐเซ‡เช—เซ‹ เชถเซ€เช–เชตเซ‹ เช›เซ‡. เชจเซ€เชคเชฟเช“ เชชเซเชฐเช•เชพเชถเชฟเชค เช•เชฐเชคเซ€ เชตเช–เชคเซ‡ เชกเซ‹เช•เชฐ เชนเชฌ เชธเชฎเชฐเซเชฅเชฟเชค เชจเชฅเซ€
เชนเชพ

เชชเซ‹เชฒเชพเชฐเชฟเชธ
เชธเชฎเซ€เช•เซเชทเชพเช“ YAML เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชถเซเชฐเซ‡เชทเซเช  เชชเซเชฐเชฅเชพเช“ เชธเชพเชฎเซ‡ เชฎเซ‡เชจเซ€เชซเซ‡เชธเซเชŸ เช•เชฐเซ‡ เช›เซ‡. เชคเชฎเชจเซ‡ JSON เชธเซเช•เซ€เชฎเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ เชชเชฐเซ€เช•เซเชทเชฃเซ‹ เชฌเชจเชพเชตเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡
JSON เชธเซเช•เซ€เชฎเชพ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชชเชฐเซ€เช•เซเชทเชฃ เช•เซเชทเชฎเชคเชพเช“ เชชเชฐเซเชฏเชพเชชเซเชค เชจ เชนเซ‹เชˆ เชถเช•เซ‡
เชนเชพ

เช•เชพเชฐเชฃ เช•เซ‡ เช† เชธเชพเชงเชจเซ‹ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เช•เซเชฒเชธเซเชŸเชฐเชจเซ€ เชเช•เซเชธเซ‡เชธ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เชคเชพ เชจเชฅเซ€, เชคเซ‡เช“ เช‡เชจเซเชธเซเชŸเซ‹เชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฐเชณ เช›เซ‡. เชคเซ‡เช“ เชคเชฎเชจเซ‡ เชธเซเชฐเซ‹เชค เชซเชพเช‡เชฒเซ‹เชจเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเชพเชจเซ€ เช…เชจเซ‡ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเซเชธเชฎเชพเช‚ เชชเซเชฒ เชตเชฟเชจเช‚เชคเซ€เช“เชจเชพ เชฒเซ‡เช–เช•เซ‹เชจเซ‡ เชเชกเชชเซ€ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เช…เชจเซเชตเชพเชฆเช• เชคเชฐเชซเชฅเซ€ เชชเซ€เชเชธ

เช…เชฎเชพเชฐเชพ เชฌเซเชฒเซ‹เช— เชชเชฐ เชชเชฃ เชตเชพเช‚เชšเซ‹:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹