เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เตพเด•เตเด•เตเด‚ เดจเดฏเด™เตเด™เตพเด•เตเด•เตเด‚ เดŽเดคเดฟเดฐเดพเดฏเดฟ Kubernetes YAML เดธเดพเดงเต‚เด•เดฐเดฟเด•เตเด•เตเด•

เด•เตเดฑเดฟเดชเตเดชเต. เดตเดฟเดตเตผเดคเตเดคเดจเด‚.: K8s เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเด•เตพเด•เตเด•เดพเดฏเตเดณเตเดณ YAML เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเดจเตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดตเตผเดฆเตเดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเดจเตเดธเดฐเดฟเดšเตเดšเต, เด…เดตเดฏเตเดŸเต† เดธเตเดตเดฏเดฎเต‡เดตเดฏเตเดณเตเดณ เดชเดฐเดฟเดถเต‹เดงเดจเดฏเตเดŸเต† เด†เดตเดถเตเดฏเด•เดค เด•เต‚เดŸเตเดคเตฝ เด•เต‚เดŸเตเดคเตฝ เด…เดŸเดฟเดฏเดจเตเดคเดฟเดฐเดฎเดพเดฏเดฟ เดฎเดพเดฑเตเดจเตเดจเต. เดˆ เด…เดตเดฒเต‹เด•เดจเดคเตเดคเดฟเดจเตเดฑเต† เดฐเดšเดฏเดฟเดคเดพเดตเต เดˆ เดŸเดพเดธเตโ€Œเด•เตเด•เดฟเดจเดพเดฏเดฟ เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดชเดฐเดฟเดนเดพเดฐเด™เตเด™เตพ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด• เดฎเดพเดคเตเดฐเดฎเดฒเตเดฒ, เด…เดต เดŽเด™เตเด™เดจเต† เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจเต เด•เดพเดฃเตเดจเตเดจเดคเดฟเดจเต เดตเดฟเดจเตเดฏเดพเดธเด‚ เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเดฎเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเต. เดˆ เดตเดฟเดทเดฏเดคเตเดคเดฟเตฝ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเดตเตผเด•เตเด•เต เด‡เดคเต เดตเดณเดฐเต† เดตเดฟเดœเตเดžเดพเดจเดชเตเดฐเดฆเดฎเดพเดฏเดฟ เดฎเดพเดฑเดฟ.

เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เตพเด•เตเด•เตเด‚ เดจเดฏเด™เตเด™เตพเด•เตเด•เตเด‚ เดŽเดคเดฟเดฐเดพเดฏเดฟ Kubernetes YAML เดธเดพเดงเต‚เด•เดฐเดฟเด•เตเด•เตเด•

เด…เดšเตเดšเต เดกเดฟ.เด†เตผ.: เดˆ เดฒเต‡เด–เดจเด‚ เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เตพเด•เตเด•เตเด‚ เด†เดตเดถเตเดฏเด•เดคเด•เตพเด•เตเด•เตเด‚ เดŽเดคเดฟเดฐเดพเดฏเดฟ Kubernetes YAML เดซเดฏเดฒเตเด•เตพ เดธเดพเดงเต‚เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดตเดฟเดฒเดฏเดฟเดฐเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดฎเดพเดฏเดฟ เด†เดฑเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดŸเต‚เดณเตเด•เดณเต† เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดœเต‹เดฒเดฟเดญเดพเดฐเด™เตเด™เตพ เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ YAML เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเตเด•เดณเตเดŸเต† เดฐเต‚เดชเดคเตเดคเดฟเดฒเดพเดฃเต เดจเดฟเตผเดตเดšเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต. เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เดซเดฏเดฒเตเด•เตพ เดคเดฎเตเดฎเดฟเดฒเตเดณเตเดณ เดจเดฟเดฏเดจเตเดคเตเดฐเดฃเด™เตเด™เดณเต‹ เดฌเดจเตเดงเด™เตเด™เดณเต‹ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฌเตเดฆเตเดงเดฟเดฎเตเดŸเตเดŸเดพเดฃเต YAML-เดฒเต† เด’เดฐเต เดชเตเดฐเดถเตโ€Œเดจเด‚.

เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดŽเดฒเตเดฒเดพ เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเด‚ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเดพเดฃเต เดตเดฐเตเดจเตเดจเดคเต†เดจเตเดจเต เด‰เดฑเดชเตเดชเดพเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเตเด‚?

PodDisruptionBudgets เด‡เดฒเตเดฒเดพเดคเตเดค เดกเดฟเดชเตเดฒเต‹เดฏเตโ€Œเดฎเต†เดจเตเดฑเตเด•เตพ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดŽเดจเดฟเด•เตเด•เต เดŽเด™เตเด™เดจเต† เดคเดŸเดฏเดพเดจเดพเด•เตเด‚?

เดตเดฟเด•เดธเดจ เด˜เดŸเตเดŸเดคเตเดคเดฟเตฝ เดชเดฟเดถเด•เตเด•เดณเตเด‚ เดจเดฏ เดฒเด‚เด˜เดจเด™เตเด™เดณเตเด‚ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเดพเตป เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เดฟเดจเตเดฑเต† เดธเด‚เดฏเต‹เดœเดจเด‚ เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเต เดฑเดฟเดธเต‹เดดเตโ€Œเดธเต เดจเดฟเตผเดตเดšเดจเด™เตเด™เตพ เด•เตƒเดคเตเดฏเดตเตเด‚ เดธเตเดฐเด•เตเดทเดฟเดคเดตเตเดฎเดพเดฃเต†เดจเตเดจเตเดณเตเดณ เด—เตเดฏเดพเดฐเดจเตเดฑเดฟ เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด‰เตฝเดชเตเดชเดพเดฆเดจ เดœเต‹เดฒเดฟเดญเดพเดฐเด‚ เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เตพ เดชเดฟเดจเตเดคเตเดŸเดฐเดพเดจเตเดณเตเดณ เดธเดพเดงเตเดฏเดค เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดธเตเดฑเตเดฑเดพเดฑเตเดฑเดฟเด•เต YAML เดซเดฏเตฝ เดชเดฐเดฟเดถเต‹เดงเดจเดพ เด‡เด•เตเด•เต‹เดธเดฟเดธเตเดฑเตเดฑเดคเตเดคเต† เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดตเดฟเดญเดพเด—เด™เตเด™เดณเดพเดฏเดฟ เดคเดฟเดฐเดฟเด•เตเด•เดพเด‚:

  • API เดตเดพเดฒเดฟเดกเต‡เดฑเตเดฑเดฑเตเด•เตพ. เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดฒเต† เดŸเต‚เดณเตเด•เตพ, Kubernetes API เดธเต†เตผเดตเดฑเดฟเดจเตเดฑเต† เด†เดตเดถเตเดฏเด•เดคเด•เตพเด•เตเด•เต†เดคเดฟเดฐเต† YAML เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต.
  • เดฑเต†เดกเดฟ เดŸเต†เดธเตเดฑเตเดฑเตผเดฎเดพเตผ. เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดŸเต‚เดณเตเด•เตพ เดธเตเดฐเด•เตเดท, เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เตพ เดชเดพเดฒเดฟเด•เตเด•เตฝ เดคเตเดŸเด™เตเด™เดฟเดฏเดตเดฏเตโ€Œเด•เตเด•เดพเดฏเตเดณเตเดณ เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพเด•เตเด•เตŠเดชเตเดชเด‚ เดตเดฐเตเดจเตเดจเต.
  • เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เดฎเต‚เดฒเตเดฏเดจเดฟเตผเดฃเตเดฃเดฏเด•เตเด•เดพเตผ. เดตเดฟเดตเดฟเดง เดญเดพเดทเด•เดณเดฟเตฝ เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เดพเตป เดˆ เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดจเตเดฑเต† เดชเตเดฐเดคเดฟเดจเดฟเดงเดฟเด•เตพ เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, Rego, Javascript.

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดžเด™เตเด™เตพ เด†เดฑเต เดตเตเดฏเดคเตเดฏเดธเตเดค เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดคเดพเดฐเดคเดฎเตเดฏเด‚ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚:

  1. เด•เตเดฌเต‡เดตเตฝ;
  2. เด•เตเดฌเต†-เดธเตเด•เต‹เตผ;
  3. เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป-เดฒเดฟเดจเตเดฑเต;
  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 เดตเดดเดฟเดฏเดพเดฃเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดจเตเดจเดคเต เดŽเดจเตเดจเดคเดพเดฃเต เด†เดถเดฏเด‚. เดฎเดฑเตเดฑเตŠเดฐเต เดตเดฟเดงเดคเตเดคเดฟเตฝ เดชเดฑเดžเตเดžเดพเตฝ, เดจเตฝเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ YAML เด…เดคเดฟเดจเต‹เดŸเต เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเตเดฃเตเดŸเต‹เดฏเต†เดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต API เดธเตเด•เต€เดฎ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃเด‚ เดจเต‹เด•เตเด•เดพเด‚.

