Kubernetes YAML āĻŦā§ˆāĻ§āĻ¤āĻž āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ āĻāĻŦāĻ‚ āĻ¨ā§€āĻ¤āĻŋāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡

āĻŦāĻŋāĻƒāĻĻā§āĻ°āĻƒ. āĻ…āĻ¨ā§āĻŦāĻžāĻĻ: K8s āĻĒāĻ°āĻŋāĻŦā§‡āĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ YAML āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻ¸āĻ‚āĻ–ā§āĻ¯āĻž āĻŦā§ƒāĻĻā§āĻ§āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻžāĻĨā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸ā§āĻŦāĻ¯āĻŧāĻ‚āĻ•ā§āĻ°āĻŋāĻ¯āĻŧ āĻ¯āĻžāĻšāĻžāĻ‡āĻ•āĻ°āĻŖā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻž āĻ†āĻ°āĻ“ āĻŦā§‡āĻļāĻŋ āĻœāĻ°ā§āĻ°ā§€ āĻšāĻ¯āĻŧā§‡ āĻ‰āĻ ā§‡āĻ›ā§‡āĨ¤ āĻāĻ‡ āĻĒāĻ°ā§āĻ¯āĻžāĻ˛ā§‹āĻšāĻ¨āĻžāĻ° āĻ˛ā§‡āĻ–āĻ• āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻāĻ‡ āĻŸāĻžāĻ¸ā§āĻ•ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ‡ āĻŦā§‡āĻ›ā§‡ āĻ¨ā§‡āĻ¨āĻ¨āĻŋ, āĻ¤āĻŦā§‡ āĻ¤āĻžāĻ°āĻž āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡ āĻ¤āĻž āĻĄāĻŋāĻĒā§āĻ˛āĻ¯āĻŧāĻŽā§‡āĻ¨ā§āĻŸā§‡āĻ° āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻĻā§‡āĻ–ā§‡āĻ›ā§‡āĻ¨āĨ¤ āĻ¯āĻžāĻ°āĻž āĻāĻ‡ āĻŦāĻŋāĻˇāĻ¯āĻŧā§‡ āĻ†āĻ—ā§āĻ°āĻšā§€ āĻ¤āĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŸāĻŋ āĻ–ā§āĻŦ āĻ¤āĻĨā§āĻ¯āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ¯āĻŧā§‡ āĻ‰āĻ ā§‡āĻ›ā§‡āĨ¤

Kubernetes YAML āĻŦā§ˆāĻ§āĻ¤āĻž āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ āĻāĻŦāĻ‚ āĻ¨ā§€āĻ¤āĻŋāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡

TL; āĻĄāĻŋāĻ†āĻ°: āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ¸ā§‡āĻ°āĻž āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻžāĻ° āĻŦāĻŋāĻĒāĻ°ā§€āĻ¤ā§‡ Kubernetes YAML āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¯āĻžāĻšāĻžāĻ‡ āĻāĻŦāĻ‚ āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ›āĻ¯āĻŧāĻŸāĻŋ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻŸā§āĻ˛ā§‡āĻ° āĻ¤ā§āĻ˛āĻ¨āĻž āĻ•āĻ°ā§‡āĨ¤

Kubernetes āĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•āĻ˛ā§‹āĻĄāĻ—ā§āĻ˛āĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ YAML āĻ¨āĻĨāĻŋāĻ° āĻ†āĻ•āĻžāĻ°ā§‡ āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ YAML āĻāĻ° āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻšāĻ˛ āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸ āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸ā§€āĻŽāĻž āĻŦāĻž āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ• āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĨ¤

āĻ¯āĻĻāĻŋ āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻ¯ā§‡ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ›āĻŦāĻŋ āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§āĻŦāĻ¸ā§āĻ¤ āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸā§āĻ°āĻŋ āĻĨā§‡āĻ•ā§‡ āĻ†āĻ¸ā§‡?

PodDisruptionBudgets āĻ¸ā§‡āĻŸ āĻ¨ā§‡āĻ‡ āĻāĻŽāĻ¨ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻĒāĻžāĻ āĻžāĻ¨ā§‹ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻ°ā§‹āĻ§ āĻ•āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧ?

āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻŸā§‡āĻ¸ā§āĻŸāĻŋāĻ‚ āĻ‡āĻ¨ā§āĻŸāĻŋāĻ—ā§āĻ°ā§‡āĻļāĻ¨ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ‰āĻ¨ā§āĻ¨āĻ¯āĻŧāĻ¨ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧā§‡ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻāĻŦāĻ‚ āĻ¨ā§€āĻ¤āĻŋ āĻ˛āĻ™ā§āĻ˜āĻ¨ āĻ¸āĻ¨āĻžāĻ•ā§āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻāĻŸāĻŋ āĻ¸āĻŽā§āĻĒāĻĻā§‡āĻ° āĻ¸āĻ‚āĻœā§āĻžāĻž āĻ¸āĻ āĻŋāĻ• āĻāĻŦāĻ‚ āĻ¸ā§āĻ°āĻ•ā§āĻˇāĻŋāĻ¤ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻ¨āĻŋāĻļā§āĻšāĻ¯āĻŧāĻ¤āĻž āĻŦāĻžāĻĄāĻŧāĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ‰ā§ŽāĻĒāĻžāĻĻāĻ¨ āĻ•āĻžāĻœā§‡āĻ° āĻšāĻžāĻĒ āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°āĻŦā§‡ āĻāĻŽāĻ¨ āĻ¸āĻŽā§āĻ­āĻžāĻŦāĻ¨āĻž āĻŦāĻžāĻĄāĻŧāĻžāĻ¯āĻŧāĨ¤

Kubernetes YAML āĻ¸ā§āĻŸā§āĻ¯āĻžāĻŸāĻŋāĻ• āĻ­ā§āĻ¯āĻžāĻ˛āĻŋāĻĄā§‡āĻļāĻ¨ āĻ‡āĻ•ā§‹āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽāĻ•ā§‡ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻļā§āĻ°ā§‡āĻŖā§€āĻ¤ā§‡ āĻ­āĻžāĻ— āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡:

  • āĻāĻĒāĻŋāĻ†āĻ‡ āĻ­ā§āĻ¯āĻžāĻ˛āĻŋāĻĄā§‡āĻŸāĻ°. āĻāĻ‡ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡āĻ° āĻŸā§āĻ˛ āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻāĻĒāĻŋāĻ†āĻ‡ āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻžāĻ° āĻŦāĻŋāĻĒāĻ°ā§€āĻ¤ā§‡ YAML āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸāĻ•ā§‡ āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°ā§‡āĨ¤
  • āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻ•. āĻāĻ‡ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡āĻ° āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽāĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž, āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽā§āĻŽāĻ¤āĻŋ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¤ā§ˆāĻ°āĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻ†āĻ¸ā§‡āĨ¤
  • āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻ¯āĻžāĻšāĻžāĻ‡āĻ•āĻžāĻ°ā§€. āĻāĻ‡ āĻŦāĻŋāĻ­āĻžāĻ—ā§‡āĻ° āĻ¸āĻĻāĻ¸ā§āĻ¯āĻ°āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ, āĻ¯ā§‡āĻŽāĻ¨ āĻ°ā§‡āĻ—ā§‹ āĻāĻŦāĻ‚ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸāĨ¤

āĻāĻ‡ āĻĒā§āĻ°āĻŦāĻ¨ā§āĻ§ā§‡, āĻ†āĻŽāĻ°āĻž āĻ›āĻ¯āĻŧāĻŸāĻŋ āĻ­āĻŋāĻ¨ā§āĻ¨ āĻŸā§āĻ˛ā§‡āĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ“ āĻ¤ā§āĻ˛āĻ¨āĻž āĻ•āĻ°āĻŦ:

  1. kubeval;
  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 āĻāĻŦāĻ‚ āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ āĻĨā§‡āĻ•ā§‡ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§‡ āĻ—āĻŋāĻŸ āĻ­āĻžāĻ¨ā§āĻĄāĻžāĻ°.

āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸ āĻāĻ•āĻŸāĻŋ āĻ“āĻ¯āĻŧā§‡āĻŦ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°ā§‡ āĻ¯āĻžāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ•āĻžāĻœ āĻšāĻ˛ āĻĒā§‹āĻ°ā§āĻŸ 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)

āĻ¸āĻĢāĻ˛ āĻšāĻ˛ā§‡, āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ ā§Ļ āĻāĻ° āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻ•ā§‹āĻĄ āĻ¸āĻš āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻ•āĻ°āĻŦā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻŸāĻŋāĻ•ā§‡ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§‚āĻĒ āĻšā§‡āĻ• āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨:

$ 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

āĻ¸āĻŽā§āĻĒāĻĻ āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž.

āĻāĻĒāĻŋāĻ†āĻ‡ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž apps/v1, āĻĒāĻĄā§‡āĻ° āĻ˛ā§‡āĻŦā§‡āĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŽā§‡āĻ˛ā§‡ āĻāĻŽāĻ¨ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ• āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤ āĻ‰āĻĒāĻ°ā§‡āĻ° āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ• āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ­ā§āĻ•ā§āĻ¤ āĻ¨ā§‡āĻ‡, āĻ¤āĻžāĻ‡ āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°ā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¨-āĻœāĻŋāĻ°ā§‹ āĻ•ā§‹āĻĄ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻ•āĻ°ā§‡āĻ›ā§‡ā§ˇ

āĻ†āĻŽāĻŋ āĻ­āĻžāĻŦāĻ›āĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻĻā§ŒāĻĄāĻŧāĻžāĻ¨ āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ•āĻŋ āĻšāĻŦā§‡ kubectl apply -f āĻāĻ‡ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ¸āĻ™ā§āĻ—ā§‡?

āĻ†āĻšā§āĻ›āĻž, āĻ†āĻ¸ā§āĻ¨ āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻŋ:

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

āĻ āĻŋāĻ• āĻ¯ā§‡ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ•ā§āĻŦā§‡āĻŦāĻ˛ āĻ¸āĻ¤āĻ°ā§āĻ• āĻ•āĻ°ā§‡āĻ›āĻŋāĻ˛ā§‡āĻ¨āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ• āĻ¯ā§‹āĻ— āĻ•āĻ°ā§‡ āĻāĻŸāĻŋ āĻ āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨:

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

(base-valid.yaml)

āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ā§‡āĻ° āĻŽāĻ¤ā§‹ āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽāĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻšāĻ˛ āĻ¯ā§‡ āĻāĻ‡ āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ—ā§āĻ˛āĻŋ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻšāĻ•ā§āĻ°ā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻĻāĻŋāĻ•ā§‡ āĻ§āĻ°āĻž āĻ¯āĻžāĻ¯āĻŧāĨ¤

āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻāĻ‡ āĻšā§‡āĻ•āĻ—ā§āĻ˛āĻŋāĻ° āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ā§‡āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨ā§‡āĻ‡: āĻ¸ā§‡āĻ—ā§āĻ˛āĻŋ āĻ…āĻĢāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻ¸āĻžā§āĻšāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻĄāĻŋāĻĢāĻ˛ā§āĻŸāĻ°ā§‚āĻĒā§‡, āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ āĻ¸āĻ°ā§āĻŦāĻļā§‡āĻˇ Kubernetes API āĻ¸ā§āĻ•āĻŋāĻŽāĻžāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻ¸āĻŽā§āĻĒāĻĻ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡āĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻŦā§‡āĻļāĻŋāĻ°āĻ­āĻžāĻ— āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ Kubernetes āĻ°āĻŋāĻ˛āĻŋāĻœā§‡āĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻĒāĻ¤āĻžāĻ•āĻž āĻĻāĻŋāĻ¯āĻŧā§‡ āĻāĻŸāĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ --kubernetes-version:

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

āĻ¨ā§‹āĻŸ āĻ•āĻ°ā§āĻ¨ āĻ¯ā§‡ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻŸāĻŋ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ā§‡ āĻšāĻ¤ā§‡ āĻšāĻŦā§‡ Major.Minor.Patch.

āĻ¯āĻžāĻšāĻžāĻ‡āĻ•āĻ°āĻŖ āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻĒāĻĄāĻŧā§āĻ¨ā§ˇ GitHub-āĻ JSON āĻ¸ā§āĻ•āĻŋāĻŽāĻž, āĻ¯āĻž kubeval āĻŦā§ˆāĻ§āĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ āĻ…āĻĢāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻšāĻžāĻ˛āĻžāĻ¤ā§‡ āĻšāĻžāĻ¨, āĻ¸ā§āĻ•āĻŋāĻŽāĻžāĻ—ā§āĻ˛āĻŋ āĻĄāĻžāĻ‰āĻ¨āĻ˛ā§‹āĻĄ āĻ•āĻ°ā§āĻ¨ āĻāĻŦāĻ‚ āĻĒāĻ¤āĻžāĻ•āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧ āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¨ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°ā§āĻ¨ --schema-location.

āĻĒā§ƒāĻĨāĻ• YAML āĻĢāĻžāĻ‡āĻ˛ āĻ›āĻžāĻĄāĻŧāĻžāĻ“, kubeval āĻĄāĻŋāĻ°ā§‡āĻ•ā§āĻŸāĻ°āĻŋ āĻāĻŦāĻ‚ stdin āĻāĻ° āĻ¸āĻžāĻĨā§‡āĻ“ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ āĻ¸āĻšāĻœā§‡āĻ‡ āĻ¸āĻŋāĻ†āĻ‡ āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤ āĻ¯āĻžāĻ°āĻž āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸ āĻĒā§āĻļ āĻ•āĻ°āĻžāĻ° āĻ†āĻ—ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻžāĻ˛āĻžāĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻžāĻ°āĻž āĻœā§‡āĻ¨ā§‡ āĻ–ā§āĻļāĻŋ āĻšāĻŦā§‡āĻ¨ āĻ¯ā§‡ āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻŸ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°ā§‡:

  1. āĻ¸āĻ°āĻ˛ āĻĒāĻžāĻ ā§āĻ¯;
  2. JSON;
  3. āĻ¯ā§‡āĻ•ā§‹āĻ¨ā§‹ āĻ•āĻŋāĻ›ā§ āĻĒā§āĻ°ā§‹āĻŸā§‹āĻ•āĻ˛ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§āĻ¨ (TAP)āĨ¤

āĻāĻŦāĻ‚ āĻĒāĻ›āĻ¨ā§āĻĻāĻ¸āĻ‡ āĻ§āĻ°āĻŖā§‡āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ā§‡āĻ° āĻ¸āĻžāĻ°āĻžāĻ‚āĻļ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻ†āĻ‰āĻŸāĻĒā§āĻŸāĻ•ā§‡ āĻ†āĻ°āĻ“ āĻĒāĻžāĻ°ā§āĻ¸ āĻ•āĻ°āĻ¤ā§‡ āĻ¯ā§‡ āĻ•ā§‹āĻ¨āĻ“ āĻĢāĻ°ā§āĻŽā§āĻ¯āĻžāĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ–āĻžāĻ°āĻžāĻĒ āĻĻāĻŋāĻ• āĻšāĻ˛ āĻ¯ā§‡ āĻāĻŸāĻŋ āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻ°āĻŋāĻ¸ā§‹āĻ°ā§āĻ¸ āĻĄā§‡āĻĢāĻŋāĻ¨āĻŋāĻļāĻ¨ (āĻ¸āĻŋāĻ†āĻ°āĻĄāĻŋ) āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤ āĻ¤āĻŦā§‡, āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻ‰āĻĒā§‡āĻ•ā§āĻˇāĻž.

