เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ YAML เจจเฉ‚เฉฐ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจ…เจคเฉ‡ เจจเฉ€เจคเฉ€เจ†เจ‚ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ•เจฐเฉ‹

เจจเฉ‹เจŸ เจ•เจฐเฉ‹เฅค เจ…เจจเฉเจตเจพเจฆ: K8s เจตเจพเจคเจพเจตเจฐเจฃเจพเจ‚ เจฒเจˆ YAML เจธเฉฐเจฐเจšเจจเจพเจตเจพเจ‚ เจฆเฉ€ เจตเฉฑเจง เจฐเจนเฉ€ เจ—เจฟเจฃเจคเฉ€ เจฆเฉ‡ เจจเจพเจฒ, เจ‰เจนเจจเจพเจ‚ เจฆเฉ€ เจธเจตเฉˆเจšเจฒเจฟเจค เจคเจธเจฆเฉ€เจ• เจฆเฉ€ เจฒเฉ‹เฉœ เจตเฉฑเจง เจคเฉ‹เจ‚ เจตเฉฑเจง เจœเจผเจฐเฉ‚เจฐเฉ€ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆเฅค เจ‡เจธ เจธเจฎเฉ€เจ–เจฟเจ† เจฆเฉ‡ เจฒเฉ‡เจ–เจ• เจจเฉ‡ เจจเจพ เจธเจฟเจฐเจซเจผ เจ‡เจธ เจ•เจพเจฐเจœ เจฒเจˆ เจฎเฉŒเจœเฉ‚เจฆเจพ เจนเฉฑเจฒเจพเจ‚ เจฆเฉ€ เจšเฉ‹เจฃ เจ•เฉ€เจคเฉ€, เจธเจ—เฉ‹เจ‚ เจ‡เจน เจฆเฉ‡เจ–เจฃ เจฒเจˆ เจ•เจฟ เจ‰เจน เจ•เจฟเจตเฉ‡เจ‚ เจ•เฉฐเจฎ เจ•เจฐเจฆเฉ‡ เจนเจจ, เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจฃ เจตเจœเฉ‹เจ‚ เจคเฉˆเจจเจพเจคเฉ€ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจตเฉ€ เจ•เฉ€เจคเฉ€เฅค เจ‡เจน เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจฌเจนเฉเจค เจœเจพเจฃเจ•เจพเจฐเฉ€ เจญเจฐเจชเฉ‚เจฐ เจธเจพเจฌเจค เจนเฉ‹เจ‡เจ† เจœเฉ‹ เจ‡เจธ เจตเจฟเจธเจผเฉ‡ เจตเจฟเฉฑเจš เจฆเจฟเจฒเจšเจธเจชเฉ€ เจฐเฉฑเจ–เจฆเฉ‡ เจนเจจ.

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ YAML เจจเฉ‚เฉฐ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจ…เจคเฉ‡ เจจเฉ€เจคเฉ€เจ†เจ‚ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ•เจฐเฉ‹

TL; เจกเจพ: เจ‡เจน เจฒเฉ‡เจ– เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจ…เจคเฉ‡ เจฒเฉ‹เฉœเจพเจ‚ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ YAML เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจฎเฉเจฒเจพเจ‚เจ•เจฃ เจ•เจฐเจจ เจฒเจˆ เจ›เฉ‡ เจธเจฅเจฟเจฐ เจŸเฉ‚เจฒเจพเจ‚ เจฆเฉ€ เจคเฉเจฒเจจเจพ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจฐเจ•เจฒเฉ‹เจกเจธ เจจเฉ‚เฉฐ เจ†เจฎ เจคเฉŒเจฐ 'เจคเฉ‡ YAML เจฆเจธเจคเจพเจตเฉ‡เจœเจผเจพเจ‚ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค YAML เจจเจพเจฒ เจธเจฎเฉฑเจธเจฟเจ†เจตเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจนเฉˆ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจซเจพเจˆเจฒเจพเจ‚ เจตเจฟเจšเจ•เจพเจฐ เจฐเฉเจ•เจพเจตเจŸเจพเจ‚ เจœเจพเจ‚ เจธเจฌเฉฐเจงเจพเจ‚ เจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฎเฉเจธเจผเจ•เจฒเฅค

เจ‰เจฆเฉ‹เจ‚ เจ•เฉ€ เจœเฉ‡ เจธเจพเจจเฉ‚เฉฐ เจ‡เจน เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจ•เจฟ เจ•เจฒเฉฑเจธเจŸเจฐ เจตเจฟเฉฑเจš เจคเฉˆเจจเจพเจค เจธเจพเจฐเฉ€เจ†เจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจ‡เฉฑเจ• เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจฐเจœเจฟเจธเจŸเจฐเฉ€ เจคเฉ‹เจ‚ เจ†เจ‰เจ‚เจฆเฉ€เจ†เจ‚ เจนเจจ?

เจฎเฉˆเจ‚ เจ‰เจนเจจเจพเจ‚ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจฐเฉ‹เจ• เจธเจ•เจฆเจพ เจนเจพเจ‚ เจœเจฟเจนเจจเจพเจ‚ เจ•เฉ‹เจฒ เจชเฉ‹เจกเจกเจฟเจธเจฐเจชเจธเจผเจจเจฌเจœเจŸ เจจเจนเฉ€เจ‚ เจนเจจ เจ•เจฒเฉฑเจธเจŸเจฐ เจจเฉ‚เฉฐ เจญเฉ‡เจœเจฃ เจคเฉ‹เจ‚?

เจธเจฅเจฟเจฐ เจŸเฉˆเจธเจŸเจฟเฉฐเจ— เจฆเจพ เจเจ•เฉ€เจ•เจฐเจฃ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเจฟเจ•เจพเจธ เจฆเฉ‡ เจชเฉœเจพเจ… 'เจคเฉ‡ เจ—เจฒเจคเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจจเฉ€เจคเฉ€ เจฆเฉ€เจ†เจ‚ เจ‰เจฒเฉฐเจ˜เจฃเจพเจตเจพเจ‚ เจฆเฉ€ เจชเจ›เจพเจฃ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจ—เจพเจฐเฉฐเจŸเฉ€ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ เจ•เจฟ เจธเจฐเฉ‹เจค เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ‚ เจธเจนเฉ€ เจ…เจคเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจนเจจ, เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจธเฉฐเจญเจพเจตเจจเจพ เจตเฉฑเจง เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ เจ•เจฟ เจ‰เจคเจชเจพเจฆเจจ เจตเจฐเจ•เจฒเฉ‹เจก เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเฉ‡เจ—เจพเฅค

เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจธเจฅเจฟเจฐ YAML เจซเจพเจˆเจฒ เจจเจฟเจฐเฉ€เจ–เจฃ เจˆเจ•เฉ‹เจธเจฟเจธเจŸเจฎ เจจเฉ‚เฉฐ เจนเฉ‡เจ  เจฒเจฟเจ–เฉ€เจ†เจ‚ เจธเจผเฉเจฐเฉ‡เจฃเฉ€เจ†เจ‚ เจตเจฟเฉฑเจš เจตเฉฐเจกเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ:

  • API เจชเฉเจฐเจฎเจพเจฃเจ•. เจ‡เจธ เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจตเจฟเฉฑเจš เจŸเฉ‚เจฒ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ API เจธเจฐเจตเจฐ เจฆเฉ€เจ†เจ‚ เจฒเฉ‹เฉœเจพเจ‚ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง YAML เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเจจเฅค
  • เจคเจฟเจ†เจฐ เจŸเฉˆเจธเจŸเจฐ. เจ‡เจธ เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจฆเฉ‡ เจŸเฉ‚เจฒ เจธเฉเจฐเฉฑเจ–เจฟเจ†, เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ†เจฆเจฟ เจฒเจˆ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ‡ เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจ†เจ‰เจ‚เจฆเฉ‡ เจนเจจเฅค
  • เจ•เจธเจŸเจฎ เจตเฉˆเจฒเฉ€เจกเฉ‡เจŸเจฐ. เจ‡เจธ เจธเจผเฉเจฐเฉ‡เจฃเฉ€ เจฆเฉ‡ เจชเฉเจฐเจคเฉ€เจจเจฟเจง เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเฉฑเจ–-เจตเฉฑเจ– เจญเจพเจธเจผเจพเจตเจพเจ‚ เจตเจฟเฉฑเจš เจ•เจธเจŸเจฎ เจŸเฉˆเจธเจŸ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจ, เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจฐเฉ‡เจ—เฉ‹ เจ…เจคเฉ‡ เจœเจพเจตเจพเจธเจ•เฉเจฐเจฟเจชเจŸเฅค

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจ›เฉ‡ เจตเฉฑเจ–-เจตเฉฑเจ– เจธเจพเจงเจจเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ…เจคเฉ‡ เจคเฉเจฒเจจเจพ เจ•เจฐเจพเจ‚เจ—เฉ‡:

  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 เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€เจ†เจ‚.

เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจ‡เฉฑเจ• เจตเฉˆเจฌ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจธเจฆเจพ เจฎเฉเฉฑเจ– เจ•เฉฐเจฎ เจชเฉ‹เจฐเจŸ 5678 'เจคเฉ‡ "เจนเฉˆเจฒเฉ‹ เจตเจฐเจฒเจก" เจธเฉฐเจฆเฉ‡เจธเจผ เจจเจพเจฒ เจœเจตเจพเจฌ เจฆเฉ‡เจฃเจพ เจนเฉˆเฅค เจ‡เจธเจจเฉ‚เฉฐ เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ€ เจ•เจฎเจพเจ‚เจก เจจเจพเจฒ เจคเฉˆเจจเจพเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ:

kubectl apply -f hello-world.yaml

เจ…เจคเฉ‡ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ - เจ•เฉฐเจฎ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ‹:

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