เด‡เดจเตเดธเตเดฑเตเดฑเดฒเตเดฒเต‡เดทเดจเต เดจเดฟเดฐเตเดฆเตเดฆเต‡เดถเด™เตเด™เดณเต 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 เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต kubeval เดชเตเดฑเดคเตเดคเตเด•เดŸเด•เตเด•เตเด‚. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดฐเต€เดคเดฟเดฏเดฟเตฝ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

$ echo $?
0

เดฎเดฑเตเดฑเตŠเดฐเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฎเตเด•เตเด•เต เด‡เดชเตเดชเต‹เตพ kubeval เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเด‚:

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

(kubeval-invalid.yaml)

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดฃเตเดฃเตเด•เตŠเดฃเตเดŸเต เดชเตเดฐเดถเตเดจเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป เด•เดดเดฟเดฏเตเดฎเต‹? เดจเดฎเตเด•เตเด•เต เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เดพเด‚:

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

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

เด‰เดฑเดตเดฟเดŸเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเดšเตเดšเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.

API เดชเดคเดฟเดชเตเดชเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจ เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ apps/v1, เดชเต‹เดกเดฟเดจเตเดฑเต† เดฒเต‡เดฌเดฒเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจ เด’เดฐเต เดธเต†เดฒเด•เตเดŸเตผ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฃเด‚. เดฎเตเด•เดณเดฟเดฒเต† เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเดฟเตฝ เดธเต†เดฒเด•เตเดŸเตผ เด‰เตพเดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ kubeval เด’เดฐเต เดชเดฟเดถเด•เต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดชเต‚เดœเตเดฏเดฎเดฒเตเดฒเดพเดคเตเดค เด•เต‹เดกเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเตเดฑเดคเตเดคเตเด•เดŸเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดคเต.

เด…เด™เตเด™เดจเต† เดšเต†เดฏเตเดคเดพเตฝ เดŽเดจเตเดคเต เดธเด‚เดญเดตเดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดžเดพเตป เด…เดคเตเดญเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเต kubectl apply -f เดˆ เดชเตเดฐเด•เดŸเดจเดชเดคเตเดฐเดฟเด•เดฏเตเดฎเดพเดฏเดฟ?

เดถเดฐเดฟ, เดจเดฎเตเด•เตเด•เต เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚:

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

เด•เตเดฌเต‡เดตเตฝ เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต เดจเตฝเด•เดฟเดฏ เดคเต†เดฑเตเดฑเต เด‡เดคเดพเดฃเต. เด’เดฐเต เดธเต†เดฒเด•เตเดŸเตผ เดšเต‡เตผเดคเตเดคเตเด•เตŠเดฃเตเดŸเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเดจเดพเด•เตเด‚:

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 เดธเตเด•เต€เดฎเดฏเตโ€Œเด•เตเด•เต†เดคเดฟเดฐเดพเดฏ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ kubeval เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดฎเดฟเด•เตเด• เด•เต‡เดธเตเด•เดณเดฟเดฒเตเด‚ เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸ Kubernetes เดฑเดฟเดฒเต€เดธเดฟเดจเต†เดคเดฟเดฐเต† เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เดชเดคเดพเด• เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด‡เดคเต เดšเต†เดฏเตเดฏเดพเด‚ --kubernetes-version:

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

เดชเดคเดฟเดชเตเดชเต เดซเต‹เตผเดฎเดพเดฑเตเดฑเดฟเตฝ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เดฃเด‚ เดŽเดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด• Major.Minor.Patch.

เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเดคเตเดคเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจ เดชเดคเดฟเดชเตเดชเตเด•เดณเตเดŸเต† เด’เดฐเต เดฒเดฟเดธเตโ€Œเดฑเตเดฑเดฟเดจเดพเดฏเดฟ, เดฆเดฏเดตเดพเดฏเดฟ เดฑเดซเตผ เดšเต†เดฏเตเดฏเตเด• GitHub-เดฒเต† JSON เดธเตเด•เต€เดฎ, เดเดคเต เด•เตเดฌเต‡เดตเตฝ เดธเดพเดงเต‚เด•เดฐเดฃเดคเตเดคเดฟเดจเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต kubeval เด“เดซเตโ€Œเดฒเตˆเดจเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เดฃเดฎเต†เด™เตเด•เดฟเตฝ, เดธเตเด•เต€เดฎเด•เตพ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดคเต เดซเตเดฒเดพเด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด…เดตเดฏเตเดŸเต† เดชเตเดฐเดพเดฆเต‡เดถเดฟเด• เดธเตเดฅเดพเดจเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเด• --schema-location.

เดตเตเดฏเด•เตเดคเดฟเด—เดค YAML เดซเดฏเดฒเตเด•เตพเด•เตเด•เต เดชเตเดฑเดฎเต‡, kubeval-เดจเต เดกเดฏเดฑเด•เตเดŸเดฑเดฟเด•เตพ, stdin เดŽเดจเตเดจเดฟเดตเดฏเดฟเดฒเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเดจเดพเด•เตเด‚.

เด•เต‚เดŸเดพเดคเต†, เด•เตเดฌเต‡เดตเตฝ เดธเดฟเด เดชเตˆเดชเตเดชเตเดฒเตˆเดจเดฟเดฒเต‡เด•เตเด•เต เดŽเดณเตเดชเตเดชเดคเตเดคเดฟเตฝ เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต. เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดจเดŸเดคเตเดคเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดตเตผเด•เตเด•เต, kubeval เดฎเต‚เดจเตเดจเต เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเต เดซเต‹เตผเดฎเดพเดฑเตเดฑเตเด•เดณเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเต เดŽเดจเตเดจเดฑเดฟเดฏเตเดจเตเดจเดคเดฟเตฝ เดธเดจเตเดคเต‹เดทเดฎเตเดฃเตเดŸเต:

  1. เดชเตเดฒเต†เดฏเดฟเตป เดŸเต†เด•เตเดธเตเดฑเตเดฑเต;
  2. JSON;
  3. เดŸเต†เดธเตเดฑเตเดฑเต เดŽเดจเดฟเดคเดฟเด‚เด—เต เดชเตเดฐเต‹เดŸเตเดŸเต‹เด•เตเด•เต‹เตพ (TAP).

เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดซเดฒเด™เตเด™เดณเตเดŸเต† เด’เดฐเต เดธเด‚เด—เตเดฐเดนเด‚ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเดฟเดจเตเดฑเต† เด•เต‚เดŸเตเดคเตฝ เดชเดพเดดเตเดธเดฟเด‚เด—เดฟเดจเดพเดฏเดฟ เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดซเต‹เตผเดฎเดพเดฑเตเดฑเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚.

เด•เตเดฌเต‡เดตเดฒเดฟเดจเตเดฑเต† เด’เดฐเต เดชเต‹เดฐเดพเดฏเตเดฎ, เด•เดธเตเดฑเตเดฑเด‚ เดฑเดฟเดธเต‹เดดเตโ€Œเดธเต เดกเต†เดซเดจเดฟเดทเดจเตเด•เตพ (เดธเดฟเด†เตผเดกเดฟ) เดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต‹เดฏเต†เดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เดจเดฟเดฒเดตเดฟเตฝ เด…เดคเดฟเดจเต เด•เดดเดฟเดฏเดฟเดฒเตเดฒ เดŽเดจเตเดจเดคเดพเดฃเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, kubeval เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเดพเตป เดธเดพเดงเดฟเด•เตเด•เตเด‚ เด…เดตเดฐเต† เด…เดตเด—เดฃเดฟเด•เตเด•เตเด•.

เดตเดฟเดญเดตเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดตเดฟเดฒเดฏเดฟเดฐเตเดคเตเดคเตเดจเตเดจเดคเดฟเดจเตเดฎเตเดณเตเดณ เด’เดฐเต เดฎเดฟเด•เดšเตเดš เด‰เดชเด•เดฐเดฃเดฎเดพเดฃเต เด•เตเดฌเต‡เดตเตฝ; เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดชเดฐเต€เด•เตเดทเดฏเดฟเตฝ เดตเดฟเดœเดฏเดฟเด•เตเด•เตเดจเตเดจเดคเต เดฑเดฟเดธเต‹เดดเตโ€Œเดธเต เดฎเดฟเด•เดšเตเดš เดธเดฎเตเดชเตเดฐเดฆเดพเดฏเด™เตเด™เดณเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเตเดตเต†เดจเตเดจเต เด‰เดฑเดชเตเดชเตเดจเตฝเด•เตเดจเตเดจเดฟเดฒเตเดฒ เดŽเดจเตเดจเดคเต เดŠเดจเตเดจเดฟเดชเตเดชเดฑเดฏเต‡เดฃเตเดŸเดคเดพเดฃเต.

เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดŸเดพเด—เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต latest เด’เดฐเต เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเดฟเตฝ เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เตพ เดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, kubeval เด‡เดคเต เด’เดฐเต เดชเดฟเดถเด•เดพเดฏเดฟ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เด…เดคเต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดฟเดฒเตเดฒ. เด…เดคเดพเดฏเดคเต, เด…เดคเตเดคเดฐเด‚ YAML-เดจเตเดฑเต† เดธเตเดฅเดฟเดฐเต€เด•เดฐเดฃเด‚ เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเตเด•เดณเดฟเดฒเตเดฒเดพเดคเต† เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเด•เตเด‚.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต YAML เดตเดฟเดฒเดฏเดฟเดฐเตเดคเตเดคเดพเดจเตเด‚ เดŸเดพเด—เต เดชเต‹เดฒเตเดณเตเดณ เดฒเด‚เด˜เดจเด™เตเด™เตพ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเดพเดจเตเด‚ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเตเด‚ latest? เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เตพเด•เตเด•เต†เดคเดฟเดฐเต† เด’เดฐเต YAML เดซเดฏเตฝ เดŽเด™เตเด™เดจเต† เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚?

2. เด•เตเดฌเต†-เดธเตเด•เต‹เตผ

เด•เตเดฌเต†-เดธเตเด•เต‹เตผ YAML เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพเด•เตเด•เต†เดคเดฟเดฐเต† เด…เดตเดฏเต† เดตเดฟเดฒเดฏเดฟเดฐเตเดคเตเดคเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดธเตเดฐเด•เตเดทเดพ เดฎเดพเตผเด—เตเด—เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เดณเตเด‚ เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เดณเตเด‚ เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเดพเดฃเต เดˆ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเดจเตเดจเดคเต, เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดต:

  • เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเต เดฑเต‚เดŸเตเดŸเต เด†เดฏเดฟเดŸเตเดŸเดฒเตเดฒ.
  • เดชเต‹เดกเต เด†เดฐเต‹เด—เตเดฏ เดชเดฐเดฟเดถเต‹เดงเดจเด•เดณเตเดŸเต† เดฒเดญเตเดฏเดค.
  • เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพเด•เตเด•เดพเดฏเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเตเด‚ เดชเดฐเดฟเดงเดฟเด•เดณเตเด‚ เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดชเดฐเดฟเดถเต‹เดงเดจเดพ เดซเดฒเด™เตเด™เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ, เดฎเต‚เดจเตเดจเต เดซเดฒเด™เตเด™เตพ เดจเตฝเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต: OK, เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต ะธ เด•เตเดฐเดฟเดŸเตเดŸเดฟเด•เตเด•เตฝ.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด“เตบเดฒเตˆเดจเดฟเตฝ Kube-เดธเตเด•เต‹เตผ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดพเดตเตเดจเตเดจเดคเดพเดฃเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเดฟ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเด‚.

เดฏเดฅเดพเตผเดคเตเดฅ เดฒเต‡เด–เดจเด‚ เดŽเดดเตเดคเตเดฎเตเดชเต‹เตพ, เด•เตเดฏเต‚เดฌเต-เดธเตเด•เต‹เดฑเดฟเดจเตเดฑเต† เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต 1.7.0 เด†เดฏเดฟเดฐเตเดจเตเดจเต.

เดจเดฎเตเดฎเตเดŸเต† เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเดฟเตฝ เดชเดฐเต€เด•เตเดทเดฟเดšเตเดšเต เดจเต‹เด•เตเด•เดพเด‚ base-valid.yaml:

$ kube-score score base-valid.yaml

apps/v1/Deployment http-echo
[CRITICAL] Container Image Tag
  ยท http-echo -> Image with latest tag
      Using a fixed tag is recommended to avoid accidental upgrades
[CRITICAL] Pod NetworkPolicy
  ยท The pod does not have a matching network policy
      Create a NetworkPolicy that targets this pod
[CRITICAL] Pod Probes
  ยท Container is missing a readinessProbe
      A readinessProbe should be used to indicate when the service is ready to receive traffic.
      Without it, the Pod is risking to receive traffic before it has booted. It is also used during
      rollouts, and can prevent downtime if a new version of the application is failing.
      More information: https://github.com/zegl/kube-score/blob/master/README_PROBES.md
[CRITICAL] Container Security Context
  ยท http-echo -> Container has no configured security context
      Set securityContext to run the container in a more secure context.
[CRITICAL] Container Resources
  ยท http-echo -> CPU limit is not set
      Resource limits are recommended to avoid resource DDOS. Set resources.limits.cpu
  ยท http-echo -> Memory limit is not set
      Resource limits are recommended to avoid resource DDOS. Set resources.limits.memory
  ยท http-echo -> CPU request is not set
      Resource requests are recommended to make sure that the application can start and run without
      crashing. Set resources.requests.cpu
  ยท http-echo -> Memory request is not set
      Resource requests are recommended to make sure that the application can start and run without crashing.
      Set resources.requests.memory
[CRITICAL] Deployment has PodDisruptionBudget
  ยท No matching PodDisruptionBudget was found
      It is recommended to define a PodDisruptionBudget to avoid unexpected downtime during Kubernetes
      maintenance operations, such as when draining a node.
[WARNING] Deployment has host PodAntiAffinity
  ยท Deployment does not have a host podAntiAffinity set
      It is recommended to set a podAntiAffinity that stops multiple pods from a deployment from
      being scheduled on the same node. This increases availability in case the node becomes unavailable.

YAML kubeval เดŸเต†เดธเตเดฑเตเดฑเตเด•เดณเดฟเตฝ เดตเดฟเดœเดฏเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเต‡เดธเดฎเดฏเด‚ เด•เตเดฏเต‚เดฌเต-เดธเตเด•เต‹เตผ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดชเต‹เดฐเดพเดฏเตเดฎเด•เดณเดฟเดฒเต‡เด•เตเด•เต เดตเดฟเดฐเตฝ เดšเต‚เดฃเตเดŸเตเดจเตเดจเต:

  • เดฑเต†เดกเดฟเดจเดธเต เดšเต†เด•เตเด•เตเด•เตพ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.
  • เดธเดฟเดชเดฟเดฏเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพเด•เตเด•เตเด‚ เดฎเต†เดฎเตเดฎเดฑเดฟเด•เตเด•เตเด‚ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเต‹ เดชเดฐเดฟเดงเดฟเด•เดณเต‹ เด‡เดฒเตเดฒ.
  • เดชเต‹เดกเต เดคเดŸเดธเตเดธเดชเตเดชเต†เดŸเตเดคเตเดคเตฝ เดฌเดœเดฑเตเดฑเตเด•เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.
  • เดตเต‡เตผเดชเดฟเดฐเดฟเดฏเตฝ เดจเดฟเดฏเดฎเด™เตเด™เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ (เด†เดจเตเดฑเดฟ เด…เดซเดฟเดจเดฟเดฑเตเดฑเดฟ) เดฒเดญเตเดฏเดค เดชเดฐเดฎเดพเดตเดงเดฟเดฏเดพเด•เตเด•เดพเตป.
  • เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เดฑเต‚เดŸเตเดŸเต เด†เดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต.