Kubeval āĻāĻ•āĻŸāĻŋ āĻŽāĻšāĻžāĻ¨ āĻ¸āĻŽā§āĻĒāĻĻ āĻ¯āĻžāĻšāĻžāĻ‡āĻ•āĻ°āĻŖ āĻāĻŦāĻ‚ āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻŸā§āĻ˛; āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻāĻŸāĻž āĻœā§‹āĻ° āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¯ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯āĻŧ āĻ‰āĻ¤ā§āĻ¤ā§€āĻ°ā§āĻŖ āĻšāĻ“āĻ¯āĻŧāĻž āĻ—ā§āĻ¯āĻžāĻ°āĻžāĻ¨ā§āĻŸāĻŋ āĻĻā§‡āĻ¯āĻŧ āĻ¨āĻž āĻ¯ā§‡ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨āĻŸāĻŋ āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨āĻ—ā§āĻ˛āĻŋ āĻŽā§‡āĻ¨ā§‡ āĻšāĻ˛ā§‡āĨ¤

āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻŸā§āĻ¯āĻžāĻ— āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ latest āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ¤ā§āĻ°ā§‡ āĻ¸ā§‡āĻ°āĻž āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ āĻĒā§‚āĻ°āĻŖ āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ āĻāĻŸāĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦāĻžāĻ— āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°ā§‡ āĻ¨āĻž āĻāĻŦāĻ‚ āĻāĻŸāĻŋ āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤ āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° YAML āĻāĻ° āĻŦā§ˆāĻ§āĻ¤āĻž āĻ¸āĻ¤āĻ°ā§āĻ•āĻ¤āĻž āĻ›āĻžāĻĄāĻŧāĻžāĻ‡ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻŦā§‡āĨ¤

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ YAML āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻŸā§āĻ¯āĻžāĻ—ā§‡āĻ° āĻŽāĻ¤ā§‹ āĻ˛āĻ™ā§āĻ˜āĻ¨ āĻ¸āĻ¨āĻžāĻ•ā§āĻ¤ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ latest? āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ¸ā§‡āĻ°āĻž āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡āĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻāĻ•āĻŸāĻŋ YAML āĻĢāĻžāĻ‡āĻ˛ āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°āĻŦā§‡āĻ¨?

2. āĻ•ā§āĻŦā§‡āĻ° āĻ¸ā§āĻ•ā§‹āĻ°

āĻ•ā§āĻŦā§‡āĻ° āĻ¸ā§āĻ•ā§‹āĻ° YAML āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸāĻ•ā§‡ āĻĒāĻžāĻ°ā§āĻ¸ āĻ•āĻ°ā§‡ āĻāĻŦāĻ‚ āĻŦāĻŋāĻ˛ā§āĻŸ-āĻ‡āĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°ā§‡āĨ¤ āĻāĻ‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°āĻžāĻĒāĻ¤ā§āĻ¤āĻž āĻ¸ā§āĻĒāĻžāĻ°āĻŋāĻļ āĻāĻŦāĻ‚ āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡āĻ° āĻ‰āĻĒāĻ° āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋ āĻ•āĻ°ā§‡ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¯ā§‡āĻŽāĻ¨:

  • āĻ°ā§āĻŸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ¨āĻž āĻāĻ•āĻŸāĻŋ āĻ§āĻžāĻ°āĻ• āĻšāĻ˛āĻŽāĻžāĻ¨.
  • āĻĒāĻĄ āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āĻ¯ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĒā§āĻ°āĻžāĻĒā§āĻ¯āĻ¤āĻž.
  • āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨āĻ—ā§āĻ˛āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻāĻŦāĻ‚ āĻ¸ā§€āĻŽāĻž āĻ¨āĻŋāĻ°ā§āĻ§āĻžāĻ°āĻŖ āĻ•āĻ°āĻžāĨ¤

āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ¤āĻŋāĻ¨āĻŸāĻŋ āĻĢāĻ˛āĻžāĻĢāĻ˛: OK, āĻ¸āĻ¤āĻ°ā§āĻ•āĻ¤āĻžāĻŽā§‚āĻ˛āĻ• и āĻ—ā§āĻ°ā§āĻ¤āĻ°.

āĻ•ā§āĻŦā§‡-āĻ¸ā§āĻ•ā§‹āĻ° āĻ…āĻ¨āĻ˛āĻžāĻ‡āĻ¨ā§‡ āĻšā§‡āĻˇā§āĻŸāĻž āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻŦāĻž āĻ¸ā§āĻĨāĻžāĻ¨ā§€āĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻŽā§‚āĻ˛ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ˛ā§‡āĻ–āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ•ā§āĻŦā§‡-āĻ¸ā§āĻ•ā§‹āĻ°ā§‡āĻ° āĻ¸āĻ°ā§āĻŦāĻļā§‡āĻˇ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻšāĻ˛ 1.7.0āĨ¤

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸā§‡ āĻāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻ¯āĻžāĻ• base-valid.yaml:

$ kube-score score base-valid.yaml

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

YAML kubeval āĻšā§‡āĻ• āĻĒāĻžāĻ¸ āĻ•āĻ°ā§‡, āĻ¯āĻ–āĻ¨ kube-āĻ¸ā§āĻ•ā§‹āĻ° āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ—ā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļ āĻ•āĻ°ā§‡:

  • āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤āĻŋ āĻšā§‡āĻ• āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ¨āĻž.
  • CPU āĻāĻŦāĻ‚ āĻŽā§‡āĻŽāĻ°āĻŋ āĻ¸āĻŽā§āĻĒāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻāĻŦāĻ‚ āĻ¸ā§€āĻŽāĻž āĻ¨ā§‡āĻ‡āĨ¤
  • āĻĒāĻĄ āĻŦā§āĻ¯āĻžāĻšāĻ¤ āĻŦāĻžāĻœā§‡āĻŸ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧāĻ¨āĻŋ.
  • āĻĒā§ƒāĻĨāĻ• āĻ…āĻ¸ā§āĻ¤āĻŋāĻ¤ā§āĻŦā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¨ā§‡āĻ‡ (āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•-āĻŦāĻŋāĻ°ā§‹āĻ§ā§€) āĻĒā§āĻ°āĻžāĻĒā§āĻ¯āĻ¤āĻž āĻ¸āĻ°ā§āĻŦāĻžāĻ§āĻŋāĻ• āĻ•āĻ°āĻ¤ā§‡āĨ¤
  • āĻ§āĻžāĻ°āĻ•āĻŸāĻŋ āĻ°ā§āĻŸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ¸āĻžā§āĻšāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤

āĻāĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ—ā§āĻ˛āĻŋ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ¯ā§āĻ•ā§āĻ¤āĻŋāĻ¸āĻ™ā§āĻ—āĻ¤ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻ¯āĻž āĻŽā§‹āĻ¤āĻžāĻ¯āĻŧā§‡āĻ¨āĻ•ā§‡ āĻ†āĻ°āĻ“ āĻĻāĻ•ā§āĻˇ āĻāĻŦāĻ‚ āĻ¨āĻŋāĻ°ā§āĻ­āĻ°āĻ¯ā§‹āĻ—ā§āĻ¯ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤

āĻŸā§€āĻŽ kube-score āĻĒā§āĻ°āĻ•āĻžāĻ°ā§‡āĻ° āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ˛āĻ™ā§āĻ˜āĻ¨ āĻ¸āĻš āĻŽāĻžāĻ¨āĻŦ-āĻĒāĻžāĻ āĻ¯ā§‹āĻ—ā§āĻ¯ āĻ†āĻ•āĻžāĻ°ā§‡ āĻ¤āĻĨā§āĻ¯ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻ•āĻ°ā§‡ āĻ¸āĻ¤āĻ°ā§āĻ•āĻ¤āĻžāĻŽā§‚āĻ˛āĻ• и āĻ—ā§āĻ°ā§āĻ¤āĻ°āĻ¯āĻž āĻ‰āĻ¨ā§āĻ¨āĻ¯āĻŧāĻ¨ā§‡āĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ…āĻ¨ā§‡āĻ• āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°ā§‡āĨ¤

āĻ¯āĻžāĻ°āĻž āĻ¸āĻŋāĻ†āĻ‡ āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ā§‡āĻ° āĻ…āĻ‚āĻļ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻāĻ‡ āĻŸā§āĻ˛āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻ¤āĻžāĻ°āĻž āĻĒāĻ¤āĻžāĻ•āĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ†āĻ°āĻ“ āĻ¸āĻ‚āĻ•ā§āĻšāĻŋāĻ¤ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ --output-format ci (āĻāĻ‡ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°ā§‡, āĻĢāĻ˛āĻžāĻĢāĻ˛ āĻ¸āĻš āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋāĻ“ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻšāĻ¯āĻŧ OK):

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

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

āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ā§‡āĻ° āĻŽāĻ¤ā§‹, āĻ•ā§āĻŦā§‡-āĻ¸ā§āĻ•ā§‹āĻ° āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¨-āĻœāĻŋāĻ°ā§‹ āĻāĻ•ā§āĻ¸āĻŋāĻŸ āĻ•ā§‹āĻĄ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡ āĻ¯āĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ¯āĻŧāĨ¤ āĻ—ā§āĻ°ā§āĻ¤āĻ°. āĻ†āĻĒāĻ¨āĻŋ āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ āĻĒā§āĻ°āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻ•āĻ°āĻŖ āĻ¸āĻ•ā§āĻˇāĻŽ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¸āĻ¤āĻ°ā§āĻ•āĻ¤āĻžāĻŽā§‚āĻ˛āĻ•.

āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ API āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖā§‡āĻ° (āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ) āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻ¸āĻŽā§āĻ­āĻŦāĨ¤ āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻāĻ‡ āĻ¤āĻĨā§āĻ¯āĻŸāĻŋ kube-āĻ¸ā§āĻ•ā§‹āĻ°ā§‡āĻ‡ 'āĻšāĻžāĻ°ā§āĻĄāĻ•ā§‹āĻĄā§‡āĻĄ': āĻ†āĻĒāĻ¨āĻŋ Kubernetes-āĻāĻ° āĻāĻ•āĻŸāĻŋ āĻ­āĻŋāĻ¨ā§āĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻ†āĻĒāĻ—ā§āĻ°ā§‡āĻĄ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻžāĻ¨ āĻŦāĻž āĻ†āĻĒāĻ¨āĻžāĻ° K8 āĻāĻ° āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ¸āĻš āĻāĻ•āĻžāĻ§āĻŋāĻ• āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ° āĻĨāĻžāĻ•ā§‡ āĻ¤āĻŦā§‡ āĻāĻ‡ āĻ¸ā§€āĻŽāĻžāĻŦāĻĻā§āĻ§āĻ¤āĻž āĻāĻ•āĻŸāĻŋ āĻŦāĻĄāĻŧ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻšāĻ¯āĻŧā§‡ āĻ‰āĻ āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

āĻŽāĻ¨ā§‡ āĻ°āĻžāĻ–āĻŦā§‡āĻ¨ āĻ¯ā§‡ āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ†āĻ›ā§‡ āĻāĻ‡ āĻ¸ā§āĻ¯ā§‹āĻ— āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒā§āĻ°āĻ¸ā§āĻ¤āĻžāĻŦ āĻ¸āĻ™ā§āĻ—ā§‡.

āĻ•ā§āĻŦā§‡-āĻ¸ā§āĻ•ā§‹āĻ° āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ†āĻ°āĻ“ āĻ¤āĻĨā§āĻ¯ āĻāĻ–āĻžāĻ¨ā§‡ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§‡ āĻ…āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻ“āĻ¯āĻŧā§‡āĻŦāĻ¸āĻžāĻ‡āĻŸ.

āĻ•ā§āĻŦā§‡-āĻ¸ā§āĻ•ā§‹āĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨āĻ—ā§āĻ˛āĻŋ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĻā§āĻ°ā§āĻĻāĻžāĻ¨ā§āĻ¤ āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽ, āĻ¤āĻŦā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¯āĻĻāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ¯āĻŧ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻŦāĻž āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻ¨āĻŋāĻ¯āĻŧāĻŽāĻ—ā§āĻ˛āĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻ¤āĻŦā§‡ āĻ•ā§€ āĻšāĻŦā§‡? āĻšāĻžāĻ¯āĻŧāĻ°ā§‡, āĻāĻŸāĻž āĻ•āĻ°āĻž āĻ¯āĻžāĻŦā§‡ āĻ¨āĻžāĨ¤

āĻ•ā§āĻŦā§‡-āĻ¸ā§āĻ•ā§‹āĻ° āĻāĻ•ā§āĻ¸āĻŸā§‡āĻ¨āĻ¸āĻŋāĻŦāĻ˛ āĻ¨āĻ¯āĻŧ: āĻ†āĻĒāĻ¨āĻŋ āĻāĻ¤ā§‡ āĻ¨ā§€āĻ¤āĻŋ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž āĻŦāĻž āĻ¤āĻžāĻĻā§‡āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨ āĻ¨āĻžāĨ¤

āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻ•ā§‹āĻŽā§āĻĒāĻžāĻ¨āĻŋāĻ° āĻ¨ā§€āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋāĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻšāĻžāĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻšāĻžāĻ°āĻŸāĻŋ āĻŸā§āĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨: āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°-āĻ˛āĻŋāĻ¨ā§āĻŸ, āĻ•āĻĒāĻžāĻ°, āĻ•āĻ¨āĻĢā§‡āĻ¸ā§āĻŸ āĻŦāĻž āĻĒā§‹āĻ˛āĻžāĻ°āĻŋāĻ¸āĨ¤

3.Config-lint

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 Deployment'e-āĻ¤ā§‡ āĻĨāĻžāĻ•āĻž āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ•āĻ¨ā§āĻŸā§‡āĻ‡āĻ¨āĻžāĻ° āĻšā§‡āĻ• āĻ•āĻ°ā§‡ (key: spec.templates.spec.containers) āĻŦāĻŋāĻļā§āĻŦāĻ¸ā§āĻ¤ āĻ›āĻŦāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨ (āĻ¯ā§‡āĻŽāĻ¨ āĻ¯ā§‡āĻ—ā§āĻ˛āĻŋ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻļā§āĻ°ā§ āĻšāĻ¯āĻŧ my-company.com/).

āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¸ā§‡āĻŸ āĻāĻ‡ āĻŽāĻ¤ āĻĻā§‡āĻ–āĻžāĻ¯āĻŧ:

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

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

(ruleset.yaml)

āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻ¸ā§āĻ¨ āĻāĻŸāĻŋāĻ•ā§‡ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ¸āĻ‚āĻ°āĻ•ā§āĻˇāĻŖ āĻ•āĻ°āĻŋ check_image_repo.yaml. āĻĢāĻžāĻ‡āĻ˛ āĻšā§‡āĻ• āĻ•āĻ°āĻž āĻ¯āĻžāĻ• base-valid.yaml:

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

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

āĻšā§‡āĻ• āĻŦā§āĻ¯āĻ°ā§āĻĨ āĻšāĻ¯āĻŧā§‡āĻ›ā§‡. āĻāĻ–āĻ¨ āĻ¸āĻ āĻŋāĻ• āĻšāĻŋāĻ¤ā§āĻ° āĻ¸āĻ‚āĻ—ā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ•āĻ°āĻž āĻ¯āĻžāĻ•:

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