เจนเฉเจฃ เจœเจพเจ“ http://localhost:8080 เจ…เจคเฉ‡ เจชเฉเจธเจผเจŸเฉ€ เจ•เจฐเฉ‹ เจ•เจฟ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจ•เฉฐเจฎ เจ•เจฐ เจฐเจนเฉ€ เจนเฉˆเฅค เจชเจฐ เจ•เฉ€ เจ‡เจน เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเจฆเจพ เจนเฉˆ? เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ€เจเฅค

1. เจ•เฉเจฌเฉ‡เจตเจพเจฒ

เจ†เจงเจพเจฐ เจคเฉ‡ เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจตเจฟเจšเจพเจฐ เจ‡เจน เจนเฉˆ เจ•เจฟ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจจเจพเจฒ เจ•เฉ‹เจˆ เจตเฉ€ เจชเจฐเจธเจชเจฐ เจชเฉเจฐเจญเจพเจต เจ‡เจธเจฆเฉ‡ REST API เจฆเฉเจ†เจฐเจพ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจฆเฉ‚เจœเฉ‡ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš, เจคเฉเจธเฉ€เจ‚ เจ‡เจน เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• API เจธเจ•เฉ€เจฎเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ•เฉ€ เจฆเจฟเฉฑเจคเจพ เจ—เจฟเจ† YAML เจ‡เจธเจฆเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจนเฉˆ เจœเจพเจ‚ เจจเจนเฉ€เจ‚เฅค เจ†เจ“ เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ‡เจ–เฉ€เจเฅค

เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจจเจฟเจฐเจฆเฉ‡เจธเจผ kubeval เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ 'เจคเฉ‡ เจ‰เจชเจฒเจฌเจง เจนเจจเฅค

เจ…เจธเจฒ เจฒเฉ‡เจ– เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจธเฉฐเจธเจ•เจฐเจฃ 0.15.0 เจ‰เจชเจฒเจฌเจง เจธเฉ€เฅค

เจ‡เฉฑเจ• เจตเจพเจฐ เจธเจฅเจพเจชเจฟเจค เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ†เจ“ เจ‡เจธเจจเฉ‚เฉฐ เจ‰เฉฑเจชเจฐ เจฆเจฟเฉฑเจคเฉ‡ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจจเฉ‚เฉฐ เจซเฉ€เจก เจ•เจฐเฉ€เจ:

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

เจœเฉ‡เจ•เจฐ เจธเจซเจฒ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจคเจพเจ‚ เจ•เฉเจฌเฉ‡เจตเจฒ เจเจ—เจœเจผเจฟเจŸ เจ•เฉ‹เจก 0 เจจเจพเจฒ เจฌเจพเจนเจฐ เจ† เจœเจพเจตเฉ‡เจ—เจพเฅค เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจคเจฐเฉ€เจ•เฉ‡ เจจเจพเจฒ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹:

$ echo $?
0

เจšเจฒเฉ‹ เจนเฉเจฃ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจจเจพเจฒ เจ•เฉเจฌเฉ‡เจตเจฒ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
        image: hashicorp/http-echo
        args: ["-text", "hello-world"]
        ports:
        - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: http-echo
spec:
  ports:
  - port: 5678
    protocol: TCP
    targetPort: 5678
  selector:
    app: http-echo

(kubeval-invalid.yaml)

เจ•เฉ€ เจคเฉเจธเฉ€เจ‚ เจ…เฉฑเจ–เจพเจ‚ เจฆเฉเจ†เจฐเจพ เจธเจฎเฉฑเจธเจฟเจ† เจฆเจพ เจชเจคเจพ เจฒเจ—เจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹? เจšเจฒเฉ‹ เจฒเจพเจ‚เจš เจ•เจฐเฉ€เจ:

$ kubeval kubeval-invalid.yaml
WARN - kubeval-invalid.yaml contains an invalid Deployment (http-echo) - selector: selector is required
PASS - kubeval-invalid.yaml contains a valid Service (http-echo)

# ะฟั€ะพะฒะตั€ะธะผ ะบะพะด ะฒะพะทะฒั€ะฐั‚ะฐ
$ echo $?
1

เจธเจฐเฉ‹เจค เจฆเฉ€ เจชเฉเจธเจผเจŸเฉ€ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพ เจฐเจนเฉ€ เจนเฉˆเฅค

API เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ apps/v1, เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจšเฉ‹เจฃเจ•เจพเจฐ เจธเจผเจพเจฎเจฒ เจ•เจฐเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจœเฉ‹ เจชเฉŒเจก เจฆเฉ‡ เจฒเฉ‡เจฌเจฒ เจจเจพเจฒ เจฎเฉ‡เจฒ เจ–เจพเจ‚เจฆเจพ เจนเฉ‹เจตเฉ‡เฅค เจ‰เจชเจฐเฉ‹เจ•เจค เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจšเฉ‹เจฃเจ•เจพเจฐ เจธเจผเจพเจฎเจฒ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจ‡เจธเจฒเจˆ เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจจเฉ‡ เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ เจฆเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸ เจ•เฉ€เจคเฉ€ เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจ—เฉˆเจฐ-เจœเจผเฉ€เจฐเฉ‹ เจ•เฉ‹เจก เจจเจพเจฒ เจฌเจพเจนเจฐ เจจเจฟเจ•เจฒเจฟเจ†เฅค

เจฎเฉˆเจ‚ เจนเฉˆเจฐเจพเจจ เจนเจพเจ‚ เจ•เจฟ เจœเฉ‡ เจฎเฉˆเจ‚ เจ…เจœเจฟเจนเจพ เจ•เจฐเจฆเจพ เจนเจพเจ‚ เจคเจพเจ‚ เจ•เฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ kubectl apply -f เจ‡เจธ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸเฉ‹ เจจเจพเจฒ?

เจ–เฉˆเจฐ, เจ†เจ“ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ:

$ kubectl apply -f kubeval-invalid.yaml
error: error validating "kubeval-invalid.yaml": error validating data: ValidationError(Deployment.spec):
missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors,
turn validation off with --validate=false

เจ‡เจน เจฌเจฟเจฒเจ•เฉเจฒ เจ‰เจนเฉ€ เจ—เจฒเจคเฉ€ เจนเฉˆ เจœเจฟเจธ เจฌเจพเจฐเฉ‡ เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจจเฉ‡ เจšเฉ‡เจคเจพเจตเจจเฉ€ เจฆเจฟเฉฑเจคเฉ€ เจธเฉ€เฅค เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจšเฉ‹เจฃเจ•เจพเจฐ เจจเฉ‚เฉฐ เจœเฉ‹เฉœ เจ•เฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจ เฉ€เจ• เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  selector:          # !!!
    matchLabels:     # !!!
      app: http-echo # !!!
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
        image: hashicorp/http-echo
        args: ["-text", "hello-world"]
        ports:
        - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: http-echo
spec:
  ports:
  - port: 5678
    protocol: TCP
    targetPort: 5678
  selector:
    app: http-echo

(base-valid.yaml)

เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจตเจฐเจ—เฉ‡ เจธเจพเจงเจจเจพเจ‚ เจฆเจพ เจซเจพเจ‡เจฆเจพ เจ‡เจน เจนเฉˆ เจ•เจฟ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจ—เจฒเจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจคเฉˆเจจเจพเจคเฉ€ เจšเฉฑเจ•เจฐ เจตเจฟเฉฑเจš เจœเจฒเจฆเฉ€ เจซเฉœเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ‡เจนเจจเจพเจ‚ เจœเจพเจ‚เจšเจพเจ‚ เจฒเจˆ เจ•เจฒเฉฑเจธเจŸเจฐ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ; เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจ”เจซเจฒเจพเจˆเจจ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš, เจ•เฉเจฌเฉ‡เจตเจฒ เจจเจตเฉ€เจจเจคเจฎ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ API เจธเจ•เฉ€เจฎเจพ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจœเจผเจฟเจ†เจฆเจพเจคเจฐ เจฎเจพเจฎเจฒเจฟเจ†เจ‚ เจตเจฟเฉฑเจš เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจ–เจพเจธ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฐเฉ€เจฒเฉ€เจœเจผ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจœเจพเจ‚เจš เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉ‹ เจธเจ•เจฆเฉ€ เจนเฉˆเฅค เจ‡เจน เจซเจฒเฉˆเจ— เจตเจฐเจค เจ•เฉ‡ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ --kubernetes-version:

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

เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจจเฉ‹เจŸ เจ•เจฐเฉ‹ เจ•เจฟ เจธเฉฐเจธเจ•เจฐเจฃ เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ Major.Minor.Patch.

เจธเฉฐเจธเจ•เจฐเจฃเจพเจ‚ เจฆเฉ€ เจธเฉ‚เจšเฉ€ เจฒเจˆ เจœเจฟเจจเฉเจนเจพเจ‚ เจฒเจˆ เจชเฉเจธเจผเจŸเฉ€เจ•เจฐเจจ เจธเจฎเจฐเจฅเจฟเจค เจนเฉˆ, เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจตเฉ‡เจ–เฉ‹ GitHub 'เจคเฉ‡ JSON เจธเจ•เฉ€เจฎเจพ, เจœเจฟเจธ เจจเฉ‚เฉฐ เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจชเฉเจฐเจฎเจพเจฃเจฟเจ•เจคเจพ เจฒเจˆ เจตเจฐเจคเจฆเจพ เจนเฉˆเฅค เจœเฉ‡เจ•เจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เฉเจฌเฉ‡เจตเจฒ เจ”เจซเจฒเจพเจˆเจจ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจคเจพเจ‚ เจธเจ•เฉ€เจฎเจพเจ‚ เจจเฉ‚เฉฐ เจกเจพเจŠเจจเจฒเฉ‹เจก เจ•เจฐเฉ‹ เจ…เจคเฉ‡ เจซเจฒเฉˆเจ— เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ‰เจนเจจเจพเจ‚ เจฆเจพ เจธเจฅเจพเจจเจ• เจธเจฅเจพเจจ เจจเจฟเจฐเจงเจพเจฐเจฟเจค เจ•เจฐเฉ‹ --schema-location.