เดตเดฟเดจเตเดฏเดพเดธเด‚ เด•เต‚เดŸเตเดคเตฝ เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดตเตเด‚ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดตเตเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸ เดชเต‹เดฐเดพเดฏเตเดฎเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดธเดพเดงเตเดตเดพเดฏ เดชเต‹เดฏเดฟเดจเตเดฑเตเด•เดณเดพเดฃเดฟเดตเดฏเต†เดฒเตเดฒเดพเด‚.

เดŸเต€เด‚ kube-score เดŽเดฒเตเดฒเดพ เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เดฒเด‚เด˜เดจเด™เตเด™เดณเตเด‚ เด‰เตพเดชเตเดชเต†เดŸเต† เดฎเดจเตเดทเตเดฏเตผเด•เตเด•เต เดตเดพเดฏเดฟเด•เตเด•เดพเดตเตเดจเตเดจ เดฐเต‚เดชเดคเตเดคเดฟเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต ะธ เด•เตเดฐเดฟเดŸเตเดŸเดฟเด•เตเด•เตฝ, เด‡เดคเต เดตเดฟเด•เดธเดจ เดธเดฎเดฏเดคเตเดคเต เดตเดณเดฐเต†เดฏเดงเดฟเด•เด‚ เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต.

CI เดชเตˆเดชเตเดชเตเดฒเตˆเดจเดฟเดจเตเดณเตเดณเดฟเตฝ เดˆ เด‰เดชเด•เดฐเดฃเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเดตเตผเด•เตเด•เต เดซเตเดฒเดพเด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเตฝ เด•เด‚เดชเตเดฐเดธเต เดšเต†เดฏเตเดค เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ --output-format ci (เดˆ เดธเดพเดนเดšเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดซเดฒเดคเตเดคเต‹เดŸเตเด•เต‚เดŸเดฟเดฏ เดชเดฐเดฟเดถเต‹เดงเดจเด•เดณเตเด‚ เดชเตเดฐเดฆเตผเดถเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚ OK):

$ kube-score score base-valid.yaml --output-format ci

[OK] http-echo apps/v1/Deployment
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU limit is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Memory limit is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU request is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Memory request is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Image with latest tag
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: The pod does not have a matching network policy
[CRITICAL] http-echo apps/v1/Deployment: Container is missing a readinessProbe
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Container has no configured security context
[CRITICAL] http-echo apps/v1/Deployment: No matching PodDisruptionBudget was found
[WARNING] http-echo apps/v1/Deployment: Deployment does not have a host podAntiAffinity set
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service

kubeval เดชเต‹เดฒเต†, kube-score เดชเดฐเดพเดœเดฏเดชเตเดชเต†เดŸเตเดฎเตเดชเต‹เตพ เด’เดฐเต เดจเต‹เตบ-เดธเต€เดฑเต‹ เดŽเด•เตเดธเดฟเดฑเตเดฑเต เด•เต‹เดกเต เดจเตฝเด•เตเดจเตเดจเต เด•เตเดฐเดฟเดŸเตเดŸเดฟเด•เตเด•เตฝ. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดธเดฎเดพเดจเดฎเดพเดฏ เดชเตเดฐเต‹เดธเดธเตเดธเดฟเด‚เด—เต เดชเตเดฐเดตเตผเดคเตเดคเดจเด•เตเดทเดฎเดฎเดพเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚ เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต.

เด•เต‚เดŸเดพเดคเต†, เดตเตเดฏเดคเตเดฏเดธเตเดค API เดชเดคเดฟเดชเตเดชเตเด•เตพ (kubeval เดชเต‹เดฒเต†) เดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เดธเดพเดงเดฟเด•เตเด•เตเด‚. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดˆ เดตเดฟเดตเดฐเด™เตเด™เตพ เด•เตเดฏเต‚เดฌเต-เดธเตโ€Œเด•เต‹เดฑเดฟเตฝ เดคเดจเตเดจเต† เดนเดพเตผเดกเตโ€Œเด•เต‹เดกเต เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต: เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดจเตเดฑเต† เดฎเดฑเตเดฑเตŠเดฐเต เดชเดคเดฟเดชเตเดชเต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ. เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เตเดฒเดธเตเดฑเตเดฑเตผ เด…เดชเตโ€Œเด—เตเดฐเต‡เดกเต เดšเต†เดฏเตเดฏเดพเดจเดพเดฃเต เดจเดฟเด™เตเด™เตพ เด‰เดฆเตเดฆเต‡เดถเดฟเด•เตเด•เตเดจเตเดจเต†เด™เตเด•เดฟเดฒเต‹ K8-เดจเตเดฑเต† เดตเตเดฏเดคเตเดฏเดธเตเดค เดชเดคเดฟเดชเตเดชเตเด•เดณเตเดณเตเดณ เด’เดจเตเดจเดฟเดฒเดงเดฟเด•เด‚ เด•เตเดฒเดธเตเดฑเตเดฑเดฑเตเด•เตพ เดจเดฟเด™เตเด™เตพเด•เตเด•เตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ เดˆ เดชเดฐเดฟเดฎเดฟเดคเดฟ เด’เดฐเต เดตเดฒเดฟเดฏ เดชเตเดฐเดถเตโ€Œเดจเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เด…เดคเดฒเตเดฒ เด‡เดคเดฟเดจเด•เด‚ เด’เดฐเต เดชเตเดฐเดถเตเดจเดฎเตเดฃเตเดŸเต เดˆ เด…เดตเดธเดฐเด‚ เดธเดพเด•เตเดทเดพเดคเตเด•เดฐเดฟเด•เตเด•เดพเดจเตเดณเตเดณ เดจเดฟเตผเดฆเตเดฆเต‡เดถเดคเตเดคเต‹เดŸเต†.

เด•เตเดฏเต‚เดฌเต-เดธเตเด•เต‹เดฑเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพ เด‡เดตเดฟเดŸเต† เด•เดพเดฃเดพเด‚ เด”เดฆเตเดฏเต‹เด—เดฟเด• เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเต.

เดฎเดฟเด•เดšเตเดš เดธเดฎเตเดชเตเดฐเดฆเดพเดฏเด™เตเด™เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฎเดฟเด•เดšเตเดš เด‰เดชเด•เดฐเดฃเดฎเดพเดฃเต เด•เตเดฏเต‚เดฌเต-เดธเตเด•เต‹เตผ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ, เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพ เดŸเต†เดธเตเดฑเตเดฑเดฟเตฝ เดฎเดพเดฑเตเดฑเด™เตเด™เตพ เดตเดฐเตเดคเตเดคเตเด•เดฏเต‹ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดจเดฟเดฏเดฎเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เตเด•เดฏเต‹ เดšเต†เดฏเตเดฏเดฃเดฎเต†เด™เตเด•เดฟเตฝ เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเตเด‚? เด…เดฏเตเดฏเต‹, เด‡เดคเต เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ.

เด•เตเดฏเต‚เดฌเต-เดธเตเด•เต‹เตผ เดตเดฟเดชเตเดฒเต€เด•เดฐเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ: เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด…เดคเดฟเตฝ เดจเดฏเด™เตเด™เตพ เดšเต‡เตผเด•เตเด•เดพเดจเต‹ เด•เตเดฐเดฎเต€เด•เดฐเดฟเด•เตเด•เดพเดจเต‹ เด•เดดเดฟเดฏเดฟเดฒเตเดฒ.

เด•เดฎเตเดชเดจเดฟ เดชเต‹เดณเดฟเดธเดฟเด•เตพ เดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต‹เดฏเต†เดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เดŽเดดเตเดคเดฃเดฎเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เดจเดพเดฒเต เดŸเต‚เดณเตเด•เดณเดฟเตฝ เด’เดจเตเดจเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚: เด•เต‹เตบเดซเดฟเด—เต-เดฒเดฟเดจเตเดฑเต, เด•เต‹เดชเตเดชเตผ, เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเต‹เดณเดพเดฐเดฟเดธเต.

3.Config-lint

YAML, JSON, Terraform, CSV เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเตเด•เตพ, Kubernetes เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดŽเดจเตเดจเดฟเดต เดธเดพเดงเต‚เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เด‰เดชเด•เดฐเดฃเดฎเดพเดฃเต เด•เต‹เตบเดซเดฟเด—เต-เดฒเดฟเดจเตเดฑเต.

เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดชเดฆเตเดงเดคเดฟ เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเดฟเตฝ.

เดฏเดฅเดพเตผเดคเตเดฅ เดฒเต‡เด–เดจเด‚ เดŽเดดเตเดคเตเดจเตเดจ เดธเดฎเดฏเดคเตเดคเต† เดจเดฟเดฒเดตเดฟเดฒเต† เดฑเดฟเดฒเต€เดธเต 1.5.0 เด†เดฃเต.

เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเดพเดงเต‚เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เด•เต‹เตบเดซเดฟเด—เต-เดฒเดฟเดจเตเดฑเดฟเดฒเดฟเดฒเตเดฒ.

เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เดจเดŸเดคเตเดคเดพเตป, เดจเดฟเด™เตเด™เตพ เด‰เดšเดฟเดคเดฎเดพเดฏ เดจเดฟเดฏเดฎเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด…เดต "เดฑเต‚เตพเดธเต†เดฑเตเดฑเตเด•เตพ" เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจ YAML เดซเดฏเดฒเตเด•เดณเดฟเตฝ เดŽเดดเตเดคเดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต (เดจเดฟเดฏเดฎเด™เตเด™เตพ), เด•เต‚เดŸเดพเดคเต† เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด˜เดŸเดจเดฏเตเดฃเตเดŸเต:

version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
  - "*.yaml"
rules:
   # ัะฟะธัะพะบ ะฟั€ะฐะฒะธะป

(rule.yaml)

เดจเดฎเตเด•เตเด•เต เด‡เดคเต เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เดชเด เดฟเด•เตเด•เดพเด‚:

  • เดซเต€เตฝเดกเต type เดเดคเต เดคเดฐเดคเตเดคเดฟเดฒเตเดณเตเดณ เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป-เดฒเดฟเดจเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดฎเต†เดจเตเดจเต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เตเดจเตเดจเต. 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
[]

YAML DSL เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต Kubernetes YAML เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเดพเดงเต‚เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดตเดพเด—เตเดฆเดพเดจ เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเดพเดฃเต เด•เต‹เตบเดซเดฟเด—เต-เดฒเดฟเดจเตเดฑเต.

เดŽเดจเตเดจเดพเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เต‚เดŸเตเดคเตฝ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เดฏเตเด•เตเดคเดฟเดฏเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดจเด•เดณเตเด‚ เดตเต‡เดฃเดฎเต†เด™เตเด•เดฟเตฝ เดŽเดจเตเดคเตเดšเต†เดฏเตเดฏเตเด‚? YAML เด‡เดคเดฟเดจเต เดตเดณเดฐเต† เดชเดฐเดฟเดฎเดฟเดคเดฎเดฒเตเดฒเต‡? เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดชเต‚เตผเดฃเตเดฃ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดญเดพเดทเดฏเดฟเตฝ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดจเดพเดฏเดพเดฒเต‹?

4. เดšเต†เดฎเตเดชเต

เดšเต†เดฎเตเดชเต V2 เด•เดธเตเดฑเตเดฑเด‚ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ (config-lint เดชเต‹เดฒเต†) เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเดพเดงเต‚เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเดพเดฃเต.

เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดŸเต†เดธเตเดฑเตเดฑเตเด•เดณเต† เดตเดฟเดตเดฐเดฟเด•เตเด•เดพเตป YAML เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ เดŽเดจเตเดจเดคเดฟเดจเดพเตฝ เด‡เดคเต เดฐเดฃเตเดŸเดพเดฎเดคเตเดคเต‡เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฃเต. เดชเด•เดฐเด‚ เดœเดพเดตเดพเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเดฟเตฝ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดŽเดดเตเดคเดพเด‚. เดšเต†เดฎเตเดชเต เดจเดฟเดฐเดตเดงเดฟ เด…เดŸเดฟเดธเตเดฅเดพเดจ เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเดณเตเดณ เด’เดฐเต เดฒเตˆเดฌเตเดฐเดฑเดฟ เดจเตฝเด•เตเดจเตเดจเต, เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเตเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดตเดฟเดตเดฐเด™เตเด™เตพ เดตเดพเดฏเดฟเด•เตเด•เดพเดจเตเด‚ เดชเดฟเดถเด•เตเด•เตพ เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดจเดฟเด™เตเด™เดณเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต.

เด•เต‹เดชเตเดชเตผ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด˜เดŸเตเดŸเด™เตเด™เตพ เด‡เดคเดฟเตฝ เด•เดพเดฃเดพเด‚ เด”เดฆเตเดฏเต‹เด—เดฟเด• เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป.

เดฏเดฅเดพเตผเดคเตเดฅ เดฒเต‡เด–เดจเด‚ เดŽเดดเตเดคเตเดจเตเดจ เดธเดฎเดฏเดคเตเดคเต เดˆ เดฏเต‚เดŸเตเดŸเดฟเดฒเดฟเดฑเตเดฑเดฟเดฏเตเดŸเต† เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเดพเดฃเต 2.0.1.

เด•เต‹เตบเดซเดฟเด—เตผ-เดฒเดฟเดจเตเดฑเต เดชเต‹เดฒเต†, เด•เต‹เดชเตเดชเดฑเดฟเดจเต เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เด‡เดฒเตเดฒ. เด’เดจเตเดจเต เดŽเดดเตเดคเดพเด‚. เดตเดฟเดจเตเดฏเดพเดธเด™เตเด™เตพ เดชเต‹เดฒเตเดณเตเดณ เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดพเดฏ เดถเต‡เด–เดฐเดฃเด™เตเด™เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดฎเดพเดคเตเดฐเดฎเดพเดฏเดฟ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเตผ เด‡เดฎเต‡เดœเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเต เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเด• 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 เดธเดตเดฟเดถเต‡เดทเดคเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚.

เด•เต‹เดชเตเดชเดฑเดฟเดจเตเดฑเต† เดจเดฟเดฒเดตเดฟเดฒเต† เดชเดคเดฟเดชเตเดชเต ES5 เด…เดฒเตเดฒ, JavaScript เดŽเดžเตเดšเดฟเดจเตเดฑเต† ES6 เดชเดคเดฟเดชเตเดชเดฟเดฒเดพเดฃเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต เดŽเดจเตเดจเดคเตเด‚ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดพเดฃเต.

เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพ เดฒเดญเตเดฏเดฎเดพเดฃเต เด”เดฆเตเดฏเต‹เด—เดฟเด• เดชเดฆเตเดงเดคเดฟ เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเต.

เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ JavaScript เด‡เดทเตโ€ŒเดŸเดชเตเดชเต†เดŸเตเดจเตเดจเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดšเต‹เดฆเตเดฏเด™เตเด™เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดจเดฏเด™เตเด™เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฎเดพเดฏเดฟ เดชเตเดฐเดคเตเดฏเต‡เด•เด‚ เดฐเต‚เดชเด•เตฝเดชเตเดชเดจ เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดญเดพเดทเดฏเดพเดฃเต เดจเดฟเด™เตเด™เตพ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเดจเตเดจเดคเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ เด•เต‹เตบเดซเตโ€Œเดฑเตเดฑเดธเตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เดฃเด‚.

5.เดฎเดคเตเดธเดฐเด‚

เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดกเดพเดฑเตเดฑ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเดพเดฃเต เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเต. เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเด‚ เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเดฃเต. เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เด…เดจเตเดตเต‡เดทเดฃ เดญเดพเดท เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเดพเดฃเต เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต เดฐเต†เด—เตŠ.

เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเด‚ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพเดชเดฆเตเดงเดคเดฟ เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเดฟเตฝ เดฒเดฟเดธเตเดฑเตเดฑเต เดšเต†เดฏเตเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต.

เดฏเดฅเดพเตผเดคเตเดฅ เดฒเต‡เด–เดจเด‚ เดŽเดดเตเดคเตเดฎเตเดชเต‹เตพ, เดฒเดญเตเดฏเดฎเดพเดฏ เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดชเดคเดฟเดชเตเดชเต 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