(image-valid-mycompany.yaml)

āĻ†āĻŽāĻ°āĻž āĻ‰āĻĒāĻ°ā§‡āĻ° āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻ‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻžāĻ˛āĻžāĻ‡āĨ¤ āĻ•ā§‹āĻ¨ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻ¯āĻŧāĻ¨āĻŋ:

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

Config-lint āĻšāĻ˛ āĻāĻ•āĻŸāĻŋ āĻ…āĻ—ā§āĻ°āĻ—āĻžāĻŽā§€ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ YAML DSL āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ Kubernetes YAML āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻĻāĻŋ āĻ†āĻ°ā§‹ āĻœāĻŸāĻŋāĻ˛ āĻ¯ā§āĻ•ā§āĻ¤āĻŋ āĻāĻŦāĻ‚ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻšāĻ¯āĻŧ? āĻāĻ° āĻœāĻ¨ā§āĻ¯ YAML āĻ•ā§āĻˇāĻŽāĻ¤āĻžāĻ—ā§āĻ˛āĻŋ āĻ•āĻŋ āĻ–ā§āĻŦ āĻ›ā§‹āĻŸ āĻ¨āĻ¯āĻŧ? āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻĒā§‚āĻ°ā§āĻŖāĻžāĻ™ā§āĻ— āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨?

4. āĻ¤āĻžāĻŽāĻž

āĻ¤āĻžāĻŽāĻž V2 āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž (āĻ•āĻ¨āĻĢāĻŋāĻ—-āĻ˛āĻŋāĻ¨ā§āĻŸā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ) āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸ āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻ āĻžāĻŽā§‹āĨ¤

āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻāĻŸāĻŋ āĻĒāĻ°ā§‡āĻ°āĻŸāĻŋāĻ° āĻĨā§‡āĻ•ā§‡ āĻ†āĻ˛āĻžāĻĻāĻž āĻ¯ā§‡ āĻāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻ¤ā§‡ YAML āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ¨āĻžāĨ¤ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§‡, āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‡ āĻ˛ā§‡āĻ–āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ•āĻĒāĻžāĻ° āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻŽā§ŒāĻ˛āĻŋāĻ• āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽ āĻ¸āĻš āĻāĻ•āĻŸāĻŋ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡Kubernetes āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ¤āĻĨā§āĻ¯ āĻĒāĻĄāĻŧāĻ¤ā§‡ āĻāĻŦāĻ‚ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻ¸āĻžāĻšāĻžāĻ¯ā§āĻ¯ āĻ•āĻ°āĻ¤ā§‡āĨ¤

āĻ•āĻĒāĻžāĻ° āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻžāĻ° āĻĒāĻĻāĻ•ā§āĻˇā§‡āĻĒā§‡āĻ° āĻ•ā§āĻ°āĻŽāĻŸāĻŋ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§‡ āĻ…āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨.

āĻŽā§‚āĻ˛ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ˛ā§‡āĻ–āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ 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 āĻ…āĻ­āĻŋāĻœā§āĻžāĻ¤āĻž āĻ†āĻ›ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤ āĻ•ā§ŒāĻļāĻ˛)āĨ¤

āĻ•āĻĒāĻžāĻ°ā§‡āĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ¸ā§āĻŦāĻŋāĻ§āĻž āĻ¸ā§āĻ¸ā§āĻĒāĻˇā§āĻŸ: āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•ā§‹āĻ¨ā§‹ āĻŦāĻŋāĻļā§‡āĻˇ āĻ­āĻžāĻˇāĻž āĻļā§‡āĻ–āĻžāĻ° āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨ā§‡āĻ‡ āĻāĻŦāĻ‚ āĻ†āĻĒāĻ¨āĻŋ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨, āĻ¯ā§‡āĻŽāĻ¨ āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĒā§‹āĻ˛ā§‡āĻļāĻ¨, āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ‡āĻ¤ā§āĻ¯āĻžāĻĻāĻŋāĨ¤

āĻāĻŸāĻŋāĻ“ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¯ā§‡ āĻ•āĻĒāĻžāĻ°ā§‡āĻ° āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻŸāĻŋ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ‡āĻžā§āĻœāĻŋāĻ¨ā§‡āĻ° ES5 āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°ā§‡, ES6 āĻ¨āĻ¯āĻŧāĨ¤

āĻŦāĻŋāĻ¸ā§āĻ¤āĻžāĻ°āĻŋāĻ¤ āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ…āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻ“āĻ¯āĻŧā§‡āĻŦāĻ¸āĻžāĻ‡āĻŸ.

āĻ¯āĻžāĻ‡āĻšā§‹āĻ•, āĻ†āĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸā§‡āĻ° āĻāĻ•āĻœāĻ¨ āĻŦāĻĄāĻŧ āĻ…āĻ¨ā§āĻ°āĻžāĻ—ā§€ āĻ¨āĻž āĻšāĻ¨ āĻāĻŦāĻ‚ āĻŦāĻŋāĻļā§‡āĻˇāĻ­āĻžāĻŦā§‡ āĻĒā§āĻ°āĻļā§āĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻŦāĻ‚ āĻ¨ā§€āĻ¤āĻŋ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻˇāĻž āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻ¨āĻĢā§‡āĻ¸ā§āĻŸā§‡āĻ° āĻĻāĻŋāĻ•ā§‡ āĻ¨āĻœāĻ° āĻĻā§‡āĻ“āĻ¯āĻŧāĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤

5. āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻž

āĻ•āĻ¨āĻĢā§‡āĻ¸ā§āĻŸ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻĄā§‡āĻŸāĻž āĻšā§‡āĻ• āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻ āĻžāĻŽā§‹āĨ¤ āĻāĻ›āĻžāĻĄāĻŧāĻžāĻ“ Kubernetes āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž/āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĒāĻ¯ā§āĻ•ā§āĻ¤āĨ¤ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§‡āĻˇ āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻ­āĻžāĻˇāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ āĻ°ā§‡āĻ—ā§‹.

āĻ†āĻĒāĻ¨āĻŋ āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻ¨āĻĢā§‡āĻ¸ā§āĻŸ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻžāĻŦāĻ˛ā§€āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ“āĻ¯āĻŧā§‡āĻŦāĻ¸āĻžāĻ‡āĻŸā§‡ āĻ¤āĻžāĻ˛āĻŋāĻ•āĻžāĻ­ā§āĻ•ā§āĻ¤āĨ¤

āĻŽā§‚āĻ˛ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ˛ā§‡āĻ–āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ¸āĻ°ā§āĻŦāĻļā§‡āĻˇ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖāĻŸāĻŋ 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

āĻĻā§āĻ°ā§āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻļāĻ¤, āĻĄāĻ•āĻžāĻ°āĻšāĻžāĻŦ āĻāĻ–āĻ¨āĻ“ āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤ āĻ¤āĻžāĻ‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ˛ā§‡ āĻ¨āĻŋāĻœā§‡āĻ•ā§‡ āĻ­āĻžāĻ—ā§āĻ¯āĻŦāĻžāĻ¨ āĻŽāĻ¨ā§‡ āĻ•āĻ°ā§āĻ¨ āĻ†āĻœā§āĻ° āĻ•āĻ¨ā§āĻŸā§‡āĻ‡āĻ¨āĻžāĻ° āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸā§āĻ°āĻŋ (ACR) āĻŦāĻž āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸā§āĻ°āĻŋāĨ¤