เจตเจฟเจ…เจ•เจคเฉ€เจ—เจค YAML เจซเจพเจˆเจฒเจพเจ‚ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, kubeval เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€เจ†เจ‚ เจ…เจคเฉ‡ stdin เจจเจพเจฒ เจตเฉ€ เจ•เฉฐเจฎ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจ†เจธเจพเจจเฉ€ เจจเจพเจฒ เจธเฉ€เจ†เจˆ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจตเจฟเฉฑเจš เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค เจ•เจฒเฉฑเจธเจŸเจฐ เจจเฉ‚เฉฐ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจญเฉ‡เจœเจฃ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจŸเฉˆเจธเจŸ เจšเจฒเจพเจ‰เจฃ เจฆเฉ€ เจ‡เฉฑเจ›เจพ เจฐเฉฑเจ–เจฃ เจตเจพเจฒเจฟเจ†เจ‚ เจจเฉ‚เฉฐ เจ‡เจน เจœเจพเจฃ เจ•เฉ‡ เจ–เฉเจธเจผเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€ เจ•เจฟ เจ•เฉเจฌเฉ‡เจตเจฒ เจคเจฟเฉฐเจจ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจซเจพเจฐเจฎเฉˆเจŸเจพเจ‚ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจฆเจพ เจนเฉˆ:

  1. เจธเจพเจฆเจพ เจชเจพเจ ;
  2. JSON;
  3. เจŸเฉˆเจธเจŸ เจเจจเฉ€เจฅเจฟเฉฐเจ— เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ (TAP)เฅค

เจ…เจคเฉ‡ เจ•เจฟเจธเฉ‡ เจตเฉ€ เจซเจพเจฐเจฎเฉˆเจŸ เจจเฉ‚เฉฐ เจฒเฉ‹เฉœเฉ€เจฆเฉ€ เจ•เจฟเจธเจฎ เจฆเฉ‡ เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจฆเจพ เจธเฉฐเจ–เฉ‡เจช เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจจเฉ‚เฉฐ เจชเจพเจฐเจธ เจ•เจฐเจจ เจฒเจˆ เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจ•เฉเจฌเฉ‡เจตเจฒ เจฆเฉ€เจ†เจ‚ เจ•เจฎเฉ€เจ†เจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจ‡เจน เจนเฉˆ เจ•เจฟ เจ‡เจน เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš เจ•เจธเจŸเจฎ เจฐเจฟเจธเฉ‹เจฐเจธ เจชเจฐเจฟเจญเจพเจธเจผเจพเจตเจพเจ‚ (CRDs) เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจฆเฉ€ เจœเจพเจ‚เจš เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจจเฉ‚เฉฐ เจธเฉฐเจฐเจšเจฟเจค เจ•เจฐเจจเจพ เจธเฉฐเจญเจต เจนเฉˆ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจจเจœเจผเจฐเจ…เฉฐเจฆเจพเจœเจผ เจ•เจฐเฉ‹.

เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ…เจคเฉ‡ เจฎเฉเจฒเจพเจ‚เจ•เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจตเจงเฉ€เจ† เจธเจพเจงเจจ เจนเฉˆ; เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจธ เจ—เฉฑเจฒ 'เจคเฉ‡ เจœเจผเฉ‹เจฐ เจฆเจฟเฉฑเจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ•เจฟ เจŸเฉˆเจธเจŸ เจชเจพเจธ เจ•เจฐเจจเจพ เจ‡เจธ เจ—เฉฑเจฒ เจฆเฉ€ เจ—เจฐเฉฐเจŸเฉ€ เจจเจนเฉ€เจ‚ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจธเจฐเฉ‹เจค เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจŸเฉˆเจ— เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ latest เจ‡เฉฑเจ• เจ•เฉฐเจŸเฉ‡เจจเจฐ เจตเจฟเฉฑเจš เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ€ เจชเจพเจฒเจฃเจพ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจ‡เจธ เจจเฉ‚เฉฐ เจ—เจฒเจคเฉ€ เจจเจนเฉ€เจ‚ เจฎเฉฐเจจเจฆเจพ เจ…เจคเฉ‡ เจ‡เจธเจฆเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพเฅค เจญเจพเจต, เจ…เจœเจฟเจนเฉ‡ YAML เจฆเฉ€ เจคเจธเจฆเฉ€เจ• เจฌเจฟเจจเจพเจ‚ เจšเฉ‡เจคเจพเจตเจจเฉ€เจ†เจ‚ เจฆเฉ‡ เจชเฉ‚เจฐเฉ€ เจนเฉ‹ เจœเจพเจตเฉ‡เจ—เฉ€เฅค

เจชเจฐ เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ YAML เจฆเจพ เจฎเฉเจฒเจพเจ‚เจ•เจฃ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจŸเฉˆเจ— เจตเจฐเจ—เฉ‡ เจ‰เจฒเฉฐเจ˜เจฃเจพเจตเจพเจ‚ เจฆเฉ€ เจชเจ›เจพเจฃ เจ•เจฐเจจเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจ•เฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ latest? เจฎเฉˆเจ‚ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจ‡เฉฑเจ• YAML เจซเจพเจˆเจฒ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฟเจตเฉ‡เจ‚ เจ•เจฐเจพเจ‚?

2. เจ•เฉเจฌเฉ‡-เจธเจ•เฉ‹เจฐ

เจ•เฉเจฌเฉ‡-เจ…เฉฐเจ• YAML เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจจเฉ‚เฉฐ เจชเจพเจฐเจธ เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจฌเจฟเจฒเจŸ-เจ‡เจจ เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจ‰เจนเจจเจพเจ‚ เจฆเจพ เจฎเฉเจฒเจพเจ‚เจ•เจฃ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจŸเฉˆเจธเจŸ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเจฟเจธเจผเจพ-เจจเจฟเจฐเจฆเฉ‡เจธเจผเจพเจ‚ เจ…เจคเฉ‡ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡ เจšเฉเจฃเฉ‡ เจ—เจ เจนเจจ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ:

  • เจ•เฉฐเจŸเฉ‡เจจเจฐ เจจเฉ‚เฉฐ เจฐเฉ‚เจŸ เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจจเจนเฉ€เจ‚ เจšเจฒเจพเจ‰เจฃเจพ.
  • เจชเฉŒเจก เจธเจฟเจนเจค เจœเจพเจ‚เจšเจพเจ‚ เจฆเฉ€ เจ‰เจชเจฒเจฌเจงเจคเจพเฅค
  • เจธเจฐเฉ‹เจคเจพเจ‚ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจธเฉ€เจฎเจพเจตเจพเจ‚ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจเจพเฅค

เจŸเฉˆเจธเจŸ เจฆเฉ‡ เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจฆเฉ‡ เจ†เจงเจพเจฐ 'เจคเฉ‡, เจคเจฟเฉฐเจจ เจจเจคเฉ€เจœเฉ‡ เจฆเจฟเฉฑเจคเฉ‡ เจ—เจ เจนเจจ: OK, เจšเฉ‡เจคเจพเจตเจจเฉ€ ะธ CRITICAL.

เจคเฉเจธเฉ€เจ‚ เจ•เฉเจฌเฉ‡-เจธเจ•เฉ‹เจฐ เจ”เจจเจฒเจพเจˆเจจ เจ…เจœเจผเจฎเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจœเจพเจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจธเจฅเจพเจจเจ• เจคเฉŒเจฐ 'เจคเฉ‡ เจธเจฅเจพเจชเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹เฅค

เจ…เจธเจฒ เจฒเฉ‡เจ– เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจ•เฉเจฌเฉ‡-เจธเจ•เฉ‹เจฐ เจฆเจพ เจจเจตเฉ€เจจเจคเจฎ เจธเฉฐเจธเจ•เจฐเจฃ 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 เจœเจพเจฃเจ•เจพเจฐเฉ€ เจจเฉ‚เฉฐ เจชเฉœเฉเจนเจจเจฏเฉ‹เจ— เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเจฟเจธ เจตเจฟเฉฑเจš เจนเจฐ เจ•เจฟเจธเจฎ เจฆเฉ€ เจ‰เจฒเฉฐเจ˜เจฃเจพ เจตเฉ€ เจธเจผเจพเจฎเจฒ เจนเฉˆ เจšเฉ‡เจคเจพเจตเจจเฉ€ ะธ CRITICAL, เจœเฉ‹ เจตเจฟเจ•เจพเจธ เจฆเฉŒเจฐเจพเจจ เจฌเจนเฉเจค เจฎเจฆเจฆ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจœเจฟเจนเฉœเฉ‡ เจฒเฉ‹เจ• 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

เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจฆเฉ€ เจคเจฐเฉเจนเจพเจ‚, เจ•เฉเจฌเฉ‡-เจธเจ•เฉ‹เจฐ เจ‡เฉฑเจ• เจ—เฉˆเจฐ-เจœเจผเฉ€เจฐเฉ‹ เจเจ—เจœเจผเจฟเจŸ เจ•เฉ‹เจก เจตเจพเจชเจธ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจ•เฉ‹เจˆ เจŸเฉˆเจธเจŸ เจ…เจธเจซเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆ CRITICAL. เจคเฉเจธเฉ€เจ‚ เจ‡เจธ เจฒเจˆ เจธเจฎเจพเจจ เจชเฉเจฐเฉ‹เจธเฉˆเจธเจฟเฉฐเจ— เจจเฉ‚เฉฐ เจตเฉ€ เจธเจฎเจฐเฉฑเจฅ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจšเฉ‡เจคเจพเจตเจจเฉ€.

เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจตเฉฑเจ–-เจตเฉฑเจ– 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 - เจธเจผเจพเจ‡เจฆ เจ…เจธเจซเจฒเจคเจพ, เจšเฉ‡เจคเจพเจตเจจเฉ€ ะธ NON_COMPLIANT;
  • message โ€” เจœเฉ‡เจ•เจฐ เจ•เจฟเจธเฉ‡ เจจเจฟเจฏเจฎ เจฆเฉ€ เจ‰เจฒเฉฐเจ˜เจฃเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ‡เจธ เจฒเจพเจˆเจจ เจฆเฉ€เจ†เจ‚ เจธเจฎเฉฑเจ—เจฐเฉ€เจ†เจ‚ เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจนเฉเฉฐเจฆเฉ€เจ†เจ‚ เจนเจจ;
  • resource - เจธเจฐเฉ‹เจค เจฆเฉ€ เจ•เจฟเจธเจฎ เจœเจฟเจธ 'เจคเฉ‡ เจ‡เจน เจจเจฟเจฏเจฎ เจฒเจพเจ—เฉ‚ เจนเฉเฉฐเจฆเจพ เจนเฉˆ;
  • assertions โ€” เจธเจผเจฐเจคเจพเจ‚ เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉ‚เจšเฉ€ เจœเจฟเจธเจฆเจพ เจฎเฉเจฒเจพเจ‚เจ•เจฃ เจ‡เจธ เจธเจฐเฉ‹เจค เจฆเฉ‡ เจธเจฌเฉฐเจง เจตเจฟเฉฑเจš เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพเฅค

เจ‰เจชเจฐเฉ‹เจ•เจค เจจเจฟเจฏเจฎ เจตเจฟเฉฑเจš assertion เจจเจพเจฎ เจนเฉ‡เจ  every เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจธเจพเจฐเฉ‡ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจคเฉˆเจจเจพเจคเฉ€ เจตเจฟเฉฑเจš เจนเจจ (key: spec.templates.spec.containers) เจญเจฐเฉ‹เจธเฉ‡เจฎเฉฐเจฆ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ my-company.com/).

เจชเฉ‚เจฐเจพ เจจเจฟเจฏเจฎ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ:

version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
  - "*.yaml"
rules:

 - id: DEPLOYMENT_IMAGE_REPOSITORY # !!!
    severity: FAILURE
    message: Deployment must use a valid image repository
    resource: Deployment
    assertions:
      - every:
          key: spec.template.spec.containers
          expressions:
            - key: image
              op: starts-with
              value: "my-company.com/"

(ruleset.yaml)

เจŸเฉˆเจธเจŸ เจจเฉ‚เฉฐ เจ…เจœเจผเจฎเจพเจ‰เจฃ เจฒเจˆ, เจ†เจ“ เจ‡เจธเจจเฉ‚เฉฐ เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ•เจฐเฉ€เจ check_image_repo.yaml. เจ†เจ“ เจซเจพเจˆเจฒ 'เจคเฉ‡ เจ‡เฉฑเจ• เจœเจพเจ‚เจš เจ•เจฐเฉ€เจ base-valid.yaml:

$ config-lint -rules check_image_repo.yaml base-valid.yaml

[
  {
  "AssertionMessage": "Every expression fails: And expression fails: image does not start with my-company.com/",
  "Category": "",
  "CreatedAt": "2020-06-04T01:29:25Z",
  "Filename": "test-data/base-valid.yaml",
  "LineNumber": 0,
  "ResourceID": "http-echo",
  "ResourceType": "Deployment",
  "RuleID": "DEPLOYMENT_IMAGE_REPOSITORY",
  "RuleMessage": "Deployment must use a valid image repository",
  "Status": "FAILURE"
  }
]

เจœเจพเจ‚เจš เจ…เจธเจซเจฒ เจฐเจนเฉ€เฅค เจนเฉเจฃ เจ†เจ‰ เจธเจนเฉ€ เจšเจฟเฉฑเจคเจฐ เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจฆเฉ‡ เจจเจพเจฒ เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ‡ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเฉ€เจ:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: http-echo
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
         image: my-company.com/http-echo:1.0 # !!!
         args: ["-text", "hello-world"]
         ports:
         - containerPort: 5678

(image-valid-mycompany.yaml)

เจ…เจธเฉ€เจ‚ เจ‰เจชเจฐเฉ‹เจ•เจค เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจจเจพเจฒ เจ‰เจนเฉ€ เจŸเฉˆเจธเจŸ เจšเจฒเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚เฅค เจ•เฉ‹เจˆ เจธเจฎเฉฑเจธเจฟเจ† เจจเจนเฉ€เจ‚ เจฎเจฟเจฒเฉ€:

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

Config-lint เจ‡เฉฑเจ• เจธเจผเจพเจจเจฆเจพเจฐ เจซเจฐเฉ‡เจฎเจตเจฐเจ• เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ YAML DSL เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ Kubernetes YAML เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจจเฉ‚เฉฐ เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจŸเฉˆเจธเจŸ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจชเจฐ เจ‰เจฆเฉ‹เจ‚ เจ•เฉ€ เจœเฉ‡ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเจงเฉ‡เจฐเฉ‡ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจคเจฐเจ• เจ…เจคเฉ‡ เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ? เจ•เฉ€ YAML เจ‡เจธ เจฒเจˆ เจฌเจนเฉเจค เจธเฉ€เจฎเจค เจจเจนเฉ€เจ‚ เจนเฉˆ? เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ‡เฉฑเจ• เจชเฉ‚เจฐเฉ€ เจชเฉเจฐเฉ‹เจ—เจฐเจพเจฎเจฟเฉฐเจ— เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจŸเฉˆเจธเจŸ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจคเจพเจ‚ เจ•เฉ€ เจนเฉ‹เจตเฉ‡เจ—เจพ?

4. เจคเจพเจ‚เจฌเจพ

เจ•เจพเจชเจฐ V2 เจ•เจธเจŸเจฎ เจŸเฉˆเจธเจŸเจพเจ‚ (config-lint เจฆเฉ‡ เจธเจฎเจพเจจ) เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจจเฉ‚เฉฐ เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจ‡เฉฑเจ• เจขเจพเจ‚เจšเจพ เจนเฉˆเฅค

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ‡เจน เจฌเจพเจ…เจฆ เจตเจพเจฒเฉ‡ เจจเจพเจฒเฉ‹เจ‚ เจตเฉฑเจ–เจฐเจพ เจนเฉˆ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจ เจฒเจˆ YAML เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆเฅค เจ‡เจธเจฆเฉ€ เจฌเจœเจพเจ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ JavaScript เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจ•เจพเจชเจฐ เจ•เจˆ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจธเจพเจงเจจเจพเจ‚ เจจเจพเจฒ เจ‡เฉฑเจ• เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเจพ เจนเฉˆ, เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจตเจธเจคเฉ‚เจ†เจ‚ เจฌเจพเจฐเฉ‡ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจชเฉœเฉเจนเจจ เจ…เจคเฉ‡ เจ—เจฒเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸ เจ•เจฐเจจ เจตเจฟเฉฑเจš เจฎเจฆเจฆ เจ•เจฐเจฆเจพ เจนเฉˆเฅค

เจ•เจพเจชเจฐ เจจเฉ‚เฉฐ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจ เจฒเจˆ เจ•เจฆเจฎ เจตเจฟเฉฑเจš เจฒเฉฑเจญเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจ…เจงเจฟเจ•เจพเจฐเจค เจฆเจธเจคเจพเจตเฉ‡เจœเจผ.

2.0.1 เจ…เจธเจฒเฉ€ เจฒเฉ‡เจ– เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚ เจ‡เจธ เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจฆเจพ เจจเจตเฉ€เจจเจคเจฎ เจฐเฉ€เจฒเฉ€เจœเจผ เจนเฉˆเฅค

config-lint เจตเจพเจ‚เจ—, เจ•เจพเจชเจฐ เจตเจฟเฉฑเจš เจฌเจฟเจฒเจŸ-เจ‡เจจ เจŸเฉˆเจธเจŸ เจจเจนเฉ€เจ‚ เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค เจšเจฒเฉ‹ เจ‡เฉฑเจ• เจฒเจฟเจ–เจฆเฉ‡ เจนเจพเจ‚เฅค เจ‡เจธ เจจเฉ‚เฉฐ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฆเจฟเจ“ เจ•เจฟ เจคเฉˆเจจเจพเจคเฉ€เจ†เจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผ เจคเฉŒเจฐ 'เจคเฉ‡ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€เจ†เจ‚ เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ€เจ†เจ‚ เจนเจจ my-company.com.

เจ‡เฉฑเจ• เจซเจพเจˆเจฒ เจฌเจฃเจพเจ“ check_image_repo.js เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ€ เจธเจฎเฉฑเจ—เจฐเฉ€ เจฆเฉ‡ เจจเจพเจฒ:

$$.forEach(function($){
    if ($.kind === 'Deployment') {
        $.spec.template.spec.containers.forEach(function(container) {
            var image = new DockerImage(container.image);
            if (image.registry.lastIndexOf('my-company.com/') != 0) {
                errors.add_error('no_company_repo',"Image " + $.metadata.name + " is not from my-company.com repo", 1)
            }
        });
    }
});

เจนเฉเจฃ เจธเจพเจกเฉ‡ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ base-valid.yaml, เจ•เจฎเจพเจ‚เจก เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹ copper validate:

$ copper validate --in=base-valid.yaml --validator=check_image_tag.js

Check no_company_repo failed with severity 1 due to Image http-echo is not from my-company.com repo
Validation failed

