แฒจแแแแจแแแ. แแแ แแแแ: K8s แแแ แแแแกแแแแก YAML แแแแคแแแฃแ แแชแแแแแก แแแแ แแ แ แแแแแแแแแก แแแแ, แแแแ แแแขแแแแขแฃแ แ แแแแแแแฌแแแแแก แกแแญแแ แแแแ แฃแคแ แ แแ แฃแคแ แ แแฅแขแฃแแแฃแ แ แฎแแแแ. แแ แแแแแฎแแแแแก แแแขแแ แแ แแ แ แแฎแแแแ แจแแแ แฉแแ แแ แกแแแฃแแ แแแแแฌแงแแแขแแแแแแแ แแ แแแแชแแแแกแแแแก, แแ แแแแ แแแแแแงแแแ Deployment, แ แแแแ แช แแแแแแแแ, แ แแแ แแแแฎแ, แ แแแแ แแฃแจแแแแแ แแกแแแ. แซแแแแแ แแแคแแ แแแขแแฃแแ แแฆแแแฉแแแ แแ แแแแแ แแแแแขแแ แแกแแแฃแแแแแแแก.
TL; DR: แแก แกแขแแขแแ แแแแ แแแก แแฅแแก แกแขแแขแแแฃแ แ แแแกแขแ แฃแแแแขแก Kubernetes YAML แคแแแแแแแก แแแกแแแแกแขแฃแ แแแแแ แแ แจแแกแแคแแกแแแแแ แกแแฃแแแแแกแ แแ แแฅแขแแแแกแ แแ แแแแฎแแแแแแแก แจแแกแแแแแแกแแ.
Kubernetes-แแก แแแขแแแ แแแแแ, แ แแแแ แช แฌแแกแ, แแแแแกแแแฆแแ แแแ YAML แแแแฃแแแแขแแแแก แกแแฎแแ. YAML-แแก แแ แ-แแ แแ แแ แแแแแแ แแ แแก แแแแแคแแกแขแแก แคแแแแแแก แจแแ แแก แจแแแฆแฃแแแแแแก แแ แฃแ แแแแ แแแแแแแก แแแแฃแกแขแแแแก แกแแ แแฃแแ.
แ แ แแแฎแแแแ, แแฃ แฃแแแ แแแแ แฌแแฃแแแแ, แ แแ แแแแกแขแแ แจแ แแแแแแแกแแแฃแแ แงแแแแ แกแฃแ แแแ แกแแแแ แ แแแกแขแ แแแแ แแแแแก?
แ แแแแ แจแแแแซแแแ แแแแแแแ แแแแชแแแแ แแแแแแแแแ, แ แแแแแแกแแช แแ แแฅแแ PodDisruptionBudgets แแแแกแขแแ แจแ แแแแแแแแ?
แกแขแแขแแแฃแ แ แขแแกแขแแ แแแแก แแแขแแแ แแชแแ แกแแจแฃแแแแแแก แแแซแแแแ แแแแแแแแแแแ แจแแชแแแแแแ แแ แแแแแขแแแแก แแแ แฆแแแแแแ แแแแแแแแ แแแแก แแขแแแแ. แแก แแ แแแก แแแ แแแขแแแก, แ แแ แ แแกแฃแ แกแแแแก แแแแแแ แขแแแแแ แกแฌแแ แ แแ แฃแกแแคแ แแฎแแ, แแ แฃแคแ แ แกแแแแ แแฃแแแ, แ แแ แฌแแ แแแแแแก แแแขแแแ แแแ แกแแฃแแแแแกแ แแ แแฅแขแแแแก แแแฐแงแแแแ.
Kubernetes แกแขแแขแแแฃแ แ YAML แคแแแแแก แแแกแแแฅแขแแ แแแแก แแแแกแแกแขแแแ แจแแแซแแแแ แแแแงแแก แจแแแแแ แแแขแแแแ แแแแแ:
- API แแแแแแแขแแ แแแ. แแ แแแขแแแแ แแแก แฎแแแกแแฌแงแแแแ แแแแฌแแแแแ YAML แแแแแคแแกแขแก Kubernetes API แกแแ แแแ แแก แแแแฎแแแแแแแก แจแแกแแแแแแกแแ.
- แแแ แขแแกแขแแ แแแ. แแ แแแขแแแแ แแแก แฎแแแกแแฌแงแแแแก แแแฐแงแแแแ แฃแกแแคแ แแฎแแแแแก แแแ แขแแกแขแแแ, แกแแฃแแแแแกแ แแ แแฅแขแแแแกแแแ แจแแกแแแแแแกแแแ แแ แ.แจ.
- แแแ แแแแฃแแ แแแแแแแขแแ แแแ. แแ แแแขแแแแ แแแก แฌแแ แแแแแแแแแแแแ แกแแจแฃแแแแแแก แแแซแแแแ แจแแฅแแแแ แกแแแแแ แขแแกแขแแแ แกแฎแแแแแกแฎแแ แแแแแ, แแแแแแแแแ, Rego แแ Javascript.
แแ แกแขแแขแแแจแ แฉแแแ แแฆแแฌแแ แ แแ แจแแแแแแ แแแ แแฅแแก แกแฎแแแแแกแฎแแ แแแกแขแ แฃแแแแขแก:
- แแฃแแแแแแ;
- แแฃแแ-แฅแฃแแ;
- แแแแคแแแฃแ แแชแแ-lint;
- แกแแแแแแซแ;
- แจแแฏแแแ แ;
- แแแแแ แแกแ
แแแ, แแแแแฌแงแแ!
แแแแแแแแแแก แจแแแแฌแแแแ
แกแแแแ แแแกแขแ แฃแแแแขแแแแก แจแแแแ แแแแก แแแแแฌแงแแแ, แแแแแ แจแแแฅแแแแ แแแ แแแแฃแแ แคแแแ, แ แแแแแแแแแช แจแแแแแแฌแแแ แแกแแแ.
แฅแแแแแ แแแงแแแแแแ แแแแแคแแกแขแ แจแแแชแแแก แฃแแแ แแ แจแแชแแแแแก แแ แกแแฃแแแแแกแ แแ แแฅแขแแแแกแแแ แจแแฃแกแแแแแแแแก: แ แแแแแแ แแแแแแแแก แแแแแ แจแแแแซแแแแ?
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector:
matchLabels:
app: http-echo
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo
(base-valid.yaml
)
แฉแแแ แแแแแแแงแแแแแ แแ YAML-แก แกแฎแแแแแกแฎแแ แฎแแแกแแฌแงแแแแแก แจแแกแแแแ แแแแแ.
แแแแแ แแแงแแแแแแ แแแแแคแแกแขแ
base-valid.yaml
แแ แกแฎแแ แแแแแคแแกแขแแแ แแ แกแขแแขแแแแแ แจแแแแซแแแแ แแฎแแแแ แแฅGit แกแแชแแแแแ .
แแแแแคแแกแขแ แแฆแฌแแ แก แแแ แแแแแแแชแแแก, แ แแแแแก แแแแแแ แ แแแแชแแแแ แแแกแฃแฎแแก แแแชแแแ โHello Worldโ แแแ แข 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)
แฌแแ แแแขแแแแก แจแแแแฎแแแแแจแ, kubeval แแแแแแ แแแกแแกแแแแแ แแแแแ 0. แจแแแแซแแแแ แจแแแแแฌแแแ แแแ แจแแแแแแแแแ แแ:
$ echo $?
0
แแฎแแ แแชแแแแ แแฃแแแแแแ แกแฎแแ แแแแแคแแกแขแแ:
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo
(kubeval-invalid.yaml
)
แจแแแแซแแแแ แแ แแแแแแแก แแแแแแ แแแแแฎแแ? แแแแแฌแงแแ:
$ kubeval kubeval-invalid.yaml
WARN - kubeval-invalid.yaml contains an invalid Deployment (http-echo) - selector: selector is required
PASS - kubeval-invalid.yaml contains a valid Service (http-echo)
# ะฟัะพะฒะตัะธะผ ะบะพะด ะฒะพะทะฒัะฐัะฐ
$ echo $?
1
แ แแกแฃแ แกแ แแ แแ แแก แแแแแฌแแแแฃแแ.
แแแแแแแแแ API แแแ แกแแแก แแแแแงแแแแแแ apps/v1
, แฃแแแ แจแแแชแแแแแก แแแแแ แฉแแแแแก, แ แแแแแแช แแแแฎแแแแ แแแแแก แแขแแแแขแก. แแแแแ แแแงแแแแแแ แแแแแคแแกแขแ แแ แจแแแชแแแก แแแแแ แฉแแแแแก, แแแแขแแ แแฃแแแแแแแ แจแแแขแงแแแแแ แจแแชแแแแ แแ แแแแแแ แแ แแแฃแแแแแแ แแแแแ.
แแแแแขแแ แแกแแแก แ แ แแแฎแแแแ, แแฃ แแแแแแแแแ kubectl apply -f
แแ แแแแแคแแกแขแแแ แแ แแแ?
แแแ, แแชแแแแ:
$ kubectl apply -f kubeval-invalid.yaml
error: error validating "kubeval-invalid.yaml": error validating data: ValidationError(Deployment.spec):
missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors,
turn validation off with --validate=false
แแก แแ แแก แแฃแกแขแแ แแก แจแแชแแแแ, แ แแแแช แแฃแแแแแแแ แแแแคแ แแฎแแแ. แแแแก แแแแแกแฌแแ แแแ แจแแแแซแแแแ แกแแแแฅแขแแ แแก แแแแแขแแแแ:
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector: # !!!
matchLabels: # !!!
app: http-echo # !!!
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo
(base-valid.yaml
)
แแฃแแแแแแแก แแกแแแแกแ แฎแแแกแแฌแงแแแแแก แฃแแแ แแขแแกแแแ แแก แแ แแก, แ แแ แแกแแแแกแ แจแแชแแแแแแแก แแแคแแฅแกแแ แแแ แจแแกแแซแแแแแแแ แแแแแแแแแแก แชแแแแแก แแแกแแฌแงแแกแจแ.
แแแ แแ แแแแกแ, แแก แจแแแแฌแแแแแแ แแ แกแแญแแ แแแแก แฌแแแแแแก แแแแกแขแแ แแ; แแแแ แจแแกแ แฃแแแแ แจแแกแแซแแแแแแแ แแคแแแแแจแ.
แแแแฃแแแกแฎแแแแแ, kubeval แแแแฌแแแแก แ แแกแฃแ แกแแแก แฃแแฎแแแกแ Kubernetes API แกแฅแแแแก แแแฎแแแแแ. แแฃแแชแ, แฃแแแขแแก แจแแแแฎแแแแแจแ แจแแแซแแแแ แแแแญแแ แแแ แแฃแแแ แแแขแแก แแแแแ แแขแฃแแ แแแแแจแแแแแก แจแแแแฌแแแแ. แแก แจแแแซแแแแ แแแแแแแแก แแ แแจแแก แแแแแงแแแแแแ --kubernetes-version
:
$ kubeval --kubernetes-version 1.16.1 base-valid.yaml
แแแฎแแแ แแแแแแแแแกแฌแแแแ, แ แแ แแแ แกแแ แฃแแแ แแงแแก แแแแแแแแฃแแ แคแแ แแแขแจแ Major.Minor.Patch
.
แแแ แกแแแแแก แกแแแกแแแแก, แ แแแแแแแกแแแแกแแช แแแแแกแขแฃแ แแแ แแฎแแ แแแญแแ แแแแ, แแแฎแแแ, แแฎแแแแ --schema-location
.
แชแแแแแฃแแ YAML แคแแแแแแแก แแแ แแ, kubeval-แก แแกแแแ แจแแฃแซแแแ แแแฃแจแแแก แแแ แแฅแขแแ แแแแแแ แแ stdin-แแแ.
แแแ แแ แแแแกแ, แแฃแแแแแแ แแแแแแแ แแแขแแแ แแ แแแแ CI แแแแกแแแแแจแ. แแแกแแช แกแฃแ แก แขแแกแขแแแแก แแแจแแแแ แแแแแคแแกแขแแแแก แแแแกแขแแ แจแ แแแแแแแแแแแ แแแฎแแ แฃแแ แแฅแแแแ แแชแแแแก, แ แแ kubeval แแฎแแ แก แฃแญแแ แก แกแแ แแแแแแแแแ แคแแ แแแขแก:
- แฒฉแแแฃแแแแ แแแ แขแแฅแกแขแ;
- JSON;
- แจแแแแแฌแแแ แ แแแแ แแ แแขแแแแแ (TAP).
แแ แแแแแกแแแแ แ แคแแ แแแขแ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แแแแแแแแแแ แจแแแแแแแ แแแแแแแแกแแแแก แกแแกแฃแ แแแแ แขแแแแก แจแแแแแแแแก แจแแฏแแแแแแก แจแแกแแฅแแแแแแ.
kubeval-แแก แแ แ-แแ แแ แแแแแ แแ แแก แแก, แ แแ แแแแแแแ แแแก แแ แจแแฃแซแแแ แจแแแแแฌแแแก แจแแกแแแแแแกแแแ แแแ แแแแฃแแ แ แแกแฃแ แกแแแแก แแแแแแ แขแแแแแแแ (CRD). แแฃแแชแ, แจแแกแแซแแแแแแแ kubeval-แแก แแแแคแแแฃแ แแชแแ
Kubeval แแ แแก แจแแกแแแแจแแแแ แแแกแขแ แฃแแแแขแ แ แแกแฃแ แกแแแแก แจแแแแฌแแแแแกแ แแ แจแแคแแกแแแแกแแแแก; แแฃแแชแ, แฎแแแแแกแแแ แฃแแแ แแฆแแแแจแแแก, แ แแ แขแแกแขแแก แฉแแแแ แแแ แแ แแซแแแแ แแแ แแแขแแแก, แ แแ แ แแกแฃแ แกแ แจแแแกแแแแแแแ แกแแฃแแแแแกแ แแ แแฅแขแแแแก.
แแแแแแแแแ, แขแแแแก แแแแแงแแแแแแ latest
แแแแขแแแแแ แจแ แแ แจแแแกแแแแแแแ แกแแฃแแแแแกแ แแ แแฅแขแแแแก. แแฃแแชแ, แแฃแแแแแแ แแแแก แจแแชแแแแแ แแ แแแแฉแแแแก แแ แแ แแชแแแแแแก. แแแฃ, แแกแแแ YAML-แแก แจแแแแฌแแแแ แแแกแ แฃแแแแแ แแแคแ แแฎแแแแแแก แแแ แแจแ.
แแแแ แแ แ แ แแแฎแแแแ, แแฃ แแกแฃแ แ แจแแแคแแกแแ YAML แแ แแแแแแแแแ แแกแแแ แแแ แฆแแแแแแ, แ แแแแ แแชแแ แขแแแ latest
? แ แแแแ แจแแแแแแฌแแ YAML แคแแแแ แกแแฃแแแแแกแ แแ แแฅแขแแแแก แฌแแแแแฆแแแแ?
2. แแฃแแ-แกแแแ
- แแแแขแแแแแ แแก แแแจแแแแ แแ แ แ แแแแ แช root.
- แแแแแก แฏแแแแ แแแแแแแก แจแแแแฌแแแแแก แฎแแแแแกแแฌแแแแแแแ.
- แ แแกแฃแ แกแแแแก แแแแฎแแแแแแแกแ แแ แแแแแขแแแแก แแแงแแแแแ.
แขแแกแขแแก แจแแแแแแแแก แแแฎแแแแแ, แกแแแ แจแแแแแแ แแแชแแแฃแแ: 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 แแแฃแแแแแแก แจแแแแแ แฎแแ แแแแแแแ:
- แแแแแงแแคแแแก แจแแแแฌแแแแ แแ แแ แแก แแแแคแแแฃแ แแ แแแฃแแ.
- แแ แแ แกแแแแแก แแแแฎแแแแแแ แแ แจแแแฆแฃแแแแแ CPU แ แแกแฃแ แกแแแกแ แแ แแแฎแกแแแ แแแแแ.
- แแแแแก แจแแคแแ แฎแแแแก แแแฃแฏแแขแ แแ แแ แแก แแแแแแแแฃแแ.
- แแ แแ แกแแแแแก แแแแชแแแแแแแแแก แฌแแกแแแ (แแแขแ-แแคแแแฃแ แแแ) แฎแแแแแกแแฌแแแแแแแแก แแแฅแกแแแแแฃแ แแ แแแแ แแแก แแแแแแ.
- แแแแขแแแแแ แ แแฃแจแแแแก แคแแกแแแก แกแแฎแแ.
แแก แแ แแก แงแแแแ แแแ แแแแฃแแ แแฃแแฅแขแ แฎแแ แแแแแแแก แจแแกแแฎแแ, แ แแแแแแแช แฃแแแ แแฆแแแแคแฎแแ แแก แแแแกแแแแแก, แ แแ แแแแแแแแแ แฃแคแ แ แแคแแฅแขแฃแ แ แแ แกแแแแแแ แแแฎแแแก.
แแฃแแแ kube-score
แแฉแแแแแแก แแแคแแ แแแชแแแก แแแแแแแแแกแแแแแก แฌแแกแแแแแฎแแ, แงแแแแ แขแแแแก แแแ แฆแแแแแก แฉแแแแแแ แแแคแ แแฎแแแแแ ะธ แแ แแขแแแฃแแ, แ แแช แซแแแแแ แแฎแแแ แแแ แแแแแแแแ แแแแก แแ แแก.
แแแ, แแแกแแช แกแฃแ แก แแแแแแงแแแแก แแก แแแกแขแ แฃแแแแขแ CI แแแแกแแแแแจแ, แจแแฃแซแแแ แฉแแ แแแก แฃแคแ แ แจแแแฃแแจแฃแแ แแแแแแแแแแ แแ แแจแแก แแแแแงแแแแแแ --output-format ci
(แแ แจแแแแฎแแแแแจแ, แแกแแแ แแแฉแแแแแแแ แขแแกแขแแแ แจแแแแแแ OK):
$ kube-score score base-valid.yaml --output-format ci
[OK] http-echo apps/v1/Deployment
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU limit is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Memory limit is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU request is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Memory request is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Image with latest tag
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: The pod does not have a matching network policy
[CRITICAL] http-echo apps/v1/Deployment: Container is missing a readinessProbe
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Container has no configured security context
[CRITICAL] http-echo apps/v1/Deployment: No matching PodDisruptionBudget was found
[WARNING] http-echo apps/v1/Deployment: Deployment does not have a host podAntiAffinity set
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service
Kubeval-แแก แแกแแแแกแแ, kube-score แแแ แฃแแแแก แแ แ-แแฃแแแแแ แแแแแกแแแแก แแแแก, แ แแแแกแแช แแ แแก แขแแกแขแ, แ แแแแแแช แแแ แฉแแฃแแแ แแแแ แแ แแขแแแฃแแ. แแฅแแแ แแกแแแ แจแแแแซแแแแ แฉแแ แแแ แแกแแแแกแ แแแแฃแจแแแแแ แแแคแ แแฎแแแแแ.
แแแ แแ แแแแกแ, แจแแกแแซแแแแแแแ แ แแกแฃแ แกแแแแก แจแแแแฌแแแแ แกแฎแแแแแกแฎแแ API แแแ แกแแแแแแ แจแแกแแแแแแกแแแแกแแแแก (แ แแแแ แช kubeval-แจแ). แแฃแแชแ, แแก แแแคแแ แแแชแแ แแงแแ แ แแแแแ แแแฃแแแ แแแแแ kube-score-แจแ: แแฅแแแ แแ แจแแแแซแแแแ แแแ แฉแแแ Kubernetes-แแก แกแฎแแ แแแ แกแแ. แแก แจแแแฆแฃแแแ แจแแแซแแแแ แแงแแก แแแแ แแ แแแแแแ, แแฃ แแฅแแแ แแแแ แแแ แแฅแแแแ แแแแกแขแแ แแก แแแแแฎแแแแแก แแ แแฃ แแแฅแแ แแ แแแแแ แแแแกแขแแ แ K8-แแก แกแฎแแแแแกแฎแแ แแแ แกแแแ.
แแแฎแแแ แแแแแแแแแกแฌแแแแ, แ แแ
แฃแแแ แแ แแก แแ แแแแแแ แแ แจแแกแแซแแแแแแแแก แ แแแแแแแชแแแก แฌแแแแแแแแแแ.
แแแแแขแแแแแ แแแคแแ แแแชแแ kube-score-แแก แจแแกแแฎแแ แจแแแแซแแแแ แแฎแแแแ แแฅ
Kube-score แขแแกแขแแแ แจแแกแแแแจแแแแ แแแกแขแ แฃแแแแขแแ แกแแฃแแแแแกแ แแ แแฅแขแแแแก แแแแกแแฎแแ แชแแแแแแแแ, แแแแ แแ แ แ แแแฎแแแแ, แแฃ แขแแกแขแจแ แชแแแแแแแแแแก แจแแขแแแ แแ แกแแแฃแแแ แ แฌแแกแแแแก แแแแแขแแแ แแญแแ แแแแแ? แกแแแฌแฃแฎแแ แแ, แแแแก แแแแแแแแ แจแแฃแซแแแแแแแ.
Kube-score แแ แแ แแก แแแคแแ แแแแแฃแแ: แแฅแแแ แแ แจแแแแซแแแแ แแแแแแขแแ แแแกแจแ แแแแแขแแแ แแ แจแแชแแแแแ แแกแแแ.
แแฃ แแฅแแแ แแญแแ แแแแแ แแแ แกแแแแแฃแ แ แขแแกแขแแแแก แแแฌแแ แ แแแแแแแแแก แแแแแขแแแแแแแ แจแแกแแแแแแกแแแแก แจแแกแแแแฌแแแแแแ, แจแแแแซแแแแ แแแแแแงแแแแ แจแแแแแแ แแแฎแ แฎแแแกแแฌแงแแแแ แแ แ-แแ แแ: config-lint, แกแแแแแแซแ, confest แแ polaris.
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
แแแแแฃแแแแแแแ แแแแฎแแแ แแแแแก แขแแกแขแแแแก แแแกแแงแแแแแแแ.
แแแฅแแแ, แแกแฃแ แ แแแ แฌแแฃแแแแ, แ แแ 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 แแ แแก แแแ แกแแแฅแขแแฃแแ แฉแแ แฉแ, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แจแแฅแแแแ แกแแแฃแแแ แ แขแแกแขแแแ Kubernetes YAML แแแแแคแแกแขแแแแก แแแกแแแแกแขแฃแ แแแแแ YAML DSL-แแก แแแแแงแแแแแแ.
แแแแ แแ แ แ แแแฎแแแแ, แแฃ แฃแคแ แ แ แแฃแแ แแแแแแ แแ แขแแกแขแแแ แแญแแ แแแแแ? แแ แแ แแก YAML แซแแแแแ แจแแแฆแฃแแฃแแ แแแแกแแแแก? แ แ แแแฎแแแแ, แแฃ แจแแซแแแแ แขแแกแขแแแแก แจแแฅแแแแก แแ แแแ แแแแ แแแแก แกแ แฃแ แแแแแ?
4. แกแแแแแแซแ
แแฃแแชแ, แแก แแแแกแฎแแแแแแแ แแ แฃแแแแแกแแแแแแกแแแ แแแแ, แ แแ แแก แแ แแงแแแแแก YAML-แก แขแแกแขแแแแก แแฆแกแแฌแแ แแ. แขแแกแขแแแ แจแแแซแแแแ แแแแฌแแ แแก JavaScript-แจแ. แกแแแแแแซแ แฃแแ แฃแแแแแงแแคแก แแแแแแแแแแแก แ แแแแแแแแ แซแแ แแแแแ แฎแแแกแแฌแงแแแแแ, แ แแแแแแช แแแแแฎแแแ แแแแ แฌแแแแแแฎแแ แแแคแแ แแแชแแ Kubernetes แแแแแฅแขแแแแก แจแแกแแฎแแ แแ แจแแแขแงแแแแแแ แจแแชแแแแแแ.
แกแแแแแแซแแก แแแงแแแแแแก แแแแแฏแแแ แจแแแแซแแแแ แแฎแแแแ แแฅ
2.0.1 แแ แแก แแ แแ แแแ แแแแก แฃแแฎแแแกแ แแแแแจแแแแ แแ แแแแแแแฃแ แ แกแขแแขแแแก แแแฌแแ แแก แแ แแก.
Config-lint-แแก แแกแแแแกแแ, Copper-แก แแ แแฅแแก แฉแแจแแแแแฃแแ แขแแกแขแแแ. แแแแฌแแ แแ แแ แแ. แแแแชแแ แกแแจแฃแแแแแ แจแแแแแฌแแแก, แ แแ แแแแแแแแแ แแงแแแแแก แแแแขแแแแแ แแแแก แกแฃแ แแแแแก แแฅแกแแแฃแแแฃแ แแ แกแแแแ แกแแชแแแแแแแแ, แ แแแแ แแชแแ my-company.com
.
แจแแฅแแแแแ แคแแแแ check_image_repo.js
แจแแแแแแ แจแแแแแ แกแแ:
$$.forEach(function($){
if ($.kind === 'Deployment') {
$.spec.template.spec.containers.forEach(function(container) {
var image = new DockerImage(container.image);
if (image.registry.lastIndexOf('my-company.com/') != 0) {
errors.add_error('no_company_repo',"Image " + $.metadata.name + " is not from my-company.com repo", 1)
}
});
}
});
แแฎแแ แจแแแแแแฌแแแ แฉแแแแ แแแแแคแแกแขแ base-valid.yaml
, แแแแแแงแแแแ แแ แซแแแแแ copper validate
:
$ copper validate --in=base-valid.yaml --validator=check_image_tag.js
Check no_company_repo failed with severity 1 due to Image http-echo is not from my-company.com repo
Validation failed
แแแกแแแแแแ, แ แแ แกแแแแแแซแแก แแแฎแแแ แแแแ แจแแแแซแแแแ แฃแคแ แ แ แแฃแแ แขแแกแขแแแแก แฉแแขแแ แแแ - แแแแแแแแแ, แแแแแแแก แกแแฎแแแแแแก แจแแแแฌแแแแ Ingress แแแแแคแแกแขแแแจแ แแ แแ แแแแแแแแ แแแฃแ แ แแแแแจแ แแแจแแแแฃแแ แแแแแแแก แฃแแ แงแแคแ.
แกแแแแแแซแก แแฅแแก แแแกแจแ แฉแแจแแแแแฃแแ แกแฎแแแแแกแฎแแ แกแแกแแ แแแแแ แคแฃแแฅแชแแแแ:
DockerImage
แแแแฎแฃแแแแก แแแแแแแแฃแ แจแแงแแแแแก แคแแแแก แแ แฅแแแแก แแแแแฅแขแก แจแแแแแแ แแขแ แแแฃแขแแแแ:name
- แกแฃแ แแแแก แกแแฎแแแ,tag
- แกแฃแ แแแแก แขแแแ,registry
- แแแแแกแแฎแฃแแแแแก แ แแแกแขแ แ,registry_url
- แแฅแแ (https://
) แแ แแแแแกแแฎแฃแแแแแก แ แแแกแขแ แ,fqin
- แกแฃแ แแแแก แกแ แฃแแ แแแแแแ แแแแ.
- แคแฃแแฅแชแแ
findByName
แแฎแแแ แแแ แ แแกแฃแ แกแแก แแแแแ แแแชแแแฃแแ แขแแแแก แแแฎแแแแแ (kind
) แแ แกแแฎแแแ (name
) แจแแงแแแแแก แคแแแแแแแ. - แคแฃแแฅแชแแ
findByLabels
แแแแแฎแแแ แแแแ แแแแแแ แ แแกแฃแ แกแ แแแแแแแแฃแแ แขแแแแก แแแฎแแแแแ (kind
) แแ แแขแแแแขแแแ (labels
).
แแฅแแแ แจแแแแซแแแแ แแแฎแแ แงแแแแ แฎแแแแแกแแฌแแแแแ แกแแ แแแกแแก แคแฃแแฅแชแแ
แแแแฃแแแกแฎแแแแแ, แแก แแขแแแ แแแแ แแแแแ แจแแงแแแแแก YAML แคแแแแ แชแแแแแจแ $$
แแ แฎแแแก แแแก แฎแแแแแกแแฌแแแแแก แกแแ แแแขแแ แแแแกแแแแก (แแแชแแแแ แขแแฅแแแแ jQuery แแแแแชแแแแแแแก แแฅแแแแแแแแแก).
Copper-แแก แแแแแแ แ แฃแแแ แแขแแกแแแ แแจแแแ แแ: แแฅแแแ แแ แแญแแ แแแแแ แกแแแชแแแแแแแแฃแแ แแแแก แแแฃแคแแแแ แแ แจแแแแซแแแแ แแแแแแงแแแแ JavaScript-แแก แกแฎแแแแแกแฎแแ แคแฃแแฅแชแแแแ แกแแแฃแแแ แ แขแแกแขแแแแก แจแแกแแฅแแแแแแ, แ แแแแ แแชแแ แกแแแแแแแแ แแแขแแ แแแแแชแแ, แคแฃแแฅแชแแแแ แแ แ.แจ.
แแกแแแ แฃแแแ แแฆแแแแจแแแก, แ แแ Copper-แแก แแแแแแแแแแแ แแแ แกแแ แแฃแจแแแแก JavaScript แซแ แแแแก ES5 แแแ แกแแแ แแ แแ แ ES6.
แแแขแแแแแ แฎแแแแแกแแฌแแแแแแ แแแกแแแแ แแแ
แแฃแแชแ, แแฃ แแแแแแแแแ แแ แแแแฌแแแ JavaScript แแ แฃแแแ แแขแแกแแแแก แแแแญแแแ แแแแก, แ แแแแแแช แกแแแชแแแแฃแ แแ แแ แแก แจแแแฃแจแแแแแฃแแ แแแแฎแแแแแแแก แจแแกแแฅแแแแแแ แแ แแแแแขแแแแก แแฆแฌแแ แแกแแแแก, แงแฃแ แแแฆแแแ แฃแแแ แแแแฅแชแแแ แแแแแฃแ แกแก.
5.แแแแแฃแ แกแ
Conftest แแ แแก แฉแแ แฉแ แแแแคแแแฃแ แแชแแแก แแแแแชแแแแแแก แจแแกแแแแฌแแแแแแ. แแกแแแ แจแแกแแคแแ แแกแแ 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
แขแแกแขแ แกแแแแ แแฃแแแ แฉแแแจแแแ, แ แแแแแ แกแฃแ แแแแแ แแแแแแ แแ แแกแแแแ แฌแงแแ แแแแ.
Rego แคแแแแจแ แฉแแแ แแแแแกแแแฆแแ แแแ แแแแแก deny
. แแแกแ แกแแแแ แแแ แแแ แฆแแแแแ แแแแแแแ. แแฃ แแแแแแแก deny
แ แแแแแแแแ, แแแแแฃแ แกแ แแแแฌแแแแก แแแ แแ แแแแแแแแกแแแ แแแแแฃแแแแแแแแ แแ แแแแแกแแแแ แ แแแแแแก แกแแแแ แแแ แแแแแฎแแแแแ แ แแแแ แช แแแ แฆแแแแ.
แแแแฃแแแกแฎแแแแ แจแแแแแแก แแแ แแ, confest แแฎแแ แก แฃแญแแ แก JSON, TAP แแ แชแฎแ แแแแก แคแแ แแแขแก - แฃแแแแฃแ แแกแแ แกแแกแแ แแแแแ แคแฃแแฅแชแแ, แแฃ แแญแแ แแแแแ แแแแแ แแจแแแแก แฉแแกแแ แแ แกแแแฃแ CI แแแแกแแแแแจแ. แแฅแแแ แจแแแแซแแแแ แแแแงแแแแ แกแแกแฃแ แแแแ แคแแ แแแขแ แแ แแจแแก แแแแแงแแแแแแ --output
.
แแแแแขแแแแก แแแแแ แแแแก แแแกแแแแแแแแแแแ, แแแแแฃแ แกแก แแฅแแก แแ แแจแ --trace
. แแก แแฉแแแแแแก แแแแแก, แแฃ แ แแแแ แแแแแแแแแแก confest แแแแแแแแฃแ แแแแแขแแแแก แคแแแแแแก.
แแแแแฃแ แกแแก แฌแแกแแแ แจแแแซแแแแ แแแแแฅแแแงแแแแก แแ แแแแแแแ แแ OCI (Open Container Initiative) แ แแแกแขแ แแแจแ, แ แแแแ แช แแ แขแแคแแฅแขแแแ.
แแ แซแแแแแแแ push
ะธ pull
แกแแจแฃแแแแแแก แแแซแแแแ แแแแแแฅแแแงแแแ แแ แขแแคแแฅแขแ แแ แแแแฆแแ แแ แกแแแฃแแ แแ แขแแคแแฅแขแ แแแกแขแแแชแแฃแ แ แ แแแกแขแ แแแแ. แจแแแแชแแแแ แแแแแแแฅแแแงแแแ แฉแแแแก แแแแ แจแแฅแแแแแ แแแแแขแแแ แแแแแแแแ แแ Docker แ แแแกแขแ แจแ 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. Polaris
แแแแ แแแกแขแ แฃแแแแขแ, แ แแแแแแช แแ แกแขแแขแแแจแ แแฅแแแแ แแแแฎแแแฃแแ, แแ แแก
Polaris แจแแแซแแแแ แแแแแแขแแแแแก แแแแกแขแแ แจแ แแ แแแแแแงแแแแ แแ แซแแแแแแก แฎแแแแก แ แแแแแจแ. แ แแแแ แช แแฅแแแ แแแแแ แแแฎแแแแ, แแก แกแแจแฃแแแแแแก แแแซแแแแ แกแขแแขแแแฃแ แแ แแแแแแแแแแแ Kubernetes แแแแแคแแกแขแแแ.
แแ แซแแแแแแก แฎแแแแก แ แแแแแจแ แแฃแจแแแแแกแแก, แฎแแแแแกแแฌแแแแแแ แฉแแจแแแแแฃแแ แขแแกแขแแแ, แ แแแแแแแช แแแแชแแแก แแกแแ แกแคแแ แแแแก, แ แแแแ แแชแแ แฃแกแแคแ แแฎแแแแ แแ แกแแฃแแแแแกแ แแ แแฅแขแแแ (แแฃแแ-แฅแฃแแแก แแกแแแแกแ). แแแ แแ แแแแกแ, แแฅแแแ แจแแแแซแแแแ แจแแฅแแแแ แแฅแแแแ แกแแแฃแแแ แ แขแแกแขแแแ (แ แแแแ แช config-lint, copper แแ confest).
แกแฎแแ แกแแขแงแแแแแ แ แแ แแแฅแแแ, Polaris แแแ แแแแแแแก แแ แแแ แแแขแแแแ แแแก แฎแแแกแแฌแงแแแแแก แกแแ แแแแแแก: แฉแแจแแแแแฃแ แแ แแแ แแแแฃแ แขแแกแขแแแก.
Polaris แแ แซแแแแแแก แฎแแแแก แ แแแแแจแ แแแกแแงแแแแแแแ แแแแแแงแแแแ
แแ แแแแแแแฃแ แ แกแขแแขแแแก แแแฌแแ แแก แแ แแก แฎแแแแแกแแฌแแแแแแ 1.0.3 แแแ แกแแ.
แแแกแขแแแแชแแแก แแแกแ แฃแแแแแก แจแแแแแ แจแแแแซแแแแ แแแฃแจแแแ polaris แแแแแคแแกแขแแ 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-แแก แแกแแแแกแแ, Polaris แแแแกแแแฆแแ แแแก แกแแแแแฎแแแก แแ แกแคแแ แแแแจแ, แกแแแแช แแแแแคแแกแขแ แแ แแแแแงแแคแแแแแก แกแแฃแแแแแกแ แแ แแฅแขแแแแก:
- แแ แแ แกแแแแแก แฏแแแแ แแแแแแแก แจแแแแฌแแแแแแ แฌแแแฌแแแแกแแแแก.
- แแแแขแแแแแ แแก แกแฃแ แแแแแแก แขแแแแแ แแ แแ แแก แแแแแแแแฃแแ.
- แแแแขแแแแแ แ แแฃแจแแแแก แคแแกแแแก แกแแฎแแ.
- แแแฎแกแแแ แแแแกแ แแ แแ แแชแแกแแ แแก แแแแฎแแแแแแ แแ แแแแแขแแแ แแ แแ แแก แแแแแแแแฃแแ.
แแแแแแฃแ แขแแกแขแก, แแแกแ แจแแแแแแแแแแ แแแแแแแแแแ แ, แแแแญแแแ แแ แแขแแแฃแแแแแก แฎแแ แแกแฎแ: แแแคแ แแฎแแแแแ แแ แกแแคแ แแฎแ. แแแแแขแแแแแ แแแคแแ แแแชแแแกแแแแก แฎแแแแแกแแฌแแแแแ แฉแแจแแแแแฃแแ แขแแกแขแแแแก แจแแกแแฎแแ, แแแฎแแแ, แแฎแแแแ
แแฃ แแแขแแแแแ แแ แแ แแก แกแแญแแ แ, แจแแแแซแแแแ แแแฃแแแแแ แแ แแจแ --format score
. แแ แจแแแแฎแแแแแจแ, Polaris แแแแแกแชแแแก แ แแชแฎแแก, แ แแแแแแช แแแ แงแแแแก 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
แแแแแแงแแแแแ แแแแแกแแฎแฃแแแแแก แฌแงแแ แแก แจแแกแแแแ แแแแแ แกแแญแแ แ แฌแงแแ แแกแแแ.
แแแแแแฆแแแจแแฃแแ แขแแกแขแแก แแแกแแจแแแแแ, แแฅแแแ แฃแแแ แจแแฅแแแแ แจแแแแแแ Polaris แแแแคแแแฃแ แแชแแ:
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
, Polaris แฌแแ แแแขแแแแ แแแแกแ แฃแแแแก. แชแแแแแแแแแแก แแแแแคแแกแขแ แฃแแแ แจแแแแแ 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
Polaris แแแกแแแก แฉแแจแแแแแฃแ แขแแกแขแแแก แแแ แแแแฃแแ แขแแกแขแแแแ, แ แแแแช แแแ แแแแแแแก แแ แแแ แกแแแงแแ แแก แกแแฃแแแแแกแแก.
แแแแ แแก แแฎแ แแ, แฃแคแ แ แซแแแแ แ แแแแแแก แแแแแงแแแแแแก แฃแฃแแแ แแแ, แ แแแแ แแชแแ Rego แแ JavaScript, แจแแแซแแแแ แแงแแก แจแแแแฆแฃแแแแแ แคแแฅแขแแ แ, แ แแแแแแช แฎแแแก แฃแจแแแก แฃแคแ แ แแแฎแแแฌแแแ แขแแกแขแแแแก แจแแฅแแแแก.
แแแขแ แแแคแแ แแแชแแ Polaris-แแก แจแแกแแฎแแ แฎแแแแแกแแฌแแแแแแ แแฅ
แ แแแแฃแแ
แแแฃแฎแแแแแแ แแแแกแ, แ แแ แแ แกแแแแแก แแ แแแแแ แแแกแขแ แฃแแแแขแ Kubernetes YAML แคแแแแแแแก แจแแกแแแแฌแแแแแแ แแ แจแแกแแคแแกแแแแแ, แแแแจแแแแแแแแแแ แแฅแแแแแ แแแแคแแ แแแแแแ แแแแก แจแแกแแฎแแ, แแฃ แ แแแแ แจแแแแฃแจแแแแแก แแ แจแแกแ แฃแแแแแ แขแแกแขแแแ.
แแแแแแแแแ, แแฃ แแแฆแแแ แแฃแแแ แแแขแแก แแแแแคแแกแขแแแก, แ แแแแแแแช แแแแแก แแแแกแแแแแจแ, แแฃแแแแแแ แจแแแซแแแแ แแงแแก แแแ แแแแ แแแแแฏแ แแ แแแแกแแแแแจแ. แแก แแแแแขแ แแแแแก แจแแแกแแแแแแแ แแฃ แแ แ แแแแแฅแขแแแแก แแแแแแ แขแแแแแ Kubernetes API แกแฅแแแแก.
แแกแแแ แแแแฎแแแแแก แแแกแ แฃแแแแแก แจแแแแแ, แจแแแซแแแแ แแแแแแแแแก แฃแคแ แ แแแฎแแแฌแแ แขแแกแขแแแแ, แ แแแแ แแชแแ แกแขแแแแแ แขแฃแแ แกแแฃแแแแแกแ แแ แแฅแขแแแแกแ แแ แแแแแ แแขแฃแแ แแแแแขแแแแก แจแแกแแแแแแกแแแ. แกแฌแแ แแ แแฅ แแแแแแแแแ แแฃแแ-แกแแแ แ แแ แแแแแ แแกแ.
แแแแแแแก, แแแกแแช แแฅแแก แ แแฃแแ แแแแฎแแแแแแ แแ แกแญแแ แแแแ แขแแกแขแแแแก แแแขแแแฃแ แแ แแแ แแแแ, แกแแแแแแซแ, แแแแคแแแฃแ แแชแแ แแ แแแแคแแกแขแ แจแแกแแคแแ แแกแ แแฅแแแแ.
Conftest แแ config-lint แแงแแแแแก YAML-แก แแแ แแแแฃแแ แขแแกแขแแแแก แแแกแแแแแแแ, แฎแแแ แกแแแแแแซแ แแแซแแแแ แฌแแแแแแก แแ แแแ แแแแ แแแแก แกแ แฃแ แแแแแ, แ แแช แแแก แกแแแแแแ แแแแแแแแแ แแ แฉแแแแแก แฎแแแก.
แแแแ แแก แแฎแ แแ, แฆแแ แก แแฃ แแ แ แ แแแแแแแ แแ แฎแแแกแแฌแงแแก แแแแแงแแแแแ แแ, แจแแกแแแแแแกแแ, แงแแแแ แขแแกแขแแก แฎแแแแ แจแแฅแแแ, แแ แฃแแแ แแขแแกแแแ แแแแแแญแแ Polaris-แก แแ แแแแแแขแแ แแฎแแแแ แแก, แ แแช แกแแญแแ แแ? แแ แแแแฎแแแแ แแแแคแแ แแแกแฃแฎแ แแ แแ แกแแแแแก.
แฅแแแแแ แแแชแแแฃแ แชแฎแ แแแจแ แแแชแแแฃแแแ แแแแแแฃแแ แแแกแขแ แฃแแแแขแแก แแแแแ แแฆแฌแแ แ:
Tool
แแแแแแ
แจแแแฆแฃแแแแแ
แแแแฎแแแ แแแแแก แขแแกแขแแแ
แแฃแแแแแแ
แแแแฌแแแแก YAML แแแแแคแแกแขแแแก API แกแฅแแแแก แแแแแ แแขแฃแแ แแแ แกแแแก แแแฎแแแแแ
CRD-แแแ แแฃแจแแแแ แแ แจแแแซแแแแ
แแ แแ แแก
แแฃแแ-แฅแฃแแ
แแแแแแแแแแก YAML แแแแแคแแกแขแแแก แกแแฃแแแแแกแ แแ แแฅแขแแแแก แฌแแแแแฆแแแแ
แ แแกแฃแ แกแแแแก แจแแกแแแแฌแแแแแแ แแฅแแแแ Kubernetes API แแแ แกแแแก แแ แฉแแแ แจแแฃแซแแแแแแแ
แแ แแ แแก
แกแแแแแแซแแก
แแแแแแ แฉแแ แฉแ YAML แแแแแคแแกแขแแแแกแแแแก JavaScript แขแแกแขแแแแก แจแแกแแฅแแแแแแ
แแ แแ แแก แฉแแจแแแแแฃแแ แขแแกแขแแแ. แชแฃแแ แแแแฃแแแแขแแชแแ
แแแแฎ
แแแแคแแแฃแ แแชแแ-lint
แแแแแแ แฉแแ แฉแ แขแแกแขแแแแก แจแแกแแฅแแแแแแ แแแแแแแก แกแแแชแแคแแแฃแ แแแแแ, แ แแแแแแช แฉแแจแแแแแฃแแแ YAML-แจแ. แแฎแแ แก แฃแญแแ แก แกแฎแแแแแกแฎแแ แแแแคแแแฃแ แแชแแแก แคแแ แแแขแก (แแแ. Terraform)
แแแ แขแแกแขแแแ แแ แแ แกแแแแแก. แฉแแจแแแแแฃแแ แแขแแแชแแแแแ แแ แคแฃแแฅแชแแแแ แจแแแซแแแแ แแ แแงแแก แกแแแแแ แแกแ
แแแแฎ
แจแแฏแแแ แ
แฉแแ แฉแ Rego-แก แแแแแงแแแแแแ (แจแแแแแฎแแแก แกแแแชแแแแแแแแฃแแ แแแแก) แแแแแงแแแแแแ แกแแแฃแแแ แ แขแแกแขแแแแก แจแแกแแฅแแแแแแ. แกแแจแฃแแแแแแก แแซแแแแก แแแแแขแแแแก แแแแแแ แแแแก OCI แแแแแขแแแแก แแแจแแแแแแ
แแ แแ แแก แฉแแจแแแแแฃแแ แขแแกแขแแแ. แ แแแ แฃแแแ แแแกแฌแแแแ. Docker Hub แแ แแ แแก แแฎแแ แแแญแแ แแแ แฌแแกแแแแก แแแแแฅแแแงแแแแแกแแก
แแแแฎ
Polaris
แแแแแฎแแแแแแ YAML แแแแแแฎแแขแแแ แกแขแแแแแ แขแฃแแ แกแแฃแแแแแกแ แแ แแฅแขแแแแก แฌแแแแแฆแแแแ. แกแแจแฃแแแแแแก แแแซแแแแ แจแแฅแแแแ แแฅแแแแ แกแแแฃแแแ แ แขแแกแขแแแ JSON แกแฅแแแแก แแแแแงแแแแแแ
JSON Schema-แแ แแแคแฃแซแแแแฃแแ แขแแกแขแแก แจแแกแแซแแแแแแแแแ แจแแแซแแแแ แแ แแงแแก แกแแแแแ แแกแ
แแแแฎ
แแแแก แแแแ, แ แแ แแก แฎแแแกแแฌแงแแแแ แแ แแงแ แแแแแ แแฃแแแ แแแขแแก แแแแกแขแแ แแ แฌแแแแแแก, แแแแ แแแกแขแแแแชแแ แแแ แขแแแแ. แแกแแแ แกแแจแฃแแแแแแก แแแซแแแแ แแแคแแแขแ แแ แฌแงแแ แ แคแแแแแแ แแ แแแแฌแแแแ แกแฌแ แแคแ แแแแแฎแแแฃแ แแแ แแ แแแฅแขแแแจแ แแแแฎแแแแแก แแแขแแ แแแก.
PS แแแแ แแแแแแแกแแแ
แแกแแแ แฌแแแแแแฎแแ แฉแแแแก แแแแแแ:
- ยซ
Polaris แแแแแแ แแ Kubernetes-แแก แแแแกแขแแ แแแแก แฏแแแแ แแแแแแแก แจแแกแแแแ แฉแฃแแแแแแ "; - ยซ
Vim YAML แแฎแแ แแแญแแ แแ Kubernetes-แแกแแแแก "; - ยซ
แแแแขแแแแแ แแแแก แแแแแงแแแแแแก 7 แกแแฃแแแแแกแ แแ แแฅแขแแแ Google-แแก แแแฎแแแแแ ".
แฌแงแแ แ: www.habr.com