āĻ†āĻ°ā§āĻŸāĻŋāĻĢā§āĻ¯āĻžāĻ•ā§āĻŸ āĻŦāĻŋāĻ¨ā§āĻ¯āĻžāĻ¸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻāĻ•āĻ‡ āĻĒāĻ˛āĻŋāĻ¸āĻŋ āĻāĻœā§‡āĻ¨ā§āĻŸ āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœ āĻ–ā§āĻ˛ā§āĻ¨ (OPA), āĻ¯āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻŦāĻŋāĻĻā§āĻ¯āĻŽāĻžāĻ¨ OPA āĻĒā§āĻ¯āĻžāĻ•ā§‡āĻœāĻ—ā§āĻ˛āĻŋ āĻĨā§‡āĻ•ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻšāĻžāĻ˛āĻžāĻ¨ā§‹āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻ¨āĻĢā§‡āĻ¸ā§āĻŸ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻ†āĻĒāĻ¨āĻŋ āĻāĻ–āĻžāĻ¨ā§‡ āĻ¨ā§€āĻ¤āĻŋ āĻ­āĻžāĻ—āĻžāĻ­āĻžāĻ—āĻŋ āĻāĻŦāĻ‚ āĻ…āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻžāĻ° āĻŦā§ˆāĻļāĻŋāĻˇā§āĻŸā§āĻ¯ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ†āĻ°āĻ“ āĻœāĻžāĻ¨āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ…āĻĢāĻŋāĻ¸āĻŋāĻ¯āĻŧāĻžāĻ˛ āĻ“āĻ¯āĻŧā§‡āĻŦāĻ¸āĻžāĻ‡āĻŸ.

6āĨ¤ āĻ§ā§āĻ°ā§āĻŦāĻ¤āĻžāĻ°āĻž

āĻāĻ‡ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§ā§‡ āĻ†āĻ˛ā§‹āĻšāĻ¨āĻž āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻ¯ā§‡ āĻļā§‡āĻˇ āĻŸā§āĻ˛ āĻ§ā§āĻ°ā§āĻŦāĻ¤āĻžāĻ°āĻž. (āĻ¤āĻžāĻ° āĻ—āĻ¤ āĻŦāĻ›āĻ°ā§‡āĻ° āĻ˜ā§‹āĻˇāĻŖāĻž āĻ†āĻŽāĻ°āĻž āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ - āĻĒā§āĻ°āĻžāĻ¯āĻŧ. āĻ…āĻ¨ā§āĻŦāĻžāĻĻ)

āĻĒā§‹āĻ˛āĻžāĻ°āĻŋāĻ¸ āĻāĻ•āĻŸāĻŋ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻŦāĻž āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ āĻŽā§‹āĻĄā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻŋ āĻ¯ā§‡āĻŽāĻ¨ āĻ…āĻ¨ā§āĻŽāĻžāĻ¨ āĻ•āĻ°ā§‡āĻ›ā§‡āĻ¨, āĻāĻŸāĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¸ā§āĻĨāĻŋāĻ°āĻ­āĻžāĻŦā§‡ āĻĒāĻžāĻ°ā§āĻ¸ āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧāĨ¤

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ āĻŽā§‹āĻĄā§‡ āĻšāĻ˛āĻžāĻ•āĻžāĻ˛ā§€āĻ¨, āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ¨āĻŋāĻ°ā§āĻŽāĻŋāĻ¤ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻ¸ā§āĻ°āĻ•ā§āĻˇāĻž āĻāĻŦāĻ‚ āĻ¸āĻ°ā§āĻŦā§‹āĻ¤ā§āĻ¤āĻŽ āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡āĻ° āĻŽāĻ¤ā§‹ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ°āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ•āĻ­āĻžāĻ° āĻ•āĻ°ā§‡ (āĻ•ā§āĻŦā§‡-āĻ¸ā§āĻ•ā§‹āĻ°ā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‚āĻĒ) āĻ‰āĻĒāĻ˛āĻŦā§āĻ§āĨ¤ āĻ‰āĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻ†āĻĒāĻ¨āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ (āĻ¯ā§‡āĻŽāĻ¨ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°-āĻ˛āĻŋāĻ¨ā§āĻŸ, āĻ•āĻĒāĻžāĻ° āĻāĻŦāĻ‚ āĻ•āĻ¨āĻĢā§‡āĻ¸ā§āĻŸā§‡)āĨ¤

āĻ…āĻ¨ā§āĻ¯ āĻ•āĻĨāĻžāĻ¯āĻŧ, āĻĒā§‹āĻ˛āĻžāĻ°āĻŋāĻ¸ āĻ‰āĻ­āĻ¯āĻŧ āĻļā§āĻ°ā§‡āĻŖā§€āĻ° āĻŸā§āĻ˛ā§‡āĻ° āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻāĻ•āĻ¤ā§āĻ°āĻŋāĻ¤ āĻ•āĻ°ā§‡: āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ¨āĻŋāĻ°ā§āĻŽāĻŋāĻ¤ āĻāĻŦāĻ‚ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ¸āĻžāĻĨā§‡āĨ¤

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ āĻŽā§‹āĻĄā§‡ āĻĒā§‹āĻ˛āĻžāĻ°āĻŋāĻ¸ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡, āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒā§‡āĻ° āĻ“āĻ¯āĻŧā§‡āĻŦāĻ¸āĻžāĻ‡āĻŸā§‡ āĻ¨āĻŋāĻ°ā§āĻĻā§‡āĻļāĻžāĻŦāĻ˛ā§€.

āĻŽā§‚āĻ˛ āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻ˛ā§‡āĻ–āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ 1.0.3 āĻ‰āĻĒāĻ˛āĻŦā§āĻ§āĨ¤

āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ā§‡āĻļāĻ¨ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšāĻ“āĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸā§‡ āĻĒā§‹āĻ˛āĻžāĻ°āĻŋāĻ¸ āĻšāĻžāĻ˛āĻžāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ base-valid.yaml āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ¸āĻš:

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

āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ JSON āĻ¸ā§āĻŸā§āĻ°āĻŋāĻ‚ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻ•āĻ°āĻŦā§‡ āĻ¯ā§‡ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻšāĻžāĻ˛āĻžāĻ¨ā§‹ āĻšāĻ¯āĻŧā§‡āĻ›āĻŋāĻ˛ āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ā§‡āĻ° āĻŦāĻŋāĻŦāĻ°āĻŖāĨ¤ āĻ†āĻ‰āĻŸāĻĒā§āĻŸ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻĨāĻžāĻ•āĻŦā§‡:

{
  "PolarisOutputVersion": "1.0",
  "AuditTime": "0001-01-01T00:00:00Z",
  "SourceType": "Path",
  "SourceName": "test-data/base-valid.yaml",
  "DisplayName": "test-data/base-valid.yaml",
  "ClusterInfo": {
    "Version": "unknown",
    "Nodes": 0,
    "Pods": 2,
    "Namespaces": 0,
    "Controllers": 2
  },
  "Results": [
    /* Đ´ĐģиĐŊĐŊŅ‹Đš ŅĐŋиŅĐžĐē */
  ]
}

āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻšāĻžāĻ° āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻāĻ–āĻžāĻ¨ā§‡.