เดตเดฟเดถเตเดตเดธเดจเต€เดฏเดฎเดฒเตเดฒเดพเดคเตเดค เด‰เดฑเดตเดฟเดŸเดคเตเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดšเดฟเดคเตเดฐเด™เตเด™เตพ เดตเดจเตเดจเดคเดฟเดจเดพเตฝ เดชเดฐเต€เด•เตเดทเดฃเด‚ เดชเดฐเดพเดœเดฏเดชเตเดชเต†เดŸเตเดŸเต.

Rego เดซเดฏเดฒเดฟเตฝ เดจเดฎเตเดฎเตพ เดฌเตเดฒเต‹เด•เตเด•เต เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจเต deny. เด…เดคเดฟเดจเตเดฑเต† เดธเดคเตเดฏเด‚ เด’เดฐเต เดฒเด‚เด˜เดจเดฎเดพเดฏเดฟ เด•เดฃเด•เตเด•เดพเด•เตเด•เดชเตเดชเต†เดŸเตเดจเตเดจเต. เดฌเตเดฒเต‹เด•เตเด•เตเด•เดณเดพเดฃเต†เด™เตเด•เดฟเตฝ deny เดจเดฟเดฐเดตเดงเดฟ, เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเต เด…เดต เดชเดฐเดธเตเดชเดฐเด‚ เดธเตเดตเดคเดจเตเดคเตเดฐเดฎเดพเดฏเดฟ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดฌเตเดฒเต‹เด•เตเด•เตเด•เดณเตเดŸเต† เดธเดคเตเดฏเดคเตเดคเต† เดฒเด‚เด˜เดจเดฎเดพเดฏเดฟ เด•เดฃเด•เตเด•เดพเด•เตเด•เตเดจเตเดจเต.

เดกเดฟเดซเต‹เตพเดŸเตเดŸเต เด”เดŸเตเดŸเตโ€ŒเดชเตเดŸเตเดŸเดฟเดจเต เดชเตเดฑเดฎเต‡, เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเต JSON, TAP, เดŸเต‡เดฌเดฟเตพ เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เดŽเดจเตเดจเดฟเดตเดฏเต† เดชเดฟเดจเตเดคเตเดฃเดฏเตโ€Œเด•เตเด•เตเดจเตเดจเต - เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เด’เดฐเต CI เดชเตˆเดชเตเดชเตโ€Œเดฒเตˆเดจเดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดฑเดฟเดชเตเดชเต‹เตผเดŸเตเดŸเตเด•เตพ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฃเดฎเต†เด™เตเด•เดฟเตฝ เดตเดณเดฐเต† เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเดฏ เดธเดตเดฟเดถเต‡เดทเดค. เดซเตเดฒเดพเด—เต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดซเต‹เตผเดฎเดพเดฑเตเดฑเต เดธเดœเตเดœเดฎเดพเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ --output.

เดจเดฏเด™เตเด™เตพ เดกเต€เดฌเด—เต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต เดŽเดณเตเดชเตเดชเดฎเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต, เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเดฟเดจเต เด’เดฐเต เดซเตเดฒเดพเด—เต เด‰เดฃเตเดŸเต --trace. เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸ เดจเดฏ เดซเดฏเดฒเตเด•เตพ เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเต เดชเดพเดดเตโ€Œเดธเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต†เด™เตเด™เดจเต† เดŽเดจเตเดจเดคเดฟเดจเตเดฑเต† เด’เดฐเต เดŸเตเดฐเต†เดฏเตเดธเต เด‡เดคเต เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต.

เด’เดธเดฟเด (เด“เดชเตเดชเตบ เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเตผ เด‡เดจเดฟเดทเตเดฏเต‡เดฑเตเดฑเต€เดตเต) เดฐเดœเดฟเดธเตโ€ŒเดŸเตเดฐเดฟเด•เดณเดฟเตฝ เด†เตผเดŸเตเดŸเดฟเดซเดพเด•เตโ€Œเดฑเตเดฑเตเด•เดณเดพเดฏเดฟ เดฎเดคเตเดธเดฐ เดจเดฏเด™เตเด™เตพ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เดพเดจเตเด‚ เดชเด™เตเด•เดฟเดŸเดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚.

ะšะพะผะฐะฝะดั‹ 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 เดชเดพเด•เตเด•เต‡เดœเตเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เดชเต‹เดณเดฟเดธเดฟ เดชเด™เตเด•เดฟเดŸเดฒเดฟเดจเต†เดฏเตเด‚ เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเดฟเดจเตเดฑเต† เดฎเดฑเตเดฑเต เดธเดตเดฟเดถเต‡เดทเดคเด•เดณเต†เดฏเตเด‚ เด•เตเดฑเดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เต‚เดŸเตเดคเดฒเดฑเดฟเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚ เด”เดฆเตเดฏเต‹เด—เดฟเด• เดชเดฆเตเดงเดคเดฟ เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเต.

เด•เตเดธเดจเตเดฎเตเด•เตเดธ. Polaris

เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดšเตผเดšเตเดš เดšเต†เดฏเตเดฏเตเดจเตเดจ เด…เดตเดธเดพเดจ เด‰เดชเด•เดฐเดฃเด‚ เดชเต‹เดณเดพเดฐเดฟเดธเต. (เด…เดตเดจเตเดฑเต† เด•เดดเดฟเดžเตเดž เดตเตผเดทเดคเตเดคเต† เดชเตเดฐเด–เตเดฏเดพเดชเดจเด‚ เดžเด™เตเด™เตพ เด‡เดคเดฟเดจเด•เด‚ เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเตเดฃเตเดŸเต - เดเด•เดฆเต‡เดถเด‚. เดตเดฟเดตเตผเดคเตเดคเดจเด‚)

เดชเต‹เดณเดพเดฐเดฟเดธเต เด’เดฐเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเตฝ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเด‚ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด•เดฎเดพเตปเดกเต เดฒเตˆเตป เดฎเต‹เดกเดฟเตฝ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚. เดจเดฟเด™เตเด™เตพ เดŠเดนเดฟเดšเตเดšเดคเตเดชเต‹เดฒเต†, เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เดณเต† เดธเตเดฅเดฟเดฐเดฎเดพเดฏเดฟ เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเดพเตป เด‡เดคเต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เด•เดฎเดพเตปเดกเต เดฒเตˆเตป เดฎเต‹เดกเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ, เดธเตเดฐเด•เตเดทเดฏเตเด‚ เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เดณเตเด‚ (เด•เตเดฏเต‚เดฌเต-เดธเตเด•เต‹เดฑเดฟเดจเต เดธเดฎเดพเดจเดฎเดพเดฏเดคเต) เดชเต‹เดฒเตเดณเตเดณ เดฎเต‡เด–เดฒเด•เตพ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจ เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดฒเดญเตเดฏเดฎเดพเดฃเต. เด•เต‚เดŸเดพเดคเต†, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเด‚ (เด•เต‹เตบเดซเดฟเด—เต-เดฒเดฟเดจเตเดฑเต, เด•เต‹เดชเตเดชเตผ, เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเต เดŽเดจเตเดจเดฟเดต เดชเต‹เดฒเต†).

เดฎเดฑเตเดฑเตŠเดฐเต เดตเดฟเดงเดคเตเดคเดฟเตฝ เดชเดฑเดžเตเดžเดพเตฝ, เดชเต‹เดณเดพเดฐเดฟเดธเต เดฐเดฃเตเดŸเต เดตเดฟเดญเดพเด—เดคเตเดคเดฟเดฒเตเดณเตเดณ เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเดŸเต†เดฏเตเด‚ เดชเตเดฐเดฏเต‹เดœเดจเด™เตเด™เตพ เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต: เด…เดจเตเดคเตผเดจเดฟเตผเดฎเตเดฎเดฟเดคเดตเตเด‚ เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดคเดตเตเดฎเดพเดฏ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพเด•เตเด•เตŠเดชเตเดชเด‚.

เด•เดฎเดพเตปเดกเต เดฒเตˆเตป เดฎเต‹เดกเดฟเตฝ Polaris เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป, เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด• เดชเตเดฐเตŠเดœเด•เตเดฑเตเดฑเต เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเดฟเดฒเต† เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ.

เดฏเดฅเดพเตผเดคเตเดฅ เดฒเต‡เด–เดจเด‚ เดŽเดดเตเดคเตเดจเตเดจ เดธเดฎเดฏเดคเตเดคเต, เดชเดคเดฟเดชเตเดชเต 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": [
    /* ะดะปะธะฝะฝั‹ะน ัะฟะธัะพะบ */
  ]
}

เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เด”เดŸเตเดŸเตเดชเตเดŸเตเดŸเต เดฒเดญเตเดฏเดฎเดพเดฃเต เด‡เดตเดฟเดŸเต†.

เด•เตเดฏเต‚เดฌเต-เดธเตโ€Œเด•เต‹เตผ เดชเต‹เดฒเต†, เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เตพ เดชเดพเดฒเดฟเด•เตเด•เดพเดคเตเดค เดฎเต‡เด–เดฒเด•เดณเดฟเดฒเต† เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เตพ เดชเต‹เดณเดพเดฐเดฟเดธเต เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเตเดจเตเดจเต:

  • เด•เดพเดฏเตเด•เตพเด•เตเด•เต เด†เดฐเต‹เด—เตเดฏ เดชเดฐเดฟเดถเต‹เดงเดจเด•เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ.
  • เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เดšเดฟเดคเตเดฐเด™เตเด™เดณเตเดŸเต† เดŸเดพเด—เตเด•เตพ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.
  • เด•เดฃเตเดŸเต†เดฏเตเดจเตผ เดฑเต‚เดŸเตเดŸเต เด†เดฏเดฟ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเต.
  • เดฎเต†เดฎเตเดฎเดฑเดฟเด•เตเด•เตเด‚ เดธเดฟเดชเดฟเดฏเตเดตเดฟเดจเตเดฎเตเดณเตเดณ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเตเด‚ เดชเดฐเดฟเดงเดฟเด•เดณเตเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดฟเดฏเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.

เด“เดฐเต‹ เดชเดฐเดฟเดถเต‹เดงเดจเดฏเตเด‚, เด…เดคเดฟเดจเตเดฑเต† เดซเดฒเด™เตเด™เดณเต† เด†เดถเตเดฐเดฏเดฟเดšเตเดšเต, เดจเดฟเตผเดฃเดพเดฏเด•เดคเดฏเตเดŸเต† เด’เดฐเต เดชเดฐเดฟเดงเดฟ เดจเดฟเดถเตเดšเดฏเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต: เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต เด…เดฅเดตเดพ เด…เดชเด•เดŸเด‚. เดฒเดญเตเดฏเดฎเดพเดฏ เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเดฒเดฑเดฟเดฏเดพเตป, เดฆเดฏเดตเดพเดฏเดฟ เดฑเดซเตผ เดšเต†เดฏเตเดฏเตเด• เดชเตเดฐเดฎเดพเดฃเต€เด•เดฐเดฃเด‚.

เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพ เด†เดตเดถเตเดฏเดฎเดฟเดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดซเตเดฒเดพเด—เต เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเด‚ --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

เดชเต‹เดณเดพเดฐเดฟเดธเต เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดคเดฎเดพเดฏเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฌเดฟเตฝเดฑเตเดฑเต-เด‡เตป เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเต‚เตผเดคเตเดคเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเตเดตเดดเดฟ เดฐเดฃเตเดŸเต เดฒเต‹เด•เด™เตเด™เดณเดฟเดฒเตเด‚ เดฎเดฟเด•เดšเตเดšเดคเต เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต.

เดฎเดฑเตเดตเดถเดคเตเดคเต, เดฑเต€เด—เต‹ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดœเดพเดตเดพเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดชเต‹เดฒเตเดณเตเดณ เด•เต‚เดŸเตเดคเตฝ เดถเด•เตเดคเดฎเดพเดฏ เดญเดพเดทเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเดฟเดฒเตเดฒเดพเดฏเตเดฎ เด•เต‚เดŸเตเดคเตฝ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต เดคเดŸเดฏเตเดจเตเดจ เด’เดฐเต เดชเดฐเดฟเดฎเดฟเดค เด˜เดŸเด•เดฎเดพเดฃเต.

เดชเต‹เดณเดพเดฐเดฟเดธเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดตเดฐเด™เตเด™เตพ เด‡เดตเดฟเดŸเต† เดฒเดญเตเดฏเดฎเดพเดฃเต เดชเดฆเตเดงเดคเดฟ เดตเต†เดฌเตเดธเตˆเดฑเตเดฑเต.

เดธเด‚เด—เตเดฐเดนเด‚

Kubernetes YAML เดซเดฏเดฒเตเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเดจเตเด‚ เดตเดฟเดฒเดฏเดฟเดฐเตเดคเตเดคเดพเดจเตเด‚ เดจเดฟเดฐเดตเดงเดฟ เดŸเต‚เดณเตเด•เตพ เดฒเดญเตเดฏเดฎเดพเดฃเต†เด™เตเด•เดฟเดฒเตเด‚, เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดŽเด™เตเด™เดจเต† เดฐเต‚เดชเด•เตฝเดชเดจ เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด‚ เดŽเดจเตเดจเดคเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดตเตเดฏเด•เตเดคเดฎเดพเดฏ เดงเดพเดฐเดฃ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเต เดชเตเดฐเดงเดพเดจเดฎเดพเดฃเต.

เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดชเตˆเดชเตเดชเต เดฒเตˆเดจเดฟเดฒเต‚เดŸเต† เด•เดŸเดจเตเดจเตเดชเต‹เด•เตเดจเตเดจ เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพ เดŽเดŸเตเด•เตเด•เตเด•เดฏเดพเดฃเต†เด™เตเด•เดฟเตฝ, เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เดชเตˆเดชเตเดชเตเดฒเตˆเดจเดฟเดจเตเดฑเต† เด†เดฆเตเดฏเดชเดŸเดฟเดฏเดพเด•เดพเด‚ เด•เตเดฌเต‡เดตเตฝ. เด’เดฌเตโ€Œเดœเด•เตเดฑเตเดฑเต เดจเดฟเตผเดตเดšเดจเด™เตเด™เตพ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต API เดธเตเด•เต€เดฎเดฏเตเดฎเดพเดฏเดฟ เดชเตŠเดฐเตเดคเตเดคเดชเตเดชเต†เดŸเตเดจเตเดจเตเดฃเตเดŸเต‹ เดŽเดจเตเดจเต เด‡เดคเต เดจเดฟเดฐเต€เด•เตเดทเดฟเด•เตเด•เตเด‚.

เด…เดคเตเดคเดฐเดฎเตŠเดฐเต เด…เดตเดฒเต‹เด•เดจเด‚ เดชเต‚เตผเดคเตเดคเดฟเดฏเดพเดฏเดฟเด•เตเด•เดดเดฟเดžเตเดžเดพเตฝ, เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดฌเต†เดธเตเดฑเตเดฑเต เดชเตเดฐเดพเด•เตเดŸเต€เดธเตเด•เดณเตเด‚ เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดจเดฏเด™เตเด™เดณเตเด‚ เดชเดพเดฒเดฟเด•เตเด•เตเดจเตเดจเดคเต เดชเต‹เดฒเต†เดฏเตเดณเตเดณ เด•เต‚เดŸเตเดคเตฝ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เดŸเต†เดธเตเดฑเตเดฑเตเด•เดณเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเดพเตพเด•เตเด•เต เดจเต€เด™เตเด™เดพเด‚. เด‡เดตเดฟเดŸเต†เดฏเดพเดฃเต เด•เตเดฏเต‚เดฌเต-เดธเตเด•เต‹เดฑเตเด‚ เดชเต‹เดณเดพเดฐเดฟเดธเตเด‚ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเดจเตเดจเดคเต.

เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏ เด†เดตเดถเตเดฏเด•เดคเด•เดณเตเดณเตเดณเดตเตผเด•เตเด•เตเด‚ เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เดตเดฟเดถเดฆเดฎเดพเดฏเดฟ เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดคเดฎเดพเด•เตเด•เต‡เดฃเตเดŸเดตเตผเด•เตเด•เตเด‚, เดšเต†เดฎเตเดชเต, เด•เต‹เตบเดซเดฟเด—เตผ-เดฒเดฟเดจเตเดฑเต, เด•เต‹เตบเดซเต†เดธเตเดฑเตเดฑเต เดŽเดจเตเดจเดฟเดต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดพเด•เตเด‚..