เจ‡เจน เจธเจชเฉฑเจธเจผเจŸ เจนเฉˆ เจ•เจฟ เจคเจพเจ‚เจฌเฉ‡ เจฆเฉ€ เจฎเจฆเจฆ เจจเจพเจฒ เจคเฉเจธเฉ€เจ‚ เจตเจงเฉ‡เจฐเฉ‡ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจŸเฉˆเจธเจŸ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ - เจ‰เจฆเจพเจนเจฐเจจ เจฒเจˆ, เจ‡เฉฐเจ—เจฐเฉˆเจธ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจตเจฟเฉฑเจš เจกเฉ‹เจฎเฉ‡เจจ เจจเจพเจฎเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจเจพ เจœเจพเจ‚ เจตเจฟเจธเจผเฉ‡เจธเจผ เจ…เจงเจฟเจ•เจพเจฐ เจตเจพเจฒเฉ‡ เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจšเฉฑเจฒ เจฐเจนเฉ‡ เจชเฉŒเจกเจพเจ‚ เจจเฉ‚เฉฐ เจฐเฉฑเจฆ เจ•เจฐเจจเจพเฅค

เจ•เจพเจชเจฐ เจตเจฟเฉฑเจš เจตเฉฑเจ–-เจตเฉฑเจ– เจ‰เจชเจฏเฉ‹เจ—เจคเจพ เจซเฉฐเจ•เจธเจผเจจ เจนเจจ:

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

เจคเฉเจธเฉ€เจ‚ เจธเจพเจฐเฉ‡ เจ‰เจชเจฒเจฌเจง เจธเฉ‡เจตเจพ เจซเฉฐเจ•เจธเจผเจจเจพเจ‚ เจจเฉ‚เฉฐ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ‡เฉฑเจฅเฉ‡.

เจฎเฉ‚เจฒ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจ‡เจน เจชเฉ‚เจฐเฉ€ เจ‡เจจเจชเฉเจŸ YAML เจซเจพเจˆเจฒ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจตเฉ‡เจฐเฉ€เจเจฌเจฒ เจตเจฟเฉฑเจš เจฒเฉ‹เจก เจ•เจฐเจฆเจพ เจนเฉˆ $$ เจ…เจคเฉ‡ เจ‡เจธเจจเฉ‚เฉฐ เจธเจ•เฉเจฐเจฟเจชเจŸเจฟเฉฐเจ— เจฒเจˆ เจ‰เจชเจฒเจฌเจง เจ•เจฐเจตเจพเจ‰เจ‚เจฆเจพ เจนเฉˆ (jQuery เจ…เจจเฉเจญเจต เจตเจพเจฒเฉ‡ เจฒเฉ‹เจ•เจพเจ‚ เจฒเจˆ เจ‡เฉฑเจ• เจœเจพเจฃเฉ€-เจชเจ›เจพเจฃเฉ€ เจคเจ•เจจเฉ€เจ•)เฅค

เจ•เจพเจชเจฐ เจฆเจพ เจฎเฉเฉฑเจ– เจซเจพเจ‡เจฆเจพ เจธเจชเฉฑเจธเจผเจŸ เจนเฉˆ: เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เจฟเจธเฉ‡ เจตเจฟเจธเจผเฉ‡เจธเจผ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจฎเฉเจนเจพเจฐเจค เจนเจพเจธเจฒ เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ เจ…เจคเฉ‡ เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจŸเฉˆเจธเจŸ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ•เจˆ JavaScript เจตเจฟเจธเจผเฉ‡เจธเจผเจคเจพเจตเจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจธเจŸเฉเจฐเจฟเฉฐเจ— เจ‡เฉฐเจŸเจฐเจชเฉ‹เจฒเฉ‡เจธเจผเจจ, เจซเฉฐเจ•เจธเจผเจจ, เจ†เจฆเจฟเฅค

เจ‡เจน เจตเฉ€ เจจเฉ‹เจŸ เจ•เฉ€เจคเจพ เจœเจพเจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เจพเจชเจฐ เจฆเจพ เจฎเฉŒเจœเฉ‚เจฆเจพ เจธเฉฐเจธเจ•เจฐเจฃ JavaScript เจ‡เฉฐเจœเจฃ เจฆเฉ‡ ES5 เจธเฉฐเจธเจ•เจฐเจฃ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจฆเจพ เจนเฉˆ, ES6 เจจเจพเจฒ เจจเจนเฉ€เจ‚เฅค

'เจคเฉ‡ เจ‰เจชเจฒเจฌเจง เจตเฉ‡เจฐเจตเฉ‡ เจ…เจงเจฟเจ•เจพเจฐเจค เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเฉˆเจฌเจธเจพเจˆเจŸ.

เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจธเฉฑเจšเจฎเฉเฉฑเจš JavaScript เจจเฉ‚เฉฐ เจชเจธเฉฐเจฆ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจนเฉ‹ เจ…เจคเฉ‡ เจธเจตเจพเจฒ เจฌเจฃเจพเจ‰เจฃ เจ…เจคเฉ‡ เจจเฉ€เจคเฉ€เจ†เจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจจ เจฒเจˆ เจ–เจพเจธ เจคเฉŒเจฐ 'เจคเฉ‡ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเฉ€ เจ—เจˆ เจญเจพเจธเจผเจพ เจจเฉ‚เฉฐ เจคเจฐเจœเฉ€เจน เจฆเจฟเฉฐเจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจตเจฟเจตเจพเจฆ เจตเฉฑเจฒ เจงเจฟเจ†เจจ เจฆเฉ‡เจฃเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค

5. Conftest

Confest เจธเฉฐเจฐเจšเจจเจพ เจกเฉ‡เจŸเจพ เจฆเฉ€ เจœเจพเจ‚เจš เจฒเจˆ เจ‡เฉฑเจ• เจขเจพเจ‚เจšเจพ เจนเฉˆเฅค เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจฆเฉ€ เจœเจพเจ‚เจš/เจชเฉœเจคเจพเจฒ เจฒเจˆ เจตเฉ€ เจขเฉเจ•เจตเจพเจ‚ เจนเฉˆเฅค เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเจพ เจตเจฐเจฃเจจ เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจญเจพเจธเจผเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เฉ€เจคเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจฐเฉˆเจ—เฉ‹.

เจคเฉเจธเฉ€เจ‚ เจตเจฐเจค เจ•เฉ‡ เจ•เจจเจซเฉˆเจธเจŸ เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจจเจฟเจฐเจฆเฉ‡เจธเจผเจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจฆเฉ€ เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ 'เจคเฉ‡ เจธเฉ‚เจšเฉ€เจฌเฉฑเจง.

เจ…เจธเจฒ เจฒเฉ‡เจ– เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจ‰เจชเจฒเจฌเจง เจจเจตเฉ€เจจเจคเจฎ เจธเฉฐเจธเจ•เจฐเจฃ 0.18.2 เจธเฉ€เฅค

เจ•เฉŒเจ‚เจซเจฟเจ—-เจฒเจฟเฉฐเจŸ เจ…เจคเฉ‡ เจ•เจพเจชเจฐ เจฆเฉ‡ เจธเจฎเจพเจจ, เจ•เจจเจซเฉˆเจธเจŸ เจฌเจฟเจจเจพเจ‚ เจ•เจฟเจธเฉ‡ เจฌเจฟเจฒเจŸ-เจ‡เจจ เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉ‡ เจ†เจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจšเจฒเฉ‹ เจ‡เจธเจจเฉ‚เฉฐ เจ…เจœเจผเจฎเจพเจˆเจ เจ…เจคเฉ‡ เจ†เจชเจฃเฉ€ เจจเฉ€เจคเฉ€ เจฒเจฟเจ–เฉ€เจเฅค เจชเจฟเจ›เจฒเฉ€เจ†เจ‚ เจ‰เจฆเจพเจนเจฐเจฃเจพเจ‚ เจตเจพเจ‚เจ—, เจ…เจธเฉ€เจ‚ เจœเจพเจ‚เจš เจ•เจฐเจพเจ‚เจ—เฉ‡ เจ•เจฟ เจ•เฉ€ เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฆเฉ€เจ†เจ‚ เจคเจธเจตเฉ€เจฐเจพเจ‚ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจธเจฐเฉ‹เจค เจคเฉ‹เจ‚ เจฒเจˆเจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจเฅค

เจ‡เฉฑเจ• เจกเจพเจ‡เจฐเฉˆเจ•เจŸเจฐเฉ€ เจฌเจฃเจพเจ“ 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. เจชเฉ‹เจฒเจพเจฐเจฟเจธ

เจ‡เจธ เจฒเฉ‡เจ– เจตเจฟเจš เจšเจฐเจšเจพ เจ•เฉ€เจคเฉ€ เจœเจพเจตเฉ‡เจ—เฉ€, เจœเฉ‹ เจ•เจฟ เจ†เจ–เจฐเฉ€ เจธเฉฐเจฆ เจนเฉˆ เจชเฉ‹เจฒเจฐเจฟเจธ. (เจ‰เจธเจฆเฉ€ เจชเจฟเจ›เจฒเฉ‡ เจธเจพเจฒ เจฆเฉ€ เจ˜เฉ‹เจธเจผเจฃเจพ เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ…เจจเฉเจตเจพเจฆ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ - เจฒเจ—เจญเจ— เจ…เจจเฉเจตเจพเจฆ)