āĻ•ā§āĻŦā§‡-āĻ¸ā§āĻ•ā§‹āĻ°ā§‡āĻ° āĻŽāĻ¤ā§‹, āĻĒā§‹āĻ˛āĻžāĻ°āĻŋāĻ¸ āĻāĻŽāĻ¨ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ—ā§āĻ˛āĻŋ āĻšāĻŋāĻšā§āĻ¨āĻŋāĻ¤ āĻ•āĻ°ā§‡ āĻ¯ā§‡āĻ–āĻžāĻ¨ā§‡ āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸ āĻ¸ā§‡āĻ°āĻž āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻ¸āĻ°āĻŖ āĻ•āĻ°ā§‡ āĻ¨āĻž:

  • āĻĒāĻĄ āĻ¸ā§āĻŦāĻžāĻ¸ā§āĻĨā§āĻ¯ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ…āĻ¨ā§āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤.
  • āĻ•āĻ¨ā§āĻŸā§‡āĻ‡āĻ¨āĻžāĻ° āĻ‡āĻŽā§‡āĻœā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨ā§‹ āĻŸā§āĻ¯āĻžāĻ— āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻž āĻ¨ā§‡āĻ‡āĨ¤
  • āĻ§āĻžāĻ°āĻ•āĻŸāĻŋ āĻ°ā§āĻŸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ¸āĻžā§āĻšāĻžāĻ˛āĻŋāĻ¤ āĻšāĻ¯āĻŧāĨ¤
  • āĻŽā§‡āĻŽāĻ°āĻŋ āĻāĻŦāĻ‚ āĻ¸āĻŋāĻĒāĻŋāĻ‡āĻ‰-āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻāĻŦāĻ‚ āĻ¸ā§€āĻŽāĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻž āĻ¨ā§‡āĻ‡āĨ¤

āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž, āĻ¤āĻžāĻ° āĻĢāĻ˛āĻžāĻĢāĻ˛ā§‡āĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡, āĻ¸āĻŽāĻžāĻ˛ā§‹āĻšāĻ¨āĻžāĻ° āĻāĻ•āĻŸāĻŋ āĻĄāĻŋāĻ—ā§āĻ°ā§€ āĻŦāĻ°āĻžāĻĻā§āĻĻ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧ: āĻ¸āĻ¤āĻ°ā§āĻ•āĻŦāĻžāĻ°ā§āĻ¤āĻž āĻŦāĻž āĻā§āĻāĻ•āĻŋ. āĻ‰āĻĒāĻ˛āĻŦā§āĻ§ āĻŦāĻŋāĻ˛ā§āĻŸ-āĻ‡āĻ¨ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ†āĻ°āĻ“ āĻœāĻžāĻ¨āĻ¤ā§‡, āĻĒāĻĄāĻŧā§āĻ¨ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨.

āĻŦāĻŋāĻļāĻĻ āĻŦāĻŋāĻŦāĻ°āĻŖ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¨āĻž āĻšāĻ˛ā§‡, āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻĒāĻ¤āĻžāĻ•āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ --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 āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¯āĻžāĻšāĻžāĻ‡ āĻāĻŦāĻ‚ āĻŽā§‚āĻ˛ā§āĻ¯āĻžāĻ¯āĻŧāĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ…āĻ¨ā§‡āĻ•āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ°āĻžā§āĻœāĻžāĻŽ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻ•āĻ°āĻž āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ¸āĻŽā§āĻĒāĻžāĻĻāĻŋāĻ¤ āĻšāĻŦā§‡ āĻ¸ā§‡ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ•ā§‡ āĻ¸ā§āĻĒāĻˇā§āĻŸ āĻ§āĻžāĻ°āĻŖāĻž āĻĨāĻžāĻ•āĻž āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ.

āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ā§‡āĻ° āĻŽāĻ§ā§āĻ¯ āĻĻāĻŋāĻ¯āĻŧā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž Kubernetes āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸāĻ—ā§āĻ˛āĻŋ āĻ¨ā§‡āĻ¨, āĻ¤āĻžāĻšāĻ˛ā§‡ āĻ•ā§āĻŦā§‡āĻ­āĻžāĻ˛ āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻĒāĻžāĻ‡āĻĒāĻ˛āĻžāĻ‡āĻ¨ā§‡āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻ§āĻžāĻĒ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡. āĻāĻŸāĻŋ āĻ¨āĻŋāĻļā§āĻšāĻŋāĻ¤ āĻ•āĻ°āĻŦā§‡ āĻ¯ā§‡ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ—ā§āĻ˛āĻŋ Kubernetes API āĻ¸ā§āĻ•āĻŋāĻŽāĻžāĻ° āĻ¸āĻžāĻĨā§‡ āĻŽā§‡āĻ˛ā§‡āĨ¤

āĻāĻ•āĻŦāĻžāĻ° āĻāĻ‡ āĻ§āĻ°āĻ¨ā§‡āĻ° āĻĒāĻ°ā§āĻ¯āĻžāĻ˛ā§‹āĻšāĻ¨āĻž āĻ¸āĻŽā§āĻĒāĻ¨ā§āĻ¨ āĻšāĻ˛ā§‡, āĻ†āĻ°āĻ“ āĻĒāĻ°āĻŋāĻļā§€āĻ˛āĻŋāĻ¤ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡, āĻ¯ā§‡āĻŽāĻ¨ āĻ†āĻĻāĻ°ā§āĻļ āĻ¸ā§‡āĻ°āĻž āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ āĻāĻŦāĻ‚ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ¨ā§€āĻ¤āĻŋāĻ—ā§āĻ˛āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ¸āĻŽā§āĻŽāĻ¤āĻŋāĨ¤ āĻāĻ–āĻžāĻ¨ā§‡āĻ‡ āĻ•ā§āĻŦā§‡-āĻ¸ā§āĻ•ā§‹āĻ° āĻāĻŦāĻ‚ āĻĒā§‹āĻ˛āĻžāĻ°āĻŋāĻ¸ āĻ•āĻžāĻœā§‡ āĻ†āĻ¸āĻŦā§‡āĨ¤

āĻ¯āĻžāĻĻā§‡āĻ° āĻœāĻŸāĻŋāĻ˛ āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ā§€āĻ¯āĻŧāĻ¤āĻž āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻāĻŦāĻ‚ āĻ¤āĻžāĻĻā§‡āĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¸ā§‚āĻ•ā§āĻˇā§āĻŽ-āĻŸāĻŋāĻ‰āĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯, āĻ¤āĻžāĻŽāĻž, āĻ•āĻ¨āĻĢāĻŋāĻ—-āĻ˛āĻŋāĻ¨ā§āĻŸ āĻāĻŦāĻ‚ āĻ•āĻ¨āĻĢāĻŸā§‡āĻ¸ā§āĻŸ āĻĻā§āĻ°ā§āĻĻāĻžāĻ¨ā§āĻ¤ āĻšāĻŦā§‡āĨ¤.

āĻ•āĻ¨āĻĢāĻŸā§‡āĻ¸ā§āĻŸ āĻāĻŦāĻ‚ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°-āĻ˛āĻŋāĻ¨ā§āĻŸ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋāĻ•ā§‡ āĻ¸āĻ‚āĻœā§āĻžāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻ•āĻ°āĻ¤ā§‡ YAML āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡, āĻ¯āĻ–āĻ¨ āĻ¤āĻžāĻŽāĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻ­āĻžāĻˇāĻžāĻ¤ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ āĻĻā§‡āĻ¯āĻŧ, āĻāĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ¸ā§āĻ¨ā§āĻĻāĻ° āĻ†āĻ•āĻ°ā§āĻˇāĻŖā§€āĻ¯āĻŧ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°ā§‡ āĻ¤ā§‹āĻ˛ā§‡āĨ¤

āĻ…āĻ¨ā§āĻ¯āĻĻāĻŋāĻ•ā§‡, āĻ†āĻĒāĻ¨āĻžāĻ° āĻ•āĻŋ āĻāĻ‡ āĻŸā§āĻ˛āĻ—ā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻāĻŦāĻ‚ āĻ¤āĻžāĻ‡, āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ—ā§āĻ˛āĻŋ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤, āĻŦāĻž āĻĒā§‹āĻ˛āĻžāĻ°āĻŋāĻ¸āĻ•ā§‡ āĻĒāĻ›āĻ¨ā§āĻĻ āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤ āĻāĻŦāĻ‚ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¯āĻž āĻĒā§āĻ°āĻ¯āĻŧā§‹āĻœāĻ¨ āĻ¤āĻž āĻ¯ā§‹āĻ— āĻ•āĻ°āĻž āĻ‰āĻšāĻŋāĻ¤? āĻāĻ‡ āĻĒā§āĻ°āĻļā§āĻ¨ā§‡āĻ° āĻ•ā§‹āĻ¨ āĻāĻ•āĻ• āĻ‰āĻ¤ā§āĻ¤āĻ° āĻ¨ā§‡āĻ‡.