Conftest เด‰เด‚ config-lint เด‰เด‚ เด‡เดทเตเดŸเดพเดจเตเดธเตƒเดค เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต YAML เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต, เด•เต‚เดŸเดพเดคเต† เด•เต‹เดชเตเดชเตผ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดชเต‚เตผเดฃเตเดฃ เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดญเดพเดทเดฏเดฟเดฒเต‡เด•เตเด•เต เดชเตเดฐเดตเต‡เดถเดจเด‚ เดจเตฝเด•เตเดจเตเดจเต, เด‡เดคเต เดตเดณเดฐเต† เด†เด•เตผเดทเด•เดฎเดพเดฏ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดชเตเดชเดพเด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเตเดจเตเดจเต.

เดฎเดฑเตเดตเดถเดคเตเดคเต, เดˆ เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเดฟเตฝ เด’เดจเตเดจเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต เดฎเต‚เดฒเตเดฏเดตเดคเตเดคเดพเดฃเต‹, เด…เดคเดฟเดจเดพเตฝ, เดŽเดฒเตเดฒเดพ เดŸเต†เดธเตเดฑเตเดฑเตเด•เดณเตเด‚ เดธเตเดตเดฎเต‡เดงเดฏเดพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•, เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดชเต‹เดณเดพเดฐเดฟเดธเต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเดคเตเดคเต เด…เดคเดฟเตฝ เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดคเต เดฎเดพเดคเตเดฐเด‚ เดšเต‡เตผเด•เตเด•เตเด•? เดˆ เดšเต‹เดฆเตเดฏเดคเตเดคเดฟเดจเต เดตเตเดฏเด•เตเดคเดฎเดพเดฏ เด‰เดคเตเดคเดฐเด‚ เด‡เดฒเตเดฒ.

เดšเตเดตเดŸเต†เดฏเตเดณเตเดณ เดชเดŸเตเดŸเดฟเด• เด“เดฐเต‹ เด‰เดชเด•เดฐเดฃเดคเตเดคเดฟเดจเตเดฑเต†เดฏเตเด‚ เด’เดฐเต เดนเตเดฐเดธเตเดต เดตเดฟเดตเดฐเดฃเด‚ เดจเตฝเด•เตเดจเตเดจเต:

เด‰เดชเด•เดฐเดฃเด‚
เด‰เดฆเตเดฆเต‡เดถเตเดฏเด‚
เด…เดธเต—เด•เดฐเตเดฏเด™เตเด™เตพ
เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดชเดฐเดฟเดถเต‹เดงเดจเด•เตพ

เด•เตเดฌเต‡เดตเตฝ
API เดธเตเด•เต€เดฎเดฏเตเดŸเต† เด’เดฐเต เดจเดฟเตผเดฆเตเดฆเดฟเดทเตโ€ŒเดŸ เดชเดคเดฟเดชเตเดชเดฟเดจเต†เดคเดฟเดฐเต† YAML เดฎเดพเดจเดฟเดซเต†เดธเตโ€Œเดฑเตเดฑเตเด•เตพ เดธเดพเดงเต‚เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต
เดธเดฟเด†เตผเดกเดฟเดฏเดฟเตฝ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ
เด‡เดฒเตเดฒ

kube-เดธเตเด•เต‹เตผ
เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเด•เตพเด•เตเด•เต†เดคเดฟเดฐเต†เดฏเตเดณเตเดณ YAML เดชเตเดฐเด•เดŸเดจเด™เตเด™เดณเต† เดตเดฟเดถเด•เดฒเดจเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต
เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเตเดŸเต† Kubernetes API เดชเดคเดฟเดชเตเดชเต เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ
เด‡เดฒเตเดฒ

เดšเต†เดฎเตเดชเต
YAML เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเตเด•เตพเด•เตเด•เดพเดฏเดฟ เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค JavaScript เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดชเตŠเดคเต เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเต
เด…เดจเตเดคเตผเดจเดฟเตผเดฎเตเดฎเดฟเดค เดชเดฐเดฟเดถเต‹เดงเดจเด•เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เดฎเต‹เดถเด‚ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป
เด†

config-lint
YAML-เตฝ เด‰เตพเดšเตเดšเต‡เตผเดคเตเดค เด’เดฐเต เดกเตŠเดฎเต†เดฏเตเตป-เดจเดฟเตผเดฆเตเดฆเดฟเดทเตเดŸ เดญเดพเดทเดฏเดฟเตฝ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดชเตŠเดคเต เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเต. เดตเดฟเดตเดฟเดง เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเต‹เตผเดฎเดพเดฑเตเดฑเตเด•เตพ เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต (เด‰เดฆเดพ. เดŸเต†เดฑเดพเดซเต‹เด‚)
เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดŸเต†เดธเตเดฑเตเดฑเตเด•เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เด…เดจเตเดคเตผเดจเดฟเตผเดฎเตเดฎเดฟเดค เด…เดตเด•เดพเดถเดตเดพเดฆเด™เตเด™เดณเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเด‚ เดฎเดคเดฟเดฏเดพเด•เดฃเดฎเต†เดจเตเดจเดฟเดฒเตเดฒ
เด†

เดเดฑเตเดฑเตเดฎเตเดŸเตเดŸเตฝ
Rego (เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เด…เดจเตเดตเต‡เดทเดฃ เดญเดพเดท) เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดšเดŸเตเดŸเด•เตเด•เต‚เดŸเต. OCI เดฌเดฃเตเดŸเดฟเดฒเตเด•เตพ เดตเดดเดฟ เดชเต‹เดณเดฟเดธเดฟเด•เตพ เดชเด™เตเด•เดฟเดŸเดพเตป เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต
เด…เดจเตเดคเตผเดจเดฟเตผเดฎเตเดฎเดฟเดค เดชเดฐเดฟเดถเต‹เดงเดจเด•เดณเตŠเดจเตเดจเตเดฎเดฟเดฒเตเดฒ. เดŽเดจเดฟเด•เตเด•เต เดฑเต€เด—เต‹ เดชเด เดฟเด•เตเด•เดฃเด‚. เดจเดฏเด™เตเด™เตพ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เดกเต‹เด•เตเด•เตผ เดนเดฌเต เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ
เด†

เดชเต‹เดณเดพเดฐเดฟเดธเต
เด…เดตเดฒเต‹เด•เดจเด™เตเด™เตพ YAML เดธเตเดฑเตเดฑเดพเตปเดกเต‡เตผเดกเต เดฌเต†เดธเตเดฑเตเดฑเต เดชเตเดฐเดพเด•เตเดŸเต€เดธเตเด•เตพเด•เตเด•เต เดŽเดคเดฟเดฐเดพเดฏเดฟ เดชเตเดฐเด•เดŸเดฎเดพเดฃเต. JSON เดธเตเด•เต€เดฎ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต
JSON เดธเตเด•เต€เดฎเดฏเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟเดฏเตเดณเตเดณ เดŸเต†เดธเตเดฑเตเดฑเต เด•เดดเดฟเดตเตเด•เตพ เดฎเดคเดฟเดฏเดพเด•เดฃเดฎเต†เดจเตเดจเดฟเดฒเตเดฒ
เด†

เดˆ เด‰เดชเด•เดฐเดฃเด™เตเด™เตพ Kubernetes เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เด•เตโ€Œเดธเดธเดฟเดจเต† เด†เดถเตเดฐเดฏเดฟเด•เตเด•เดพเดคเตเดคเดคเดฟเดจเดพเตฝ, เด…เดต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป เดŽเดณเตเดชเตเดชเดฎเดพเดฃเต. เด‰เดฑเดตเดฟเดŸ เดซเดฏเดฒเตเด•เตพ เดซเดฟเตฝเดŸเตเดŸเตผ เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเตเด•เดณเดฟเดฒเต† เดชเตเตพ เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเตเดŸเต† เดฐเดšเดฏเดฟเดคเดพเด•เตเด•เตพเด•เตเด•เต เดฆเตเดฐเตเดค เดซเต€เดกเตโ€Œเดฌเดพเด•เตเด•เต เดจเตฝเด•เดพเดจเตเด‚ เด…เดต เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต.

เดตเดฟเดตเตผเดคเตเดคเด•เดจเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเดฟ.เดŽเดธเต

เดžเด™เตเด™เดณเตเดŸเต† เดฌเตเดฒเต‹เด—เดฟเดฒเตเด‚ เดตเดพเดฏเดฟเด•เตเด•เตเด•:

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•