เจชเฉ‹เจฒเจพเจฐเจฟเจธ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจ•เจฒเฉฑเจธเจŸเจฐ เจตเจฟเฉฑเจš เจธเจฅเจพเจชเจฟเจค เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆ เจœเจพเจ‚ เจ•เจฎเจพเจ‚เจก เจฒเจพเจˆเจจ เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจตเจฐเจคเจฟเจ† เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจคเฉเจธเฉ€เจ‚ เจ…เจจเฉเจฎเจพเจจ เจฒเจ—เจพเจ‡เจ† เจนเฉ‹เจตเฉ‡เจ—เจพ, เจ‡เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸเจธ เจฆเจพ เจธเจฅเจฟเจฐ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจ•เจฎเจพเจ‚เจก เจฒเจพเจˆเจจ เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจšเฉฑเจฒเจฃ เจตเฉ‡เจฒเฉ‡, เจฌเจฟเจฒเจŸ-เจ‡เจจ เจŸเฉˆเจธเจŸ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจ…เจคเฉ‡ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ (เจ•เจฟเจŠเจฌ-เจธเจ•เฉ‹เจฐ เจฆเฉ‡ เจธเจฎเจพเจจ) เจตเจฐเจ—เฉ‡ เจ–เฉ‡เจคเจฐเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจตเจฐ เจ•เจฐเจจ เจฒเจˆ เจ‰เจชเจฒเจฌเจง เจนเฉเฉฐเจฆเฉ‡ เจนเจจเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจคเฉเจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจŸเฉˆเจธเจŸ เจฌเจฃเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ config-lint, copper เจ…เจคเฉ‡ confest เจตเจฟเฉฑเจš)เฅค

เจฆเฉ‚เจœเฉ‡ เจธเจผเจฌเจฆเจพเจ‚ เจตเจฟเฉฑเจš, เจชเฉ‹เจฒเจพเจฐเจฟเจธ เจŸเฉ‚เจฒเจธ เจฆเฉ€เจ†เจ‚ เจฆเฉ‹เจตเจพเจ‚ เจธเจผเฉเจฐเฉ‡เจฃเฉ€เจ†เจ‚ เจฆเฉ‡ เจฒเจพเจญเจพเจ‚ เจจเฉ‚เฉฐ เจœเฉ‹เฉœเจฆเจพ เจนเฉˆ: เจฌเจฟเจฒเจŸ-เจ‡เจจ เจ…เจคเฉ‡ เจ•เจธเจŸเจฎ เจŸเฉˆเจธเจŸเจพเจ‚ เจฆเฉ‡ เจจเจพเจฒเฅค

เจ•เจฎเจพเจ‚เจก เจฒเจพเจˆเจจ เจฎเฉ‹เจก เจตเจฟเฉฑเจš เจชเฉ‹เจฒเจพเจฐเจฟเจธ เจจเฉ‚เฉฐ เจธเจฅเจพเจชเจฟเจค เจ•เจฐเจจ เจฒเจˆ, เจตเจฐเจคเฉ‹ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจตเฉˆเฉฑเจฌเจธเจพเจˆเจŸ 'เจคเฉ‡ เจจเจฟเจฐเจฆเฉ‡เจธเจผ.

เจ…เจธเจฒ เจฒเฉ‡เจ– เจฒเจฟเจ–เจฃ เจฆเฉ‡ เจธเจฎเฉ‡เจ‚, เจธเฉฐเจธเจ•เจฐเจฃ 1.0.3 เจ‰เจชเจฒเจฌเจง เจนเฉˆเฅค

เจ‡เฉฑเจ• เจตเจพเจฐ เจ‡เฉฐเจธเจŸเจพเจฒเฉ‡เจธเจผเจจ เจชเฉ‚เจฐเฉ€ เจนเฉ‹เจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจคเฉเจธเฉ€เจ‚ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ 'เจคเฉ‡ เจชเฉ‹เจฒเจฐเจฟเจธ เจšเจฒเจพ เจธเจ•เจฆเฉ‡ เจนเฉ‹ base-valid.yaml เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ€ เจ•เจฎเจพเจ‚เจก เจจเจพเจฒ:

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

เจ‡เจน เจ•เฉ€เจคเฉ‡ เจ—เจ เจŸเฉˆเจธเจŸเจพเจ‚ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจฆเฉ‡ เจจเจคเฉ€เจœเจฟเจ†เจ‚ เจฆเฉ‡ เจตเจฟเจธเจคเฉเจฐเจฟเจค เจตเจฐเจฃเจจ เจฆเฉ‡ เจจเจพเจฒ JSON เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจธเจคเจฐ เจ†เจŠเจŸเจชเฉเฉฑเจŸ เจ•เจฐเฉ‡เจ—เจพเฅค เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจตเจฟเฉฑเจš เจนเฉ‡เจ  เจฆเจฟเฉฑเจคเฉ€ เจฌเจฃเจคเจฐ เจนเฉ‹เจตเฉ‡เจ—เฉ€:

{
  "PolarisOutputVersion": "1.0",
  "AuditTime": "0001-01-01T00:00:00Z",
  "SourceType": "Path",
  "SourceName": "test-data/base-valid.yaml",
  "DisplayName": "test-data/base-valid.yaml",
  "ClusterInfo": {
    "Version": "unknown",
    "Nodes": 0,
    "Pods": 2,
    "Namespaces": 0,
    "Controllers": 2
  },
  "Results": [
    /* ะดะปะธะฝะฝั‹ะน ัะฟะธัะพะบ */
  ]
}

เจชเฉ‚เจฐเจพ เจ†เจ‰เจŸเจชเฉเฉฑเจŸ เจ‰เจชเจฒเจฌเจง เจนเฉˆ เจ‡เฉฑเจฅเฉ‡.

เจ•เจฟเจŠเจฌ-เจธเจ•เฉ‹เจฐ เจตเจพเจ‚เจ—, เจชเฉ‹เจฒเจพเจฐเจฟเจธ เจ‰เจนเจจเจพเจ‚ เจ–เฉ‡เจคเจฐเจพเจ‚ เจตเจฟเฉฑเจš เจฎเฉเฉฑเจฆเจฟเจ†เจ‚ เจฆเฉ€ เจชเจ›เจพเจฃ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเจพ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเจพ เจนเฉˆ:

  • เจซเจฒเฉ€เจ†เจ‚ เจฒเจˆ เจ•เฉ‹เจˆ เจธเจฟเจนเจค เจœเจพเจ‚เจš เจจเจนเฉ€เจ‚ เจนเฉˆเฅค
  • เจ•เฉฐเจŸเฉ‡เจจเจฐ เจšเจฟเฉฑเจคเจฐเจพเจ‚ เจฒเจˆ เจŸเฉˆเจ— เจจเจฟเจฐเจงเจพเจฐเจค เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ‡ เจ—เจ เจนเจจเฅค
  • เจ•เฉฐเจŸเฉ‡เจจเจฐ เจฐเฉ‚เจŸ เจฆเฉ‡ เจคเฉŒเจฐ เจคเฉ‡ เจšเฉฑเจฒเจฆเจพ เจนเฉˆ.
  • เจฎเฉˆเจฎเฉ‹เจฐเฉ€ เจ…เจคเฉ‡ CPU เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจ…เจคเฉ‡ เจธเฉ€เจฎเจพเจตเจพเจ‚ เจจเจฟเจฐเจงเจพเจฐเจค เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€เจ†เจ‚ เจ—เจˆเจ†เจ‚ เจนเจจเฅค

เจนเจฐเฉ‡เจ• เจŸเฉˆเจธเจŸ, เจ‡เจธเจฆเฉ‡ เจจเจคเฉ€เจœเจฟเจ†เจ‚ 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจ•เจฐเจฆเจพ เจนเฉˆ, เจจเฉ‚เฉฐ เจจเจพเจœเจผเฉเจ•เจคเจพ เจฆเฉ€ เจ‡เฉฑเจ• เจกเจฟเจ—เจฐเฉ€ เจจเจฟเจฐเจงเจพเจฐเจค เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ: เจšเฉ‡เจคเจพเจตเจจเฉ€ เจœ เจ–เจผเจคเจฐเจพ. เจ‰เจชเจฒเจฌเจง เจฌเจฟเจฒเจŸ-เจ‡เจจ เจŸเฉˆเจธเจŸเจพเจ‚ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจœเจพเจฃเจจ เจฒเจˆ, เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจตเฉ‡เจ–เฉ‹ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ.

เจœเฉ‡เจ•เจฐ เจตเฉ‡เจฐเจตเจฟเจ†เจ‚ เจฆเฉ€ เจฒเฉ‹เฉœ เจจเจนเฉ€เจ‚ เจนเฉˆ, เจคเจพเจ‚ เจคเฉเจธเฉ€เจ‚ เจเฉฐเจกเจพ เจจเจฟเจธเจผเจšเจฟเจค เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹ --format score. เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจชเฉ‹เจฒเจพเจฐเจฟเจธ 1 เจคเฉ‹เจ‚ 100 - เจคเฉฑเจ• เจฆเฉ€ เจ‡เฉฑเจ• เจธเฉฐเจ–เจฟเจ† เจ†เจŠเจŸเจชเฉเฉฑเจŸ เจ•เจฐเฉ‡เจ—เจพ เจธเจ•เฉ‹เจฐ (เจ…เจฐเจฅเจพเจค เจฎเฉเจฒเจพเจ‚เจ•เจฃ):

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

เจธเจ•เฉ‹เจฐ 100 เจฆเฉ‡ เจจเฉ‡เฉœเฉ‡ เจนเฉˆ, เจธเจฎเจเฉŒเจคเฉ‡ เจฆเฉ€ เจกเจฟเจ—เจฐเฉ€ เจ‰เจจเฉ€ เจนเฉ€ เจ‰เฉฑเจšเฉ€ เจนเฉ‹เจตเฉ‡เจ—เฉ€เฅค เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจ•เจฎเจพเจ‚เจก เจฆเฉ‡ เจเจ—เจœเจผเจฟเจŸ เจ•เฉ‹เจก เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจฆเฉ‡ เจนเฉ‹ polaris audit, เจ‡เจน เจชเจคเจพ เจšเจฒเจฆเจพ เจนเฉˆ เจ•เจฟ เจ‡เจน 0 เจฆเฉ‡ เจฌเจฐเจพเจฌเจฐ เจนเฉˆเฅค