āĻ¨ā§€āĻšā§‡āĻ° āĻŸā§‡āĻŦāĻŋāĻ˛ā§‡ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻŸā§āĻ˛ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ¸āĻ‚āĻ•ā§āĻˇāĻŋāĻĒā§āĻ¤ āĻŦāĻŋāĻŦāĻ°āĻŖ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡:

āĻŸā§āĻ˛
āĻ¨āĻŋāĻ¯āĻŧāĻ¤āĻŋ
āĻ­ā§āĻ˛āĻ¤ā§āĻ°ā§āĻŸāĻŋ
āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ° āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž

āĻ•ā§āĻŦā§‡āĻŦāĻ˛
āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ API āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖā§‡āĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ YAML āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸāĻ•ā§‡ āĻ¯āĻžāĻšāĻžāĻ‡ āĻ•āĻ°ā§‡
CRD āĻāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻŋāĻ­āĻžāĻŦā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ¯āĻŧ āĻ¤āĻž āĻœāĻžāĻ¨ā§‡āĻ¨ āĻ¨āĻž
āĻ¨āĻž

āĻ•ā§āĻŦā§‡-āĻ¸ā§āĻ•ā§‹āĻ°
āĻĒāĻžāĻ°ā§āĻ¸ YAML āĻ¸ā§‡āĻ°āĻž āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡āĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°ā§‡
āĻ†āĻĒāĻ¨āĻŋ āĻ¸āĻŽā§āĻĒāĻĻ āĻ¯āĻžāĻšāĻžāĻ‡āĻ•āĻ°āĻŖā§‡āĻ° āĻœāĻ¨ā§āĻ¯ Kubernetes API-āĻāĻ° āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻŦā§‡āĻ¨ āĻ¨āĻž
āĻ¨āĻž

āĻ¤āĻžāĻŽāĻž
YAML āĻŽā§āĻ¯āĻžāĻ¨āĻŋāĻĢā§‡āĻ¸ā§āĻŸā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻœā§‡āĻ¨ā§‡āĻ°āĻŋāĻ• āĻĢā§āĻ°ā§‡āĻŽāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ•
āĻ•ā§‹āĻ¨ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ¨āĻŋāĻ°ā§āĻŽāĻŋāĻ¤ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ†āĻ›ā§‡. āĻ¸ā§āĻŦāĻ˛ā§āĻĒ āĻĄāĻ•ā§āĻŽā§‡āĻ¨ā§āĻŸā§‡āĻļāĻ¨
āĻšāĻžāĻ

config-lint
YAML-āĻ āĻāĻŽāĻŦā§‡āĻĄ āĻ•āĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻĄā§‹āĻŽā§‡āĻ¨-āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¤ā§ˆāĻ°āĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻ•āĻžāĻ āĻžāĻŽā§‹āĨ¤ āĻŦāĻŋāĻ­āĻŋāĻ¨ā§āĻ¨ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ āĻĢāĻ°āĻŽā§āĻ¯āĻžāĻŸ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻ•āĻ°ā§‡ (āĻ¯ā§‡āĻŽāĻ¨ Terraform)
āĻ•ā§‹āĻ¨ā§‹ āĻ°ā§‡āĻĄāĻŋāĻŽā§‡āĻĄ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¨ā§‡āĻ‡āĨ¤ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ¨āĻŋāĻ°ā§āĻŽāĻŋāĻ¤ āĻĻāĻžāĻŦā§€ āĻāĻŦāĻ‚ āĻĢāĻžāĻ‚āĻļāĻ¨ āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻ¨āĻžāĻ“ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡
āĻšāĻžāĻ

āĻĒā§āĻ°āĻ¤āĻŋāĻ¯ā§‹āĻ—āĻŋāĻ¤āĻž
āĻ°ā§‡āĻ—ā§‹āĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ•āĻžāĻ āĻžāĻŽā§‹ (āĻāĻ•āĻŸāĻŋ āĻŦāĻŋāĻļā§‡āĻˇ āĻ•ā§āĻ¯ā§‹āĻ¯āĻŧāĻžāĻ°ā§€ āĻ­āĻžāĻˇāĻž)āĨ¤ OCI āĻŦāĻžāĻ¨ā§āĻĄā§‡āĻ˛ā§‡āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻĒāĻ˛āĻŋāĻ¸āĻŋ āĻļā§‡āĻ¯āĻŧāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ
āĻ•ā§‹āĻ¨ āĻ…āĻ¨ā§āĻ¤āĻ°ā§āĻ¨āĻŋāĻ°ā§āĻŽāĻŋāĻ¤ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ†āĻ›ā§‡. āĻ°ā§‡āĻ—ā§‹ āĻļāĻŋāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻ¨ā§€āĻ¤āĻŋ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻĄāĻ•āĻžāĻ° āĻšāĻžāĻŦ āĻ¸āĻŽāĻ°ā§āĻĨāĻŋāĻ¤ āĻ¨āĻ¯āĻŧ
āĻšāĻžāĻ

āĻ§ā§āĻ°ā§āĻŦāĻ¤āĻžāĻ°āĻž
YAML āĻĒāĻžāĻ°ā§āĻ¸ āĻ•āĻ°ā§‡ āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ¸ā§‡āĻ°āĻž āĻ…āĻ¨ā§āĻļā§€āĻ˛āĻ¨ā§‡āĻ° āĻŦāĻŋāĻ°ā§āĻĻā§āĻ§ā§‡ āĻĒā§āĻ°āĻ•āĻžāĻļ āĻ•āĻ°ā§‡āĨ¤ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ JSON āĻ¸ā§āĻ•āĻŋāĻŽāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœāĻ¸ā§āĻŦ āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻž āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧ
JSON āĻ¸ā§āĻ•āĻŋāĻŽāĻž-āĻ­āĻŋāĻ¤ā§āĻ¤āĻŋāĻ• āĻĒāĻ°ā§€āĻ•ā§āĻˇāĻžāĻ° āĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻ¯āĻĨā§‡āĻˇā§āĻŸ āĻ¨āĻžāĻ“ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡
āĻšāĻžāĻ

āĻ¯ā§‡āĻšā§‡āĻ¤ā§ āĻāĻ‡ āĻŸā§āĻ˛āĻ—ā§āĻ˛āĻŋ āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻ…ā§āĻ¯āĻžāĻ•ā§āĻ¸ā§‡āĻ¸ā§‡āĻ° āĻ‰āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻ­āĻ° āĻ•āĻ°ā§‡ āĻ¨āĻž, āĻ¤āĻžāĻ‡ āĻāĻ—ā§āĻ˛āĻŋ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻž āĻ¸āĻšāĻœāĨ¤ āĻ¤āĻžāĻ°āĻž āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻ‰āĻ¤ā§āĻ¸ āĻĢāĻžāĻ‡āĻ˛āĻ—ā§āĻ˛āĻŋ āĻĢāĻŋāĻ˛ā§āĻŸāĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻ…āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§‡āĻ¯āĻŧ āĻāĻŦāĻ‚ āĻĒā§āĻ°āĻ•āĻ˛ā§āĻĒāĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻ˛ā§‡āĻ–āĻ•āĻĻā§‡āĻ° āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĻā§āĻ°ā§āĻ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡āĨ¤

āĻ…āĻ¨ā§āĻŦāĻžāĻĻāĻ• āĻĨā§‡āĻ•ā§‡ PS

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦā§āĻ˛āĻ—ā§‡āĻ“ āĻĒāĻĄāĻŧā§āĻ¨:

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