ááľáłááť. áľááááK8s á á¨áŁá˘áá˝ á¨YAML áá áŽá˝ ááĽá áĽáŤá°á á áááŁáąáŁ á áŤáľ á°á á¨áá¨áááŤá¸á á áľáááááľ á¨áá áá° áá áá áἠá áŁáłá ááááᢠá¨áá áááá á°áŤá˛ ááá á°ááŁá ááŁá áááľááá˝á ááá¨áĽ áĽáť áłááá áĽáá´áľ áĽáá°áá አááá¨áľ Deploymentá áĽáá° ááłá á°á á ááᢠá áá áááľ áá ááááľ ááá¸á á°áá˝ á áŁá áá¨á á°áŞ áá á°áááˇá.
TL; DRáá ááŁáĽá á¨áŠá áááľáľ YAML áááá˝á á¨ááἠáááśá˝ áĽá ááľáááśá˝ á ááťá ááá¨ááἠáĽá áááááá áľáľáľáľ á¨áááááłááą ááłáŞáŤáá˝á áŤááłáľáŤáá˘
á¨áŠá áááľáľ á¨áľáŤ áŤááá˝ á á°áááś á YAML á°ááśá˝ ááá áááááᢠá YAML áá áŤááľ á˝ááŽá˝ á ááą á ááááŁá¨á
áááá˝ ááŤá¨á áá°áŚá˝á ááá áááááśá˝á á¨áááá˝ á˝áá ááá˘
áá° áááľá°á á¨á°á°áአááľáá˝ á áá á¨áłáá áááἠá¨áᥠáááá¸áá áá¨ááἠáĽáááááľ?
á¨PodDisruptionBudgets á¨ááá¸áá áá°ááŤáśá˝ áá° áááľá°á áĽááłááአáĽáá´áľ áá¨áá¨á áĽá˝ááá?
á¨áľáłá˛á áá¨áŤ áá á°áľ á áĽáľááľ á°á¨á áá áľá á°áśá˝á áĽá á¨ááᲠáĽá°áśá˝á áááá¨áľ áŤáľá˝áááłá. áá á¨ááá ááşáá˝ áľáááá áĽá á°á áááłá¸á á¨á°á á á á¨áááá ááľáľá áá¨ááŤáᣠáĽá á¨áááľ á¨áľáŤ áŤááá˝ ááἠáááśá˝á á¨áá¨á°á áĽáľáá¸á á°á áŤá°ááááá˘
á¨áŠá áááľáľ á¨áááááłááľ YAML ááá áá°áť áĽá áá áłá á áá¨á°ááľ ááľáŚá˝ áá¨áá áá˝ááá˘
- á¤áá á á á¨áááŽá˝. á áá ááľáĽ ááľáĽ áŤá ááłáŞáŤáὠᨠYAML ááááŤáá á¨Kubernetes API á áááá ááľáááśá˝ áá áŤá¨áááŁáá˘
- ááá ááŤáŞáá˝. á¨áá ááľáĽ ááłáŞáŤáá˝ áá°á áááľ á˛áŁá á¨á°ááá áá¨áŤáá˝áŁ ááἠá°áááŽáá˝á ááá áᣠááá°.
- áĽá á á¨áááŽá˝. á¨áá ááľáĽ á°ááŤáŽá˝ á á°ááŤáŠ ááááá˝ áĽá áá¨áŤáá˝á áĽáá˛ááĽáŠ ááá áąáááłá, áááłá, áŹá áĽá ááŤáľááŞááľ.
á áá á˝áá ááľáĽ áľáľáľáľ á¨á°ááŤáŠ ááłáŞáŤáá˝á áĽáááááá áĽá áĽáááá áŤáá-
- áŠá¤áŤá;
- áŠá¤-áá¤áľ;
- áááá-áááľ;
- ááľ;
- ááá°áľ;
- áááŞáľ
á°á á, áĽáááá!
áá°ááŤáśá˝á á ááá°á˝ áá
ááłáŞáŤáá˝á áááłá°á á¨ááááŤá˝á á ááľ áĽááąá á¨ááááľá˝á áľ áłáŤ áĽááá áá˘
á¨áłá˝ áŤáá ááááľáś á ááŤáł áľá á°áśá˝á áĽá ááἠá°áááŽáá˝á á áááá á áááᥠáá áŤá áá ááłáá áľá˝ááá ?
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
á áá áá° áááą
1. áŠá¤áŤá
á áá á¨áą
áááá á˝áá á áá˝áá áľ áá áľáŞáľ 0.15.0 á°áááˇáá˘
á áá´ á¨á°áŤáᣠá¨áá áŤááá á áá¸áŁáŤá áĽáááá ááĄ-
$ kubeval base-valid.yaml
PASS - base-valid.yaml contains a valid Deployment (http-echo)
PASS - base-valid.yaml contains a valid Service (http-echo)
á¨á°áłáŤ áŠá¤áŤá á áááŁáľ áŽáľ 0 áááŁáᢠáĽáá°áá¨á°áá áá¨ááἠáá˝ááá˘
$ echo $?
0
á áá áŠá¤áŤáá á á°áᨠááá፠áĽáááááĄ-
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo
(kubeval-invalid.yaml
)
á˝ááŠá á á áá áá¨áľ áá˝áá? áĽáááááĄ
$ kubeval kubeval-invalid.yaml
WARN - kubeval-invalid.yaml contains an invalid Deployment (http-echo) - selector: selector is required
PASS - kubeval-invalid.yaml contains a valid Service (http-echo)
# ĐżŃОвоŃиП кОд вОСвŃĐ°ŃĐ°
$ echo $?
1
ááĽáą áĽá¨á°á¨ááá á áá°ááá˘
á¨á¤áá á áĽáŞáľá á áá áá áá°ááŤáśá˝ 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
)
áĽáá° áŠá¤áŤá áŤá ááłáŞáŤáá˝ áĽá ááĽá áá˝ áĽáá°ááá áŤá áľá á°áśá˝ á áá°ááŤáľ áá°áľ ááááŞáŤ áá ááŤá áá˝áá.
á á°á¨ááŞá áĽááá áźáŽá˝ áá° áááľá°á ááľá¨áľ á áŤáľáááá¸ááᤠá¨ááľáá áá áá°á¨á áá˝ááá˘
á ááŁáŞáŁ kubeval ááĽá¨áąá á¨á
áἠááá ᨠKubernetes API schema áá áááľáťáᢠááá ááᣠá á áĽááááš áááłáá˝ á¨á°áá°á á¨áŠá áááľáľ áááľ áá áá¨ááἠááááĽá áá˝ááᢠáá
áŁáá˛áŤ á áá áá áá¨ááá áá˝áá --kubernetes-version
:
$ kubeval --kubernetes-version 1.16.1 base-valid.yaml
áĽáŁááá áľáŞáą á á
áá¸áą áááá˝ áĽááłáá áľ áŤáľá°áá Major.Minor.Patch
.
áá¨áááŤá á¨áá°áááŁá¸á áľáŞáśá˝ ááááᣠáĽáŁááá áááá¨áą --schema-location
.
á¨á°áá á YAML áááá˝ á á°á¨á᪠kubeval á¨áá፠áĽá stdin áá ááľáŤáľ áá˝ááá˘
á á°á¨ááŞá áŠá¤áŤá á ááá á CI á§á᧠ááľáá ááľáĽ ááááłá. ááááŤáá˝á áá° áááľá°á á¨áááá á ááľ áá¨áŤáá˝á ááŤááľ á¨áááá áŠá¤áŤá áśáľáľ á¨áá¤áľ á áá¸áśá˝á áĽáá°áá°áá á ááá áá°á°áłáá˘
- á ááá ἠáááŠ;
- JSON;
- áááááá ááá ááŽáśáŽá (TAP) áááá˘
áĽá á¨áľááá á áá¸áśá˝ á¨áááááá á áááľ áá¤áľ áá áá፠áááá á á¨áá¤áąá á°á¨á᪠áľáá°á ááŤáááá áá˝ááá˘
á¨áŠá¤áŤá á ááą áá°áááá˝ á á áá áá áĽá á¨áá¨á ááşáá˝ (á˛á áá˛áá˝) áá¨á áŤá¸áá áá¨ááἠá áááťá ááᢠááá áá, kubeval á áááá ááťáá
áŠá¤áŤá ááĽáśá˝á áááá°á˝ áĽá áááááá áĽáŠ ááłáŞáŤ áá; ááá áá áá°ááá ááá ááĽáą ááἠá°áááŽáá˝á áááá á ááľáľá áĽáá°ááá°áĽ áá°ááá áľ áááŁáá˘
áááłá, áááŤáá á áá áá latest
á ááŤáŁá ááľáĽ ááἠáááśá˝á á áá¨á°áá. ááá áŠá¤áŤá áá
áá áľá
á°áľ á áááĽá¨áá áĽá áŞáááľ á áŤá°ááááᢠáŤá áááľ á¨áĽáá°áá
á áááľ YAML áá¨áá፠áŤá ááľá ááá፠áá ááááá˘
áá YAML á áááááá áĽá áĽáá° áááŤá áŤá áĽá°áśá˝á áááá¨áľ á¨ááá áá ááľá¨á á ááĽááľ latest
? ᨠYAML áááá á¨ááἠáááśá˝ áĽáá´áľ áá¨ááἠáĽá˝ááá?
2. áŠá¤-áá¤áľ
- ááŤáŁáá áĽáá° áľá áłááá ááľáŹáľ.
- á¨ááľ á¨á¤á ááááŤáá˝ ááááľ.
- áááĽáśá˝ áĽáŤááá˝á áĽá áá°áŚá˝á á áááááľ ááá˘
á ááááŤá áá¤áľ áá á¨áľ áŚáľáľ áá¤áśá˝ á°á°áĽá°áá- OK, ááľá ááá፠и á áľááŞ.
Kube-scoreá á ááľáá áá ááá¨á ááá á á áá ááľáĽ ááŤá áá˝ááá˘
áááá á˝áá á áá˝áá áľ ááᣠá¨á áἠááá ᨠkube-score áľáŞáľ 1.7.0 áá áá˘
á áĽá ááá፠áá áĽáááá base-valid.yaml
:
$ kube-score score base-valid.yaml
apps/v1/Deployment http-echo
[CRITICAL] Container Image Tag
¡ http-echo -> Image with latest tag
Using a fixed tag is recommended to avoid accidental upgrades
[CRITICAL] Pod NetworkPolicy
¡ The pod does not have a matching network policy
Create a NetworkPolicy that targets this pod
[CRITICAL] Pod Probes
¡ Container is missing a readinessProbe
A readinessProbe should be used to indicate when the service is ready to receive traffic.
Without it, the Pod is risking to receive traffic before it has booted. It is also used during
rollouts, and can prevent downtime if a new version of the application is failing.
More information: https://github.com/zegl/kube-score/blob/master/README_PROBES.md
[CRITICAL] Container Security Context
¡ http-echo -> Container has no configured security context
Set securityContext to run the container in a more secure context.
[CRITICAL] Container Resources
¡ http-echo -> CPU limit is not set
Resource limits are recommended to avoid resource DDOS. Set resources.limits.cpu
¡ http-echo -> Memory limit is not set
Resource limits are recommended to avoid resource DDOS. Set resources.limits.memory
¡ http-echo -> CPU request is not set
Resource requests are recommended to make sure that the application can start and run without
crashing. Set resources.requests.cpu
¡ http-echo -> Memory request is not set
Resource requests are recommended to make sure that the application can start and run without crashing.
Set resources.requests.memory
[CRITICAL] Deployment has PodDisruptionBudget
¡ No matching PodDisruptionBudget was found
It is recommended to define a PodDisruptionBudget to avoid unexpected downtime during Kubernetes
maintenance operations, such as when draining a node.
[WARNING] Deployment has host PodAntiAffinity
¡ Deployment does not have a host podAntiAffinity set
It is recommended to set a podAntiAffinity that stops multiple pods from a deployment from
being scheduled on the same node. This increases availability in case the node becomes unavailable.
YAML á¨áŠá¤áŤá áá°ááá˝á á áááᣠáŠá¤-ááĽáĽ á°áá á¨áá¨á°ááľá ááľááśá˝ áŤáłáŤáá˘
- áááááľ áá°áťáá˝ á áá°áááŠáá˘
- áá˛áአááĽáśá˝ áĽá áá á°á¨ áľááľáł ááá áĽáŤááá˝ ááá áá°áŚá˝ á¨ááá˘
- á¨ááľ ááá¨áĽ á ááśá˝ á áá°ááášáá˘
- á¨áááŤá¨áľ á°ááŚá˝ á¨áá (áá¨-áááááľ) á°ááááľá á¨á áááľá¨á.
- ááŤáŁá áĽáá° áĽá áá áŤá.
áĽááá áá áľáááśá˝á á¨áááá¨áą áľáááá ááĽáŚá˝ áá¸á áá°ááŤáľá á¨á áá áááŁá áĽá á áľá°ááá áááľá¨áá˘
áĄáľá 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 áŤáá°áłáŤ áá°á á˛áá áᎠáŤááá á¨áá፠áŽáľ ááááłá á áľááŞ. áĽáá˛áá á á°ááłáłá áá°áľá ááááľ áá˝ááᢠááľá ááááŤ.
á á°á¨ááŞá, á¨á°ááŤáŠ á¨á¤áá á áľáŞáśá˝ (áĽáá° áŠá¤áŤá) áá ááŁáŁáá ááĽáśá˝á áá¨ááἠááťáá. ááá ááᣠáá áá¨á á kube-score á áŤáą áááľ áŽáľ ááᥠá¨á°áᨠᨠKubernetes áľáŞáľ ááá¨áĽ á áá˝ááᢠáááľá°ááá áááťáťá áŤá°áĄ ááá á¨á°ááŤáŠ á¨K8s áľáŞáśá˝ áŤáá¸á áĽá ááááá˝ áŤáááľ áá áá°áĽ áľáá á˝áá ááá áá˝ááá˘
á áľáłááľ á áľááł
á¨ááá ááłá á áľááľá á áᢠáá áá áĽáľá áááááἠá ááŽááá.
áľá kube-score á°á¨á᪠áá¨á á áá ááááá˘
á¨áŠá¤-áá¤áľ áá¨áŤáá˝ ááἠáááśá˝á ááá°áá á á áŁá áĽáŠ ááłáŞáŤ áá¸á, ááá áá á áá°áá áá áááŚá˝á ááľá¨á ááá á¨áŤáľáá á áá˝ áá¨á á¨ááááľ? ááŽ, áá ááľá¨á á ááťáá.
Kube-score extensible á áá°ááᥠá áĽáą áá ááá˛áá˝á áá¨á ááá ááľá°áŤá¨á á áá˝ááá˘
á¨áŠáŁááŤá ááá˛áá˝ áá áá¨á áŤá¸áá ááá¨ááἠáĽá áá¨áŤáá˝á ááťá á¨ááá á¨áá¨á°ááľ á áŤáľ ááłáŞáŤáá˝ ááľáĽ á ááąá áá áá áá˝ááᥠconfig-lintᣠcopperᣠconftest ááá polarisá˘
3.Config-lint
Config-lint YAMLáᣠJSONáᣠTerraformáᣠCSV áá á áááá˝á áĽá á¨áŠá áááľáľ ááááŤáá˝á á¨ááŤá¨ááἠááłáŞáŤ ááá˘
á áá áá ááŤá áá˝ááá˘
áááá ááŁáĽá áĽáľá¨á°ááá áľ áá áľá¨áľ áŤáá á¨á áá áááľ 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
á¨á°á áá áá¨áŤáá˝á ááááááľ á¨áłá°á á˘
á Deployment ááľáĽ áŤá ááľáá˝ áááá á¨áłáá áá¨ááť ááá¨áľá áá¨ááἠááááá áĽáá á my-company.com/myapp:1.0
. áĽáá˛á
ááááąá áźá á¨ááŤá¨ááá á¨ááááŞáŤ á°áἠáá
áá áááľááá˘
- id: MY_DEPLOYMENT_IMAGE_TAG
severity: FAILURE
message: Deployment must use a valid image tag
resource: Deployment
assertions:
- every:
key: spec.template.spec.containers
expressions:
- key: image
op: starts-with
value: "my-company.com/"
(rule-trusted-repo.yaml
)
áĽáŤááłááą á°áἠá¨áá¨á°ááľá áŁá áŞáŤáľ ááá¨á áááŁá:
id
- á¨á°áᥠáአáááŤ;severity
- áá á ááŁáľ á áááłáŤáľ, ááľá ááá፠и áŤáá°áá;message
- á ááľ á°áἠá¨á°áŁá°, á¨áá ááľáá áááľ ááłáŤá;resource
- áá á°áἠá¨áá°áá áá áľ á¨ááĽá¨áľ á áááľ;assertions
- á¨áá ááĽáľ áá á á°áŤáŤá á¨ááááá áááłáá˝ ááááá˘
á¨áá áŁáá á°áἠassertion
á áá
áľá every
key: spec.templates.spec.containers
) á¨áłáá ááľáá˝á áá áá (áááľá á áááá my-company.com/
).
á¨á°ááá á°áἠáá áá áááľáá
version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
- "*.yaml"
rules:
- id: DEPLOYMENT_IMAGE_REPOSITORY # !!!
severity: FAILURE
message: Deployment must use a valid image repository
resource: Deployment
assertions:
- every:
key: spec.template.spec.containers
expressions:
- key: image
op: starts-with
value: "my-company.com/"
(ruleset.yaml
)
áá°ááá áááá¨áᣠáĽáá° áá áĽááľááá á check_image_repo.yaml
. áááá áĽáááľá˝ base-valid.yaml
:
$ config-lint -rules check_image_repo.yaml base-valid.yaml
[
{
"AssertionMessage": "Every expression fails: And expression fails: image does not start with my-company.com/",
"Category": "",
"CreatedAt": "2020-06-04T01:29:25Z",
"Filename": "test-data/base-valid.yaml",
"LineNumber": 0,
"ResourceID": "http-echo",
"ResourceType": "Deployment",
"RuleID": "DEPLOYMENT_IMAGE_REPOSITORY",
"RuleMessage": "Deployment must use a valid image repository",
"Status": "FAILURE"
}
]
áźáŠ á áá°áłáŤáᢠá áá á¨áá¨á°ááá á áá¸áŁáŤá á¨áľááááá á¨ááľá áá¨ááť áá áĽáááá¨á°ááĄ
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector:
matchLabels:
app: http-echo
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: my-company.com/http-echo:1.0 # !!!
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
(image-valid-mycompany.yaml
)
á¨áá áŤáá á áá¸áŁáŤá áá á°ááłáłá áá°á áĽáá°áŤáá. ááá á˝ááŽá˝ á áá°ááá:
$ config-lint -rules check_image_repo.yaml image-valid-mycompany.yaml
[]
Config-lint ᨠYAML DSL á á áá áá á¨áŠá áááľáľ YAML ááááŤáá˝á ááá¨ááἠá¨áŤáľáá áá¨áŤáá˝ áĽáá˛ááĽáŠ á¨ááŤáľá˝áá á°áľá á°áŞ áááá ááá˘
áá á¨á áá ááľáĽáľáĽ ááá áĽá áá¨áŤáá˝ á˘ááááľ? YAML ááá á áŁá á¨á°áá°á á áá°áá? áá°ááá˝á á áá á¨ááŽááŤá á ááŁáĽ ááá ááá á á¨áťááľ?
4. ááłáĽ
ááá ááᣠáá°ááá˝á ááááá˝ YAML áŁááá áá á¨ááá°áá áááŤáᢠáá°ááá˝ á ááľáŠ á ááŤáľááŞááľ ááťá áá˝ááᢠááłáĽ á ááŤáł áá á¨áłá ááłáŞáŤáá˝á á¨áŤá á¤á° ááťáááľ áŤáááŁááľá Kubernetes áááŽá˝ áá¨áá áááá ἠáĽá áľá á°áśá˝á áŞáááľ áááľá¨á á¨áá¨áłááľ.
ááłáĽá áááŤá á°á¨ááá˝ á ááľáĽ áááá
2.0.1 áááá ááŁáĽá á ááťáá áľ áá á¨áá áááá፠á¨á áἠáá áááľ ááá˘
áá áĽáá° config-lintᣠááłáĽ á áĽáŽ á¨á°á°áŠ áá¨áŤáá˝ á¨ááľáᢠá ááąá áťáᢠáá°ááŤáśá˝ á¨ááŤáŁ ááľáá˝á á¨áłáá áá¨ááťáá˝ áĽáť áá ááá¸áá áŤá¨ááᥠmy-company.com
.
ááá ááá አcheck_image_repo.js
á¨áá¨á°áá áááľ áááĄ-
$$.forEach(function($){
if ($.kind === 'Deployment') {
$.spec.template.spec.containers.forEach(function(container) {
var image = new DockerImage(container.image);
if (image.registry.lastIndexOf('my-company.com/') != 0) {
errors.add_error('no_company_repo',"Image " + $.metadata.name + " is not from my-company.com repo", 1)
}
});
}
});
á áá á¨áĽáá á áá¸áŁáŤá áááá¨á base-valid.yaml
, áľáááá áá áá copper validate
:
$ copper validate --in=base-valid.yaml --validator=check_image_tag.js
Check no_company_repo failed with severity 1 due to Image http-echo is not from my-company.com repo
Validation failed
á ááłáĽ áĽááłáł á¨á áá ááľáĽáľáĽ áá¨áŤáá˝á ááľá¨á áĽáá°áá˝á ááá˝ áá - áááłá á Ingress manifests ááľáĽ á¨á፠áľáá˝á ááá°á˝ ááá á áአáááł ááľáĽ á¨áá°áŠ ááľáá˝á á áááá áá˘
ááłáĽ á ááľáĄ á¨á°ááŤáŠ á¨áááá፠á°ááŁáŤáľ á ááľ-
DockerImage
á¨á°ááá¸áá á¨áá¤áľ ááá áŤááŁá áĽá á¨áá¨á°ááľá áŁá áŞáŤáľ áŤáá ááá áááĽáŤááĄ-name
- á¨ááľá áľá;tag
- á¨ááľá áá፠áŁregistry
- á¨ááľá áááἠá¤áľ;registry_url
ááŽáśáŽá (https://
) áĽá á¨ááľá ááááĽ;fqin
- á¨ááľá áá áŚáłá˘
- áĽáŤ
findByName
á á°á°á á ááááľ ááá áááááľ áá¨áłá (kind
) áĽá áľá (name
) á¨áá¤áľ ááá. - áĽáŤ
findByLabels
á á°á áá°á ááááľ ááá áááááľ áá¨áłá (kind
) áĽá áááŤáá˝ (labels
).
áŤááľá áááá á¨á áááááľ á°ááŁáŤáľ áá¨áľ áľá˝ááá
á ááŁáŞááľ áááá ᨠYAML ááá áá° á°áááá ááááᢠ$$
áĽá ááľááŞááľ áĽáá˛áá áŤá°áááá (ᨠjQuery áááľ ááá¸á á¨áłáá áá´)á˘
á¨ááłáĽ ááá áĽá á ááá ááᥠáአáááá ááá á áŤáľáááááľá áĽá á¨á°ááŤáŠ á¨á፠áľááŞááľ áŁá áŞáŤáľá á áá áá á¨áŤáľáá áá¨áŤáá˝ áááłá áĽáá° string interpolation, á°ááŁáŤáľ, ááá°.
á áá áŤáá á¨ááłáĽ áľáŞáľ ᨠES5 á¨á፠áľááŞááľ áá°á áá áĽáá°áá°áŤ áĽáá ES6 áĽááłááá áἠááŁá áááŁáá˘
ááááŽá˝ á áá áááá
ááá ááᣠá፠áľááŞááľá á áľááá á¨ááľááľ á¨áá áĽá áá ááá˝á áááá á áĽá ááá˛áá˝á ááááá á¨á°áá°á áááá á¨áá¨áĽáᣠá conftest áľáŠá¨áľ ááľá áľ á ááĽá á˘
5.áŽáááľáľ
Conftest á¨áá
á áááĽá áááá°á˝ áááá ááᢠáĽáá˛áá ᨠKubernetes ááááŤáá˝á áááá°á˝ / ááá¨ááἠá°áľááᢠáá°ááá˝ á¨áááášáľ á áአá¨áĽáŤá ááá ááá˘
áŽáááľáľá á áá áá ááŤá áá˝ááá˘
áááá á˝áá á áá˝áá áľ áá á¨á áἠááá áľáŞáľ 0.18.2 áá á.
áá áĽáá° config-lint áĽá ááłáĽáŁ áŽáááľáľ áŤá ááá á áĽáŽ á¨á°á°áŠ áá¨áŤáá˝ áááŁáᢠáĽáľá˛ ááá¨á á¨áŤáłá˝áá ááᲠáĽáááᢠáĽáá° áá°ááľ ááłááá˝, á¨ááŤáŁá ááľáá˝ á¨áłáá ááá á¨á°áá°áą áááá¸áá áĽáá¨áááŁáá.
áá፠áá á conftest-checks
, áĽá á ááľáĄ á¨á°á°á¨á ááá á á check_image_registry.rego
á¨áá¨á°áá áááľ áááĄ-
package main
deny[msg] {
input.kind == "Deployment"
image := input.spec.template.spec.containers[_].image
not startswith(image, "my-company.com/")
msg := sprintf("image '%v' doesn't come from my-company.com repository", [image])
}
á áá áĽáááľá˝ base-valid.yaml
á áŠá conftest
:
$ conftest test --policy ./conftest-checks base-valid.yaml
FAIL - base-valid.yaml - image 'hashicorp/http-echo' doesn't come from my-company.com repository
1 tests, 1 passed, 0 warnings, 1 failure
ááľááš á¨áááłáá ááá áľááᥠáá¨áŤá ááááľ á ááťááá˘
á Rego ááá ááľáĽ áĽááłáá áĽáááááá deny
. á¨áĽáą áĽáááľ áĽáá° áĽá°áľ ááá áŤá. áĽááŽá˝ á¨áá deny
áĽá ᣠconftest áĽááľ á ááłá¸á á á°ááĽá áááľáťá¸áá ᣠáĽá á¨ááááá áĽááŽá˝ áĽáááľ áĽáá° áĽá°áľ ááá áŤáá˘
á¨ááŁáŞá áá
ááľ á á°á¨á᪠conftest JSONᣠTAP áĽá á áá á¨áĽ á
áá¸áľá áá°ááá - áŞáááśá˝á á áá áŁáá ᨠCI á§á᧠ááľáá ááľáĽ ááá°áľ á¨ááá áĽá
á á áŁá á áá áŁá
᪠ááᢠáŁáá˛áŤáá á áá áá á¨á°ááááá á
áá¸áľ áááááľ áá˝áá --output
.
ááá˛áá˝á ááá¨á ááá áááľá¨áᣠconftest áŁáá˛áŤ á ááᢠ--trace
. á¨á°ááášáľá á¨áááŞáŤ áááá˝ áĽáá´áľ áĽáá°áá°áá°á á¨ááŤáłá áąáŤ áŤááŁáá˘
á¨ááľáľá ááá˛áá˝ á OCI (Open Container Initiative) áááἠá¤áśá˝ áĽáá° á ááľ ááłá°á áĽá ááአáá˝ááá˘
áĄáľáá˝ push
и pull
á ááľ á
ááľ áĽáá˛áŤáľá ááá
áľáááłá ááá ááŁá á
ááśá˝á á¨áááľ áááἠáŤááᢠá¨áá áááá ááᲠá°á á
áá á á áŤáŁá˘áŤáá á¨áśá¨á áááἠáá ááá°á áĽáááá conftest push
.
á¨á áŤáŁá˘áá Docker áááἠááááŠáĄ-
$ docker run -it --rm -p 5000:5000 registry
á áá á°áááá ááľáĽáŁ áá°á áĽáá áá°áá áŠáľ áá፠áááą conftest-checks
áĽá á¨áá¨á°ááá áľááá áŤááą:
$ conftest push 127.0.0.1:5000/amitsaha/opa-bundle-example:latest
áľááá á¨á°áłáŤ á¨áá áĽáá°áá áŤá áááĽááľ áŤáŤá-
2020/06/10 14:25:43 pushed bundle with digest: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609c
á áá áááŤá áá፠ááá አáĽá áľáááá á áĽáą ááľáĽ áŤááą conftest pull
. á áá°áá áľááá á¨á°áá á¨áá áĽá
á áŤáááłááĄ-
$ cd $(mktemp -d)
$ conftest pull 127.0.0.1:5000/amitsaha/opa-bundle-example:latest
áááľ áá፠á áááŤáá áá፠ááľáĽ ááłáŤá policy
á¨áááŞáŤ áááá˝áá á¨áŤááĄ-
$ tree
.
âââ policy
âââ check_image_registry.rego
áá¨áŤáá˝ á ááĽáł á¨áá¨ááťá áá¨ááá áá˝áááĄ-
$ conftest test --update 127.0.0.1:5000/amitsaha/opa-bundle-example:latest base-valid.yaml
..
FAIL - base-valid.yaml - image 'hashicorp/http-echo' doesn't come from my-company.com repository
2 tests, 1 passed, 0 warnings, 1 failure
áĽáá° á áááłá°á áá DockerHub áá á áá°á°áááᢠáľááá
á¨á°á áá áĽáŤáľáá áĽáá° áĽáľáá ááá áŠ
á¨á áá˛áá á
áááľ á°ááłáłá áá
áľá ááᲠáááŤáľ áĽá ááá˝ á¨áŽáááľ áŁá
áŞáŤáľ á áá á¨á áá ááá
áá˝ááá˘
6. áááŞáľ
á áá
á˝áá ááľáĽ á¨ááĽáŤáŤá á¨áá¨á¨áťá ááŁáŞáŤ áá
áááŞáľ á áááľá°á ááľáĽ ááŤá ááá á áľáĽáá ááľáá áááł áá áá ááťáá. áĽáá°áááąáľ á¨áŠá áááľáľ á áá¸áŁáŤááá˝á á áľáłáľáľá˛ááľ áĽáá˛á°ááľá áŤáľá˝áááłáá˘
á áľáĽáá ááľáá áááł áá á˛á°áŠ á áĽáŽ á¨á°á°áŠ áá¨áŤáá˝ áĽáá° á°á áááľ áĽá ááἠáááśá˝ (á¨áŠá¤-áá¤áľ áá á°ááłáłá) áŤá áŚáłáá˝á á¨áá¸áá á áᢠá á°á¨ááŞá, á¨áŤáľáá áá¨áŤáá˝ (áĽáá° config-lint, copper áĽá conftest) ááá á áá˝áá.
á áá á áááá, áááŞáľ á¨áááąá á¨ááłáŞáŤáá˝ ááľáŚá˝ áĽá áá˝á áŤáŁááŤá: á áĽáŽááἠáĽá áĽá áá¨áŤáá˝.
á áľáĽáá ááľáá áááł áá áááŞáľá áááŤá áá áá
áááá á˝áá á áá˝áá áľ áá, áľáŞáľ 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": [
/* дНиннŃĐš ŃпиŃОк */
]
}
áá áá
ááľ ááááá˘
áĽáá° kube-scoreᣠáááŞáľ á áá¸áŁáŤáá ááἠá°áááŽáá˝á áŁááááŁá¸á á áŤáŁá˘áá˝ ááłáŽá˝á áááŤááĄ-
- áááłáá˝ ááá á¨á¤á ááááŤáá˝ á¨áá.
- á¨ááŤáŁ ááľáá˝ áááŤáá˝ á áá°ááášáá˘
- ááŤáŁá áĽáá° áĽá áá áŤá.
- á¨áá á°á¨ áľááľáł áĽá á˛áአáĽáŤááá˝ áĽá áá°áŚá˝ á áá°ááášáá˘
áĽáŤááłááą áá°áᣠá áá¤áą áá á áááľá¨áľáŁ ááłáááľ á°á¨á ááá°áŁááĄ- ááľá ááá፠ááá á á°á. áľáááľ á áĽáŽááἠáá¨áŤáá˝ á¨á áá áááá
áĽáŁáá áááá¨áą
ááááŽá˝ á áľááá áŤááá áŁáá˛áŤáá ááĽááľ áá˝áá --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 Schema á°á á ááá˘
á¨áá¨á°áá ᨠ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 schema á áá áá. á áá áá°á ááľáĽ áŤáá ááá áá áápattern
á¨ááľáá ááá á¨ááááá áá áááááá áĽá á áá áááá.
á¨áá áŤááá áá¨áŤ ááááľ á¨áá¨á°ááá á¨áááŞáľ áá á ááá á áŤáľáááááłáá˘
checks:
checkImageRepo: danger
customChecks:
checkImageRepo:
successMessage: Image registry is valid
failureMessage: Image registry is not valid
category: Images
target: Container
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
pattern: ^my-company.com/.+$
(polaris-conf.yaml
)
áááá áĽáá°áá°ááĄ-
- á ááľá ááľáĽ
checks
áá°ááá˝ áĽá á¨áĽááą ááłáááľ á°á¨á á¨áłáá áá¸á. ááľá á¨áááłáá ááá á˛áá°áľ ááľá ááá፠ááá á áľááááá áĽáá á°á¨ááá áĽáááááádanger
. - áá°áá áŤáą
checkImageRepo
á¨ááŤá á áĽáá ááľáĽ á°áááá§ácustomChecks
.
áááá á áľááἠáĽáá° custom_check.yaml
. á áá ááŽáĽ áľá˝ááá
polaris audit
áá¨áá፠á¨ááŤáľáááá YAML áááá ááá፠ááá˘
ááááľáśá˝áá áĽáááľá˝ base-valid.yaml
:
$ polaris audit --config custom_check.yaml --audit-path base-valid.yaml
áĄáľá polaris audit
á¨áá á¨á°ááá¸áá á¨á°á áá áá¨áŤ áĽáť áá áŤáŤáá°á áĽá á áá°áłáŤáá˘
ááľáá áŤáľá°áŤá¨á my-company.com/http-echo:1.0
, áááŞáľ á á°áłáŤ áááł áá áááá. á¨áááŚáš áá áŤáá ááááľáś á áľááľá ááĽáˇáᢠimage-valid-mycompany.yaml
.
á áá áĽáŤáá á¨áááłá: á áĽáŽ á¨á°á°áŠ áá¨áŤáá˝á á¨áĽá áá áĽáá´áľ áááľ ááťáá? á ááá! á áĽáŽ á¨á°á°áŤáá á¨áá°áť ááŞáá˝á áá° áá á ááá áá¨á áĽáť áŤáľáááááłáᢠá áá¤áąá, á¨áá¨á°ááá á á˝ áááľáłá.
checks:
cpuRequestsMissing: warning
cpuLimitsMissing: warning
# Other inbuilt checks..
# ..
# custom checks
checkImageRepo: danger # !!!
customChecks:
checkImageRepo: # !!!
successMessage: Image registry is valid
failureMessage: Image registry is not valid
category: Images
target: Container
schema:
'$schema': http://json-schema.org/draft-07/schema
type: object
properties:
image:
type: string
pattern: ^my-company.com/.+$
(config_with_custom_check.yaml
)
á¨á°áá á¨ááááŞáŤ ááá ááłá á áá˘
á áá¸áŁáŤáá áŤá¨ááᥠbase-valid.yaml
á áĽáŽ á¨á°á°áŠ áĽá áĽá áá¨áŤáá˝á á áá áá áľáááá áá áá áá˝áá-
$ polaris audit --config config_with_custom_check.yaml --audit-path base-valid.yaml
áááŞáľ á áĽáŽááἠáá¨áŤáá˝á á¨áĽá áá¨áŤáá˝ áá áŤáááᣠá áá á á¨áááąá ááááľ áááŚá˝á áŤáŁááŤáá˘
á áá á áŠá áĽáá° áŹá ááá ááŤáľááŞááľ áŤá áá áἠáááá ááááá˝á áá áá á áááťá áá áἠá¨á°áŤáá áá¨áŤáá˝ áĽááłááá አá¨áááľáĽ ááááŤáľ ááá áá˝ááá˘
áľá áááŞáľ á°á¨á᪠áá¨á á áá ááááá˘
áá áááŤ
á¨áŠá áááľáľ YAML áááá˝á áááááá áĽá áááááá áĽá ááłáŞáŤáá˝ á˘ááŠáᣠáá°áááš áĽáá´áľ áĽáá°áááá áĽá áĽáá°ááá¸á ááá˝ á¨áá áááᤠááááľ á áľááá áá.
áááłá áŤá á, á á§á᧠ááľáĽ á¨ááŤáá á¨áŠá áááľáľ ááááŤáá˝á á¨áá°áą áŠá¤áŤá á áĽáá°áá á áááľ á§á᧠ááľáĽ á¨ááááŞáŤá áĽááá ááá áá˝áá. á¨ááá ááşáὠᨠKubernetes API ááľá áá ááľáááłá¸áá áá¨áłá°ááá˘
áĽáá°áá á áááľ áááá á áá´ á¨á°á áááᣠá ááľ á°á áá° ááľáĽáľáĽ áá°ááá˝ áá¸ááá áá˝ááᣠáááłá áá°á á ááἠá°áááŽáá˝á áĽá á¨á°áá°á ááá˛áá˝á ááá áᢠáá áŠá¤-áá¤áľ áĽá áááŞáľ á áá ááá á¨áááĄá áľ ááá˘
ááľáĽáľáĽ ááľáááśá˝ ááá¸á áĽá áá°ááá˝á á áááá áá ááľ áááŤáľáááá¸á ááłáĽ ᣠconfig-lint áĽá conftest á°áľáá áááá.
Conftest áĽá config-lint áĽá áá¨áŤáá˝á ááááá˝ YAML áá áááᣠáĽá ááłáĽ áá á¨ááŽááŤá á ááŁáĽ ááá ááłá¨áť áá°áĽááłáᣠáá á ááá áá፠áŤá°ááááá˘
á áá á áŠá ᣠá¨áĽááá ááłáŞáŤáá˝ ááľáĽ á ááąá áá áá áĽá ᣠáľáááá áááá áá¨áŤáá˝ á áĽá ááá á ᣠááá áááŞáľá ááá¨áĽ áĽá ááĽáą á¨ááŤáľááááá áĽáť áá¨á á áá áá? ááá áĽáŤá ááá ááá˝ áááľ á¨áá.
á¨áá á áłá˝ áŤáá á°áá á¨áĽ á¨áĽáŤááłááąá ááłáŞáŤ á áá ááá፠áá°áŁá-
ááŁáŞáŤ
ááá
á˝ááŽá˝
á¨á°á áá áá¨áŤáá˝
áŠá¤áŤá
YAML á¨á°áá°á á¨á¤áá á ááľá áľáŞáľ á ááťá áŤá¨áááŁá
á¨á˛á áᲠáá ááľáŤáľ á áá°áťáá
á¨áá
áŠá¤-áá¤áľ
YAML á¨ááἠáááśá˝ á ááťá áá°ááľááá˘
áááááŤáá˝á áááá°á˝ á¨áĽááľáá Kubernetes API áľáŞáľ ááá¨áĽ á ááťáá
á¨áá
ááłáĽ
á YAML ááááŤáá˝ áĽá ááŤáľááŞááľ áá¨áŤáá˝á áááá á á á ááá áááá
ááá á áĽáŽ á¨á°á°áŠ áá¨áŤáá˝ á¨ááᢠá°áŤá á°ááśá˝
áŤ
áááá-lint
á YAML ááľáĽ á á°á°á¨á ááŤ-á°áŽá ááá ááľáĽ áá¨áŤáá˝á áááá á á á ááá ááááᢠá¨á°ááŤáŠ á¨áá
á á
áá¸áśá˝á áá°ááá (áááłá á´áŤááá)
ááá á¨á°ááá áá¨áŤáá˝ á¨áá. á áĽáŽááἠáá¨áááŤáá˝ áĽá á°ááŁáŤáľ á á áááá áá˝ááá˘
áŤ
áááľ
Rego (áአá¨áá áá
ááá) á áá áá á¨áŤáľáá áá¨áŤáá˝ áááá á ááááᢠá OCI á
áá
áŚá˝ á áŠá ááá˛áá˝á áááŤáľ ááá
áłá
ááá á áĽáŽ á¨á°á°áŠ áá¨áŤáá˝ á¨ááᢠáŹáá ááá á ááĽáᢠáááŞáŤáá˝á á˛áŤáľá Docker Hub á áá°áááá˘
áŤ
áááŞáľ
áááááá˝ YAML á¨áá°á á ááἠá°áááŽáá˝ áá ááááťáᢠJSON Schema á áá áá á¨áŤáľáá áá¨áŤáá˝ áĽáá˛ááĽáŠ ááá
áľáááłáá˘
á JSON Schema áá á¨á°áá á¨áą á¨áá¨áŤ á˝ááłáá˝ á á áááá áá˝ááá˘
áŤ
áĽááá ááłáŞáŤáá˝ áá° Kubernetes áááľá°á ááľá¨áľ áá áľááááá°á¨áą, áááŤá ááá áá¸á. á¨ááá áááá˝á áĽáá˛áŤáŁáŠ áĽá á ááŽáááśá˝ ááľáĽ ááááľáą áĽáŤááá˝ á°áŤá˛áá˝ ááŁá ááá˝ áĽáá˛á°áĄ áŤáľá˝áááłáá˘
PS á¨á°ááá
á áĽááá˝á áá áŤááĽáĄáĄ-
- ÂŤ
á¨áŠá áááľáľ áľáĽáľáŚá˝á á¤áá áááľá¨á áááŞáľ á áľá°ááá "; - ÂŤ
áŞá ᨠYAML áá á Kubernetes áľáá "; - ÂŤ
á¨ááá 7 áŽáá´ááá ááἠáááśá˝ Âť.
ááá: hab.com