เจซเฉ‹เจฐเจธ polaris audit เจคเฉเจธเฉ€เจ‚ เจฆเฉ‹ เจซเจฒเฉˆเจ—เจพเจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ—เฉˆเจฐ-เจœเจผเฉ€เจฐเฉ‹ เจ•เฉ‹เจก เจจเจพเจฒ เจ•เฉฐเจฎ เจจเฉ‚เฉฐ เจ–เจคเจฎ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹:

  • เจซเจฒเฉˆเจ— --set-exit-code-below-score เจ‡เฉฑเจ• เจ†เจฐเจ—เฉ‚เจฎเฉˆเจ‚เจŸ เจตเจœเฉ‹เจ‚ 1-100 เจฆเฉ€ เจฐเฉ‡เจ‚เจœ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฅเฉเจฐเฉˆเจธเจผเจนเฉ‹เจฒเจก เจฎเฉเฉฑเจฒ เจฒเฉˆเจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เจธ เจธเจฅเจฟเจคเฉ€ เจตเจฟเฉฑเจš, เจœเฉ‡เจ•เจฐ เจธเจ•เฉ‹เจฐ เจฅเฉเจฐเฉˆเจธเจผเจนเฉ‹เจฒเจก เจคเฉ‹เจ‚ เจนเฉ‡เจ เจพเจ‚ เจนเฉˆ เจคเจพเจ‚ เจ•เจฎเจพเจ‚เจก เจเจ—เจœเจผเจฟเจŸ เจ•เฉ‹เจก 4 เจจเจพเจฒ เจฌเจพเจนเจฐ เจ† เจœเจพเจตเฉ‡เจ—เฉ€เฅค เจ‡เจน เจ‰เจฆเฉ‹เจ‚ เจฌเจนเฉเจค เจฒเจพเจญเจฆเจพเจ‡เจ• เจนเฉเฉฐเจฆเจพ เจนเฉˆ เจœเจฆเฉ‹เจ‚ เจคเฉเจนเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจ‡เฉฑเจ• เจจเจฟเจธเจผเจšเจฟเจค เจฅเฉเจฐเฉˆเจธเจผเจนเฉ‹เจฒเจก เจฎเฉเฉฑเจฒ เจนเฉเฉฐเจฆเจพ เจนเฉˆ (75 เจ•เจนเฉ‹) เจ…เจคเฉ‡ เจœเฉ‡เจ•เจฐ เจธเจ•เฉ‹เจฐ เจนเฉ‡เจ เจพเจ‚ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจคเจพเจ‚ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจšเฉ‡เจคเจพเจตเจจเฉ€ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉเฉฐเจฆเฉ€ เจนเฉˆเฅค
  • เจซเจฒเฉˆเจ— --set-exit-code-on-danger เจœเฉ‡เจ•เจฐ เจ–เจผเจคเจฐเฉ‡ เจฆเฉ‡ เจŸเฉˆเจธเจŸเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ‡เฉฑเจ• เจซเฉ‡เจฒ เจนเฉ‹ เจœเจพเจ‚เจฆเจพ เจนเฉˆ เจคเจพเจ‚ เจ•เจฎเจพเจ‚เจก เจจเฉ‚เฉฐ เจ•เฉ‹เจก 3 เจจเจพเจฒ เจซเฉ‡เจฒ เจ•เจฐ เจฆเฉ‡เจตเฉ‡เจ—เจพเฅค

เจนเฉเจฃ เจ†เจ‰ เจ‡เฉฑเจ• เจ•เจธเจŸเจฎ เจŸเฉˆเจธเจŸ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ•เฉ‹เจธเจผเจฟเจธเจผ เจ•เจฐเฉ€เจ เจœเฉ‹ เจœเจพเจ‚เจš เจ•เจฐเจฆเจพ เจนเฉˆ เจ•เจฟ เจ•เฉ€ เจšเจฟเฉฑเจคเจฐ เจ‡เฉฑเจ• เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจฐเจฟเจชเฉ‹เจœเจผเจŸเจฐเฉ€ เจคเฉ‹เจ‚ เจฒเจฟเจ† เจ—เจฟเจ† เจนเฉˆเฅค เจ•เจธเจŸเจฎ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ YAML เจซเจพเจฐเจฎเฉˆเจŸ เจตเจฟเฉฑเจš เจจเจฟเจฐเจฆเจฟเจธเจผเจŸ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ, เจ…เจคเฉ‡ 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 เจซเจพเจˆเจฒเจพเจ‚ เจฆเจพ เจฎเฉเจ†เจ‡เจจเจพ เจ…เจคเฉ‡ เจฎเฉเจฒเจพเจ‚เจ•เจฃ เจ•เจฐเจจ เจฒเจˆ เจฌเจนเฉเจค เจธเจพเจฐเฉ‡ เจธเจพเจงเจจ เจ‰เจชเจฒเจฌเจง เจนเจจ, เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ•เจฟเจตเฉ‡เจ‚ เจกเจฟเจœเจผเจพเจ‡เจจ เจ…เจคเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ เจ‡เจธ เจฌเจพเจฐเฉ‡ เจธเจชเจธเจผเจŸ เจธเจฎเจ เจนเฉ‹เจฃเจพ เจฎเจนเฉฑเจคเจตเจชเฉ‚เจฐเจจ เจนเฉˆ.

เจฎเจฟเจธเจพเจฒ เจฒเจˆ, เจœเฉ‡เจ•เจฐ เจคเฉเจธเฉ€เจ‚ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจฒเฉฐเจ˜ เจฐเจนเฉ‡ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸเจธ เจจเฉ‚เฉฐ เจฒเฉˆเจ‚เจฆเฉ‡ เจนเฉ‹, เจคเจพเจ‚ เจ•เฉเจฌเฉ‡เจตเจพเจฒ เจ…เจœเจฟเจนเฉ€ เจชเจพเจˆเจชเจฒเจพเจˆเจจ เจตเจฟเฉฑเจš เจชเจนเจฟเจฒเจพ เจ•เจฆเจฎ เจนเฉ‹ เจธเจ•เจฆเจพ เจนเฉˆเฅค. เจ‡เจน เจจเจฟเจ—เจฐเจพเจจเฉ€ เจ•เจฐเฉ‡เจ—เจพ เจ•เจฟ เจ•เฉ€ เจ†เจฌเจœเฉˆเจ•เจŸ เจชเจฐเจฟเจญเจพเจธเจผเจพ Kubernetes API เจธเจ•เฉ€เจฎเจพ เจฆเฉ‡ เจ…เจจเฉเจ•เฉ‚เจฒ เจนเฉˆ เจœเจพเจ‚ เจจเจนเฉ€เจ‚เฅค

เจ‡เฉฑเจ• เจตเจพเจฐ เจœเจฆเฉ‹เจ‚ เจ…เจœเจฟเจนเฉ€ เจธเจฎเฉ€เจ–เจฟเจ† เจชเฉ‚เจฐเฉ€ เจนเฉ‹ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจคเจพเจ‚ เจ•เฉ‹เจˆ เจนเฉ‹เจฐ เจตเจงเฉ€เจ† เจŸเฉˆเจธเจŸเจพเจ‚ เจตเฉฑเจฒ เจตเจง เจธเจ•เจฆเจพ เจนเฉˆ, เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจฎเจฟเจ†เจฐเฉ€ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจ…เจคเฉ‡ เจ–เจพเจธ เจจเฉ€เจคเฉ€เจ†เจ‚ เจฆเฉ€ เจชเจพเจฒเจฃเจพเฅค เจ‡เจน เจ‰เจน เจฅเจพเจ‚ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจ•เจฟเจŠเจฌ-เจธเจ•เฉ‹เจฐ เจ…เจคเฉ‡ เจชเฉ‹เจฒเจพเจฐเจฟเจธ เจ•เฉฐเจฎ เจ†เจ‰เจฃเจ—เฉ‡เฅค

เจ‰เจนเจจเจพเจ‚ เจฒเจˆ เจœเจฟเจนเจจเจพเจ‚ เจฆเฉ€เจ†เจ‚ เจ—เฉเฉฐเจเจฒเจฆเจพเจฐ เจฒเฉ‹เฉœเจพเจ‚ เจนเจจ เจ…เจคเฉ‡ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจตเจฟเจธเจฅเจพเจฐ เจตเจฟเฉฑเจš เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจ…เจจเฉเจ•เฉ‚เจฒเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ, เจคเจพเจ‚เจฌเจพ, เจ•เฉŒเจ‚เจซเจฟเจ—-เจฒเจฟเฉฐเจŸ เจ…เจคเฉ‡ เจ•เจจเจซเฉˆเจธเจŸ เจขเฉเจ•เจตเฉ‡เจ‚ เจนเฉ‹เจฃเจ—เฉ‡เฅค.

Confest เจ…เจคเฉ‡ config-lint เจ•เจธเจŸเจฎ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเจจ เจฒเจˆ YAML เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจ, เจ…เจคเฉ‡ เจ•เจพเจชเจฐ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจชเฉ‚เจฐเฉ€ เจชเฉเจฐเฉ‹เจ—เฉเจฐเจพเจฎเจฟเฉฐเจ— เจญเจพเจธเจผเจพ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ, เจ‡เจธ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจฌเจนเฉเจค เจนเฉ€ เจ†เจ•เจฐเจธเจผเจ• เจตเจฟเจ•เจฒเจช เจฌเจฃเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค

เจฆเฉ‚เจœเฉ‡ เจชเจพเจธเฉ‡, เจ•เฉ€ เจ‡เจนเจจเจพเจ‚ เจตเจฟเฉฑเจšเฉ‹เจ‚ เจ•เจฟเจธเฉ‡ เจ‡เฉฑเจ• เจŸเฉ‚เจฒ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ เจ…เจคเฉ‡ เจ‡เจธเจฒเจˆ, เจธเจพเจฐเฉ‡ เจŸเฉˆเจธเจŸเจพเจ‚ เจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจฌเจฃเจพเจ‰เจฃเจพ, เจœเจพเจ‚ เจชเฉ‹เจฒเจพเจฐเจฟเจธ เจจเฉ‚เฉฐ เจคเจฐเจœเฉ€เจน เจฆเฉ‡เจฃเจพ เจ…เจคเฉ‡ เจธเจฟเจฐเจซเจผ เจ‰เจนเฉ€ เจœเฉ‹เฉœเจจเจพ เจนเฉˆ เจœเฉ‹ เจ‡เจธ เจตเจฟเฉฑเจš เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจนเฉˆ? เจ‡เจธ เจธเจตเจพเจฒ เจฆเจพ เจ•เฉ‹เจˆ เจธเจชเฉฑเจธเจผเจŸ เจœเจตเจพเจฌ เจจเจนเฉ€เจ‚ เจนเฉˆ.

เจนเฉ‡เจ เจพเจ‚ เจฆเจฟเฉฑเจคเฉ€ เจธเจพเจฐเจฃเฉ€ เจนเจฐเฉ‡เจ• เจŸเฉ‚เจฒ เจฆเจพ เจธเฉฐเจ–เฉ‡เจช เจตเจฐเจฃเจจ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจฆเฉ€ เจนเฉˆ:

เจŸเฉ‚เจฒ
เจ‰เจฆเฉ‡เจธเจผ
shortcomings
เจ‰เจชเจญเฉ‹เจ—เจคเจพ เจŸเฉˆเจธเจŸ

เจ•เฉเจฌเฉ‡เจตเจพเจฒ
API เจธเจ•เฉ€เจฎเจพ เจฆเฉ‡ เจ‡เฉฑเจ• เจ–เจพเจธ เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง YAML เจชเฉเจฐเจ—เจŸเจพเจตเฉ‡ เจจเฉ‚เฉฐ เจชเฉเจฐเจฎเจพเจฃเจฟเจค เจ•เจฐเจฆเจพ เจนเฉˆ
CRD เจจเจพเจฒ เจ•เฉฐเจฎ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ
เจ•เฉ‹เจˆ

kube-เจธเจ•เฉ‹เจฐ
เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง YAML เจชเฉเจฐเจ—เจŸเจพเจตเฉ‡ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจ•เจฐเจฆเจพ เจนเฉˆ
เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ€ เจœเจพเจ‚เจš เจ•เจฐเจจ เจฒเจˆ เจคเฉเจนเจพเจกเฉ‡ Kubernetes API เจธเฉฐเจธเจ•เจฐเจฃ เจฆเฉ€ เจšเฉ‹เจฃ เจจเจนเฉ€เจ‚ เจ•เฉ€เจคเฉ€ เจœเจพ เจธเจ•เจฆเฉ€
เจ•เฉ‹เจˆ

เจคเจพเจ‚เจฌเจพ
YAML เจฎเฉˆเจจเฉ€เจซเฉˆเจธเจŸ เจฒเจˆ เจ•เจธเจŸเจฎ JavaScript เจŸเฉˆเจธเจŸ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจ†เจฎ เจซเจฐเฉ‡เจฎเจตเจฐเจ•
เจ•เฉ‹เจˆ เจฌเจฟเจฒเจŸ-เจ‡เจจ เจŸเฉˆเจธเจŸ เจจเจนเฉ€เจ‚ เจนเจจเฅค เจ–เจฐเจพเจฌ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ
เจœเฉ€

config-lint
YAML เจตเจฟเฉฑเจš เจเจฎเจฌเฉ‡เจก เจ•เฉ€เจคเฉ€ เจ‡เฉฑเจ• เจกเฉ‹เจฎเฉ‡เจจ-เจตเจฟเจธเจผเฉ‡เจธเจผ เจญเจพเจธเจผเจพ เจตเจฟเฉฑเจš เจŸเฉˆเจธเจŸ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจ†เจฎ เจซเจฐเฉ‡เจฎเจตเจฐเจ•เฅค เจตเฉฑเจ–-เจตเฉฑเจ– เจธเฉฐเจฐเจšเจจเจพ เจซเจพเจฐเจฎเฉˆเจŸเจพเจ‚ เจฆเจพ เจธเจฎเจฐเจฅเจจ เจ•เจฐเจฆเจพ เจนเฉˆ (เจœเจฟเจตเฉ‡เจ‚ เจ•เจฟ เจŸเฉˆเจฐเจพเจซเจพเจฐเจฎ)
เจ•เฉ‹เจˆ เจฐเฉˆเจกเฉ€เจฎเฉ‡เจก เจŸเฉˆเจธเจŸ เจจเจนเฉ€เจ‚ เจนเจจเฅค เจฌเจฟเจฒเจŸ-เจ‡เจจ เจฆเจพเจ…เจตเฉ‡ เจ…เจคเฉ‡ เจซเฉฐเจ•เจธเจผเจจ เจ•เจพเจซเจผเฉ€ เจจเจนเฉ€เจ‚ เจนเฉ‹ เจธเจ•เจฆเฉ‡ เจนเจจ
เจœเฉ€

เจฎเฉเจ•เจพเจฌเจฒเจพ
เจฐเฉ‡เจ—เฉ‹ (เจ‡เฉฑเจ• เจตเจฟเจธเจผเฉ‡เจธเจผ เจชเฉเฉฑเจ›เจ—เจฟเฉฑเจ› เจญเจพเจธเจผเจพ) เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจคเฉเจนเจพเจกเฉ‡ เจ†เจชเจฃเฉ‡ เจŸเฉˆเจธเจŸ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆ เจ‡เฉฑเจ• เจขเจพเจ‚เจšเจพเฅค OCI เจฌเฉฐเจกเจฒเจพเจ‚ เจฐเจพเจนเฉ€เจ‚ เจจเฉ€เจคเฉ€เจ†เจ‚ เจจเฉ‚เฉฐ เจธเจพเจ‚เจเจพ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ
เจ•เฉ‹เจˆ เจฌเจฟเจฒเจŸ-เจ‡เจจ เจŸเฉˆเจธเจŸ เจจเจนเฉ€เจ‚ เจนเจจเฅค เจฎเฉˆเจจเฉ‚เฉฐ เจฐเฉˆเจ—เฉ‹ เจธเจฟเฉฑเจ–เจฃเจพ เจนเฉˆเฅค เจจเฉ€เจคเฉ€เจ†เจ‚ เจชเฉเจฐเจ•เจพเจธเจผเจฟเจค เจ•เจฐเจจ เจตเฉ‡เจฒเฉ‡ เจกเฉŒเจ•เจฐ เจนเฉฑเจฌ เจธเจฎเจฐเจฅเจฟเจค เจจเจนเฉ€เจ‚ เจนเฉˆ
เจœเฉ€

เจชเฉ‹เจฒเจฐเจฟเจธ
เจธเจฎเฉ€เจ–เจฟเจ†เจตเจพเจ‚ YAML เจฎเจฟเจ†เจฐเฉ€ เจตเจงเฉ€เจ† เจ…เจญเจฟเจ†เจธเจพเจ‚ เจฆเฉ‡ เจตเจฟเจฐเฉเฉฑเจง เจชเฉเจฐเจ—เจŸ เจนเฉเฉฐเจฆเจพ เจนเฉˆเฅค เจคเฉเจนเจพเจจเฉ‚เฉฐ JSON เจธเจ•เฉ€เจฎเจพ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ เจŸเฉˆเจธเจŸ เจฌเจฃเจพเจ‰เจฃ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเจพ เจนเฉˆ
JSON เจธเจ•เฉ€เจฎเจพ 'เจคเฉ‡ เจ†เจงเจพเจฐเจฟเจค เจŸเฉˆเจธเจŸ เจธเจฎเจฐเฉฑเจฅเจพเจตเจพเจ‚ เจ•เจพเจซเจผเฉ€ เจจเจนเฉ€เจ‚ เจนเฉ‹ เจธเจ•เจฆเฉ€เจ†เจ‚
เจœเฉ€

เจ•เจฟเจ‰เจ‚เจ•เจฟ เจ‡เจน เจŸเฉ‚เจฒ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ•เจฒเฉฑเจธเจŸเจฐ เจคเฉฑเจ• เจชเจนเฉเฉฐเจš 'เจคเฉ‡ เจจเจฟเจฐเจญเจฐ เจจเจนเฉ€เจ‚ เจ•เจฐเจฆเฉ‡ เจนเจจ, เจ‡เจน เจ‡เฉฐเจธเจŸเจพเจฒ เจ•เจฐเจจ เจฒเจˆ เจ†เจธเจพเจจ เจนเจจเฅค เจ‰เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฐเฉ‹เจค เจซเจพเจˆเจฒเจพเจ‚ เจจเฉ‚เฉฐ เจซเจฟเจฒเจŸเจฐ เจ•เจฐเจจ เจ…เจคเฉ‡ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸเจพเจ‚ เจตเจฟเฉฑเจš เจชเฉเฉฑเจฒ เจฌเฉ‡เจจเจคเฉ€เจ†เจ‚ เจฆเฉ‡ เจฒเฉ‡เจ–เจ•เจพเจ‚ เจจเฉ‚เฉฐ เจคเฉเจฐเฉฐเจค เจซเฉ€เจกเจฌเฉˆเจ• เจชเฉเจฐเจฆเจพเจจ เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจ.

เจ…เจจเฉเจตเจพเจฆเจ• เจคเฉ‹เจ‚ เจชเฉ€.เจเจธ

เจธเจพเจกเฉ‡ เจฌเจฒเฉŒเจ— 'เจคเฉ‡ เจตเฉ€ เจชเฉœเฉเจนเฉ‹:

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