ááŸááºáá»ááºá áá¬áá¬ááŒááºâ K8s áááºáááºážáá»ááºáá»á¬ážá¡ááœáẠYAML ááœá²á·á ááºážááŸá¯áá¯á¶á á¶áá»á¬áž ááá¯ážááœá¬ážáá¬áááºááŸáá·áºá¡áá»áŸá áááºážááá¯á·á á¡ááá¯á¡áá»á±á¬áẠá¡áááºááŒá¯ááŒááºážá¡ááœáẠááá¯á¡ááºááŸá¯ááŸá¬ ááá¯á á¡áá±ážááŒá®ážáá¬áááºá á€áá¯á¶ážáááºáá»ááºááᯠáá±ážáá¬ážáá°ááẠá€áá¯ááºáááºážá¡ááœáẠááŸáááŒá®ážáá¬áž ááŒá±ááŸááºážáá»ááºáá»á¬ážááᯠááœá±ážáá»ááºáá¯á¶áá¬áá áááºážááá¯á· áááºááá¯á·áá¯ááºáá±á¬ááºáááºááᯠááŒáá·áºááŸá¯ááẠááŒáá·áºáá»ááºááŸá¯ááᯠááá°áá¬á¡ááŒá áºáááºáž á¡áá¯á¶ážááŒá¯áá²á·áááºá á€á¡ááŒá±á¬ááºážá¡áá¬ááᯠá áááºáááºá á¬ážáá°áá»á¬ážá¡ááœáẠá¡ááœááºá¡ááá¥á¬ááºáá±á¬ááºážáá¬áá«áááºá
TL; DR: á€áá±á¬ááºážáá«ážááẠKubernetes YAML ááá¯ááºáá»á¬ážááᯠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááŸáá·áº ááá¯á¡ááºáá»ááºáá»á¬ážááŸáá·áº ááŸááºááœá²á á¡áááºááŒá¯ááŒá®áž á¡áá²ááŒááºááẠstatic tools ááŒá±á¬ááºáá¯ááᯠááŸáá¯ááºážááŸááºáá¬ážáááºá
Kubernetes á¡áá¯ááºáá¬áááºáá»á¬ážááᯠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº YAML á
á¬ááœááºá
á¬áááºážáá¯á¶á
á¶ááŒáá·áº áááºááŸááºáááºá YAML áááŒá¿áá¬áá»á¬ážáá²ááŸáá
áºáá¯ááŸá¬ manifest ááá¯ááºáá»á¬ážááŒá¬ážááœáẠááá·áºáááºáá»ááºáá»á¬áž ááá¯á·ááá¯áẠáááºáá¶áá±ážáá»á¬ážááᯠáááºááŸááºáááºá¡áááºá¡áá²ááŒá
áºáááºá
á¡á á¯á¡áá±ážááá¯á· ááŒáá·áºáá»ááºáá¬ážáá±á¬ áá¯á¶áá»á¬ážá¡á¬ážáá¯á¶ážááẠáá¯á¶ááŒááºá áááºáá»ááá±á¬ ááŸááºáá¯á¶áááºááŒááºážá០áá¬ááŒá±á¬ááºáž áá±áá»á¬á á±ááẠááá¯á¡ááºáá«áá
PodDisruptionBudgets ááá«áá±á¬ ááŒáá·áºáá»ááºááŸá¯áá»á¬ážááᯠá¡á á¯á¡áá±ážááá¯á· áá±ážááá¯á·ááŒááºážá០áááºááá¯á·áá¬ážáá®ážááá¯ááºáááºáááºážá
áááºááŒáááºá ááºážáááºááŒááºážááá±á«ááºážá ááºááŒááºážááẠááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááá·áºááœáẠá¡ááŸá¬ážá¡ááœááºážáá»á¬ážááŸáá·áº áá°áá«ááá»áá¯ážáá±á¬ááºááŸá¯áá»á¬ážááᯠáá±á¬áºáá¯ááºááá¯ááºá á±áá«áááºá áááºážááẠá¡áááºážá¡ááŒá áºááá¯ááºáᬠá¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºáá»á¬ážááẠááŸááºáááºááŒá®áž áá¯á¶ááŒá¯á¶ááŒá±á¬ááºáž á¡á¬ááá¶áá»áẠááá¯ážáá¬á á±ááŒá®áž áá¯ááºáá¯ááºááŸá¯á¡áá¯ááºáá»á¬ážááẠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááᯠááá¯ááºáá¬ááá¯ááºááŒá±ááá¯áá»á¬ážá á±áááºá
Kubernetes static YAML ááá¯ááºá á áºáá±ážááŒááºážáá±áá áá áºá¡á¬áž á¡á±á¬ááºáá«á¡áá»áá¯ážá¡á á¬ážáá»á¬áž ááœá²ááŒá¬ážááá¯ááºáááº-
- API á¡áááºááŒá¯áá°áá»á¬áž. á€á¡áá»áá¯ážá¡á á¬ážááŸá áá°ážááºáá»á¬ážááẠKubernetes API áá¬áá¬áááá¯á¡ááºáá»ááºáá»á¬ážááŸáá·áº YAML áááºáá®ážáááºá áºááᯠá á áºáá±ážáá«á
- á¡áááºááá·áº á ááºážáááºáá°áá»á¬áž. á€á¡áá»áá¯ážá¡á á¬ážá០áááááá¬áá»á¬ážááẠáá¯á¶ááŒá¯á¶áá±ážá¡ááœáẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ á ááºážáááºááŸá¯áá»á¬ážá á¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááŸáá·áº ááá¯ááºáá¬ááŸá¯á áááºááŒáá·áº áá¬áá«áááºá
- á áááºááŒáá¯ááºá á áºáá±ážáá°áá»á¬áž. á€á¡áá»áá¯ážá¡á á¬ážá ááá¯ááºá á¬ážááŸááºáá»á¬ážááẠááá·áºá¡á¬áž áá¬áá¬á áá¬ážá¡áá»áá¯ážáá»áá¯ážááŒáá·áº á áááºááŒáá¯ááºá ááºážáááºááŸá¯áá»á¬ážááᯠáááºáá®ážááá¯ááºááẠá¥ááᬠRego ááŸáá·áº Javascriptá
á€áá±á¬ááºážáá«ážááœáẠááá°áá®áá±á¬ áááááá¬ááŒá±á¬ááºáá¯ááᯠááŸáá¯ááºážááŸááºáá±á¬áºááŒáá«áááºá
- kubeval;
- kube-áááŸááº;
- config-lint;
- ááŒá±ážáá®;
- ááŒáá¯ááºááá¯ááºááŸá¯;
- Polaris á
áá² á ááá¯ááºááŒáá¡á±á¬ááºá
ááŒáá·áºáá»ááºá á áºáá±ážááŒááºážá
áááááá¬áá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· áááŸáá¯ááºážááŸááºáá® áááºážááá¯á·ááᯠá ááºážáááºááẠáá±á¬ááºáá¶á¡áá»áá¯á·ááᯠáááºáá®ážááŒáá«á áá¯á·á
á¡á±á¬ááºáá±á¬áºááŒáá« á á¬á á±á¬ááºááœáẠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááŸáá·áº áááá¯ááºáá¬áá±á¬ á¡ááŸá¬ážá¡ááœááºážáá»á¬ážá áœá¬áá«ááŸááááº- áááºážááá¯á·áá²á០áááºáá»áŸááᯠáááºááŸá¬ááœá±á·ááá¯ááºáááºáááºážá
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector:
matchLabels:
app: http-echo
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo
(base-valid.yaml
)
ááá°áá®áá±á¬áááááá¬áá»á¬ážááᯠááŸáá¯ááºážááŸááºááẠဠYAML ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
á¡áááºáá«áá±á¬áºááŒáá»ááº
base-valid.yaml
ááŸáá·áº á€áá±á¬ááºážáá«ážá០á¡ááŒá¬ážáá±á¬áºááŒáá»ááºáá»á¬ážá¡á¬áž ááœááºááœá±á·ááá¯ááºáá«áááºáGit ááá¯ááŸá±á¬ááºááŸá¯áá»á¬áž .
áááºáá®ážáááºá áºááẠááááºáááºáž 5678 ááá¯á· âHello Worldâ áááºáá±á·áá»áºááŒáá·áº áá¯á¶á·ááŒááºááẠá¡ááááá¯ááºáá±á¬ááºáááá·áº áááºá¡ááá®áá±ážááŸááºážááᯠáá±á¬áºááŒáááºá áááºážááᯠá¡á±á¬ááºáá« command ááŒáá·áº á¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
kubectl apply -f hello-world.yaml
ááá¯á·ááŒá±á¬áá·áº - á¡áá¯ááºá¡á¬ážá á áºáá±ážáá«á
kubectl port-forward svc/http-echo 8080:5678
á¡áᯠááœá¬ážááá¯ááºáá«á
1. 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)
á¡á±á¬ááºááŒááºáá«á kubeval ááẠexit code 0 ááŒáá·áº ááœááºáá«áááºá áááºážááᯠá¡á±á¬ááºáá«á¡ááá¯ááºáž á á áºáá±ážááá¯ááºáá«áááºá
$ echo $?
0
ááœá²ááŒá¬ážáá±á¬ manifest ááŒáá·áº Kubeval ááᯠááá¯á ááºážááŒáá·áºááŒáá«á áá¯á·á
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: hashicorp/http-echo
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
name: http-echo
spec:
ports:
- port: 5678
protocol: TCP
targetPort: 5678
selector:
app: http-echo
(kubeval-invalid.yaml
)
ááŒá¿áá¬ááᯠáá»ááºáá¯á¶ážáá²á· ááŒáá·áºááá¯ááºááá¬ážá á áááºááá¯ááºáá¡á±á¬ááº-
$ kubeval kubeval-invalid.yaml
WARN - kubeval-invalid.yaml contains an invalid Deployment (http-echo) - selector: selector is required
PASS - kubeval-invalid.yaml contains a valid Service (http-echo)
# пÑПвеÑОЌ кПЎ вПзвÑаÑа
$ echo $?
1
á¡áááºážá¡ááŒá áºááᯠá¡áááºáááŒá¯ááá±ážáá«á
API áá¬ážááŸááºážááᯠá¡áá¯á¶ážááŒá¯á ááŒáá·áºáá»ááºááŸá¯áá»á¬áž apps/v1
á pod áá¡ááœáŸááºážááŸáá·áºááá¯ááºáá®áá±á¬ááœá±ážáá»ááºáá±ážáááááá¬áá
áºáá¯áá«áááºááááºá á¡áááºáá±á¬áºááŒáá« áááºáá®ážáááºá
áºááœáẠááœá±ážáá»ááºáá±ážáá° ááá«áááºáá±á¬ááŒá±á¬áá·áº 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
áá«á Kubeval ááááá±ážáá¬ážáá²á· á¡ááŸá¬ážá¡ááŸááºáá«áá²á ááœá±ážáá»ááºááŸá¯áá áºáá¯ááá·áºááŒááºážááŒáá·áº áááºážááᯠáááºááŒááºááá¯ááºáááº-
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 áá²á·ááá¯á·áá±á¬ áááááá¬áá»á¬ážá á¡áá»áá¯ážáá»á±ážáá°ážááŸá¬ á€áá²á·ááá¯á·áá±á¬ á¡ááŸá¬ážáá»á¬ážááᯠááŒáá·áºáá»ááºááŒááºážá ááºáááºážááœáẠá á±á¬á á®ážá áœá¬ áááºážááááá¯ááºááŒááºážááŒá áºáááºá
ááá¯á·á¡ááŒááºá á€á á áºáá±ážááŸá¯áá»á¬ážááẠá¡á á¯á¡áá±ážááá¯á·áááºáá±á¬ááºááœáá·áºáááá¯á¡ááºáá«á áááºážááá¯á·ááᯠá¡á±á¬á·ááºááá¯ááºážáá¯ááºáá±á¬ááºááá¯ááºáá«áááºá
áá°áááºážá¡á¬ážááŒáá·áº kubeval ááẠáá±á¬ááºáá¯á¶ážááœáẠKubernetes API schema ááŸáá·áº á¡áááºážá¡ááŒá
áºáá»á¬ážááᯠá
á
áºáá±ážáááºá ááá¯á·áá±á¬áºáááºážá ááá
á¹á
á¡áá»á¬ážá
á¯ááœáẠáááºááẠáá®ážááŒá¬áž Kubernetes áá¯ááºáá±ááŸá¯ááᯠá
á
áºáá±ážááẠááá¯á¡ááºááá¯ááºáááºá á¡áá¶ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºááá¯ááºáááºá --kubernetes-version
:
$ kubeval --kubernetes-version 1.16.1 base-valid.yaml
áá¬ážááŸááºážááᯠáá±á¬áºáááºááŒáá·áº áááºááŸááºáá¬ážááŒá±á¬ááºáž áá»á±ážáá°ážááŒá¯á áááááŒá¯áá«á Major.Minor.Patch
.
á¡áááºááŒá¯ááŒááºážááᯠáá¶á·ááá¯ážáá±ážáá¬ážááá·áº áá¬ážááŸááºážáá»á¬ážá
á¬áááºážá¡ááœááºá áá»á±ážáá°ážááŒá¯á áááºááŸá¯áá«á --schema-location
.
áá áºáŠážáá»ááºážá á® YAML ááá¯ááºáá»á¬ážá¡ááŒáẠkubeval ááẠáááºážááœáŸááºáá»á¬ážááŸáá·áº stdin ááá¯á·ááŸáá·áºáááºáž áá¯ááºáá±á¬ááºááá¯ááºáááºá
ááá¯á·á¡ááŒáẠKubeval ááẠCI ááá¯ááºááá¯ááºážááá¯á· á¡ááœááºááá° áá±á«ááºážá ááºááá¯ááºáááºá á¡á á¯á¡áá±ážááá¯á· áááºáá®ážáááºá áºáá»á¬áž áááá¯á·áá® á ááºážáááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºááá¯áá°áá»á¬ážááẠKubeval ááẠá¡ááœááºáá±á¬áºáááºáá¯á¶ážáá¯ááᯠáá¶á·ááá¯ážáá±ážááŒá±á¬ááºáž ááááááŒáá·áº áááºážáá¬áááá«áááºá
- ááá¯ážááá¯ážá á¬áá¬áž;
- JSON;
- Test Anything Protocol (TAP)á
ááŸáá·áº á¡ááá¯ááŸááá±á¬ á¡áá»áá¯ážá¡á á¬ážá ááááºáá»á¬ážá á¡áá»ááºážáá»á¯ááºááᯠáá¯ááºáá¯ááºááẠá¡ááœááºá áááºááá·áºááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡ááœáẠáááºááá·áºáá±á¬áºáááºááá¯áááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
Kubeval áá¡á¬ážáááºážáá»ááºáá»á¬ážáá²ááŸáá
áºáá¯ááŸá¬ Custom Resource Definitions (CRDs) ááŸáá·áº ááá¯ááºáá»á±á¬áá®ááœá±ááŸáááŸá¯ááᯠáááºááá±á¬á
á
áºáá±ážááá¯ááºááŒááºážáááŸááá«á ááá¯á·áá±á¬áº kubeval ááᯠconfigure áá¯ááºááá¯ááºáááºá
Kubeval ááẠá¡áááºážá¡ááŒá áºáá»á¬ážááᯠá á áºáá±ážááŒááºážááŸáá·áº á¡áá²ááŒááºááŒááºážá¡ááœáẠáá±á¬ááºážááœááºáá±á¬áááááá¬áá áºáá¯ááŒá áºáááºá ááá¯á·áá¬ááœááºá á¡áááºážá¡ááŒá áºááẠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááŸáá·áº ááá¯ááºáá®ááŒá±á¬ááºáž á¡á¬ááá¶áá»ááºááá±ážááŒá±á¬ááºáž á á áºáá±ážááŸá¯á¡á±á¬ááºááŒááºááŒá±á¬ááºáž á¡áá±ážáá¬ážááá·áºáááºá
á¥ááá¬á¡á¬ážááŒáá·áº tag ááá¯á¡áá¯á¶ážááŒá¯áá«á latest
ááœááºááááºáá¬áá²ááœáẠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááᯠáááá¯ááºáá¬áá«á ááá¯á·áá±á¬áºáááºáž Kubeval ááẠáááºážááᯠá¡ááŸá¬ážáá
áºáá¯áᯠááá°ááá² áááºážááᯠááááºážááá¯á·ááŒááºážáááŸááá±á ááá¯ááá¯áááºááŸá¬á ááá¯ááá¯á·áá±á¬ YAML áá¡áááºááŒá¯ááŒááºážáááºááááá±ážáá»ááºáááŸááá²ááŒá®ážáá¯á¶ážáááá·áºáááºá
ááá¯á·áá±á¬áº YAML ááᯠá¡áá²ááŒááºááŒá®áž tag áá²á·ááá¯á· áá»áá¯ážáá±á¬ááºááŸá¯áá»á¬ážááᯠááœá²ááŒá¬ážáááºááŸááºááá¯áá«á á¡áááºáááºáž latest
? á¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááŸáá·áº áááºáááºá YAML ááá¯ááºááᯠáááºááá¯á·á
á
áºáá±ážááááºáááºážá
2. Kube-áááŸááº
- ááœááºááááºáá¬ááᯠroot á¡áá±ááŒáá·áºáá¯ááºáá±á¬ááºááŒááºážááá¯ááºáá«á
- áá°ážáá®ážáá»ááºážáá¬áá±ážá á áºáá±ážááŸá¯áá»á¬áž áááŸáááá¯ááºááŒááºážá
- á¡áááºážá¡ááŒá áºáá»á¬ážá¡ááœáẠáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááŸáá·áº ááá·áºáááºáá»ááºáá»á¬ážááᯠáááºááŸááºááŒááºážá
á ááºážáááºááŸá¯ááááºáá»á¬ážááᯠá¡ááŒá±áá¶á ááááºáá¯á¶ážáá¯ááá¯áá±ážáááº- OK, ááááá±ážáá»áẠО áá±áááºáá»ááº.
Kube-score á¡áœááºááá¯ááºážááœáẠá ááºážáá¯á¶ážááá¯ááºááẠááá¯á·ááá¯áẠáááºážááᯠá ááºááœááºážá ááá·áºááœááºážááá¯ááºáááºá
áá°áááºážáá±á¬ááºážáá«ážááᯠáá±ážáá¬ážáá»áááºááœáẠKube-score á áá±á¬ááºáá¯á¶ážáá¬ážááŸááºážááŸá¬ 1.7.0 ááŒá áºáááºá
áá»áœááºá¯ááºááá¯á·á manifest ááœáẠáááºážááᯠá
ááºážááŒáá·áºááŒáá«á
áá¯á· base-valid.yaml
:
$ kube-score score base-valid.yaml
apps/v1/Deployment http-echo
[CRITICAL] Container Image Tag
· http-echo -> Image with latest tag
Using a fixed tag is recommended to avoid accidental upgrades
[CRITICAL] Pod NetworkPolicy
· The pod does not have a matching network policy
Create a NetworkPolicy that targets this pod
[CRITICAL] Pod Probes
· Container is missing a readinessProbe
A readinessProbe should be used to indicate when the service is ready to receive traffic.
Without it, the Pod is risking to receive traffic before it has booted. It is also used during
rollouts, and can prevent downtime if a new version of the application is failing.
More information: https://github.com/zegl/kube-score/blob/master/README_PROBES.md
[CRITICAL] Container Security Context
· http-echo -> Container has no configured security context
Set securityContext to run the container in a more secure context.
[CRITICAL] Container Resources
· http-echo -> CPU limit is not set
Resource limits are recommended to avoid resource DDOS. Set resources.limits.cpu
· http-echo -> Memory limit is not set
Resource limits are recommended to avoid resource DDOS. Set resources.limits.memory
· http-echo -> CPU request is not set
Resource requests are recommended to make sure that the application can start and run without
crashing. Set resources.requests.cpu
· http-echo -> Memory request is not set
Resource requests are recommended to make sure that the application can start and run without crashing.
Set resources.requests.memory
[CRITICAL] Deployment has PodDisruptionBudget
· No matching PodDisruptionBudget was found
It is recommended to define a PodDisruptionBudget to avoid unexpected downtime during Kubernetes
maintenance operations, such as when draining a node.
[WARNING] Deployment has host PodAntiAffinity
· Deployment does not have a host podAntiAffinity set
It is recommended to set a podAntiAffinity that stops multiple pods from a deployment from
being scheduled on the same node. This increases availability in case the node becomes unavailable.
YAML ááẠkubeval á á¬áá±ážááœá²áá»á¬ážááᯠáá»á±á¬áºááŒááºááŒá®áž kube-score ááẠá¡á±á¬ááºáá«áá»áá¯á·ááœááºážáá»ááºáá»á¬ážááᯠáá±á¬ááºááŒáááºá
- á¡áááºááá·áºá á áºáá±ážááŸá¯áá»á¬ážááᯠááŒá¯ááŒááºááá¬ážáá«á
- CPU á¡áááºážá¡ááŒá áºáá»á¬ážááŸáá·áº ááŸááºáá¬ááºá¡ááœáẠáá±á¬ááºážááá¯ááŸá¯áá»á¬áž ááá¯á·ááá¯áẠááá·áºáááºáá»ááºáá»á¬ážáááŸááá«á
- Pod á¡ááŸá±á¬áá·áºá¡ááŸáẠáááºáá»ááºáá»á¬ážááᯠáááºááŸááºááá¬ážáá«á
- ááœá²ááœááºááŒááºážááá¯ááºáᬠá ááºážáá»ááºážáá»á¬áž áááŸááá«á (ááá·áºáá»ááºáááºáááºáá¶áá±áž) áááŸáááá¯ááºááŸá¯á¡áá»á¬ážáá¯á¶ážáááŸááááºá
- ááœááºááááºáá¬ááẠroot á¡ááŒá áºá¡áá¯ááºáá¯ááºáááºá
á€á¡áá¬áá»á¬ážááẠááŒáá·áºáá»ááºááŸá¯ ááá¯ááá¯áááá±á¬ááºááŒá®áž áá¯á¶ááŒááºá áááºáá»áá á±ááẠááá¯ááºááœááºááŒá±ááŸááºážááẠááá¯á¡ááºáá±á¬ áá»áá¯á·ááœááºážáá»ááºáá»á¬ážááŸáá·áº áááºáááºá ááŸááºáááºáá±á¬á¡áá»ááºáá»á¬ážááŒá áºáááºá
á¡ááœá²á· 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 ááá¯ááºááá¯ááºá hardcode áá¯ááºáá¬ážáá«áááº- Kubernetes á á¡ááŒá¬ážáá¬ážááŸááºážááᯠáááºááœá±ážáá»ááºááááá«á áááºá á¡á á¯á¡áá±ážááᯠá¡ááá·áºááŒáŸáá·áºááẠáááºááœááºáá¬ážáá»áŸáẠááá¯á·ááá¯áẠááá·áºááœáẠK8s áá¬ážááŸááºážá¡áá»áá¯ážáá»áá¯ážááŸáááá·áº á¡á á¯á¡áá±ážáá»á¬ážá áœá¬ááŸááá»áŸáẠá€ááá·áºáááºáá»ááºááẠááŒá¿áá¬ááŒá®ážáá áºáᯠááŒá áºáá¬ááá¯ááºáááºá
ááŸááºáááº
ááŒá¿áá¬ááŸááá±ááŒá®á áá®á¡ááœáá·áºá¡áá±ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯á· á¡ááá¯ááŒá¯áá»ááºáá áºáá¯áá«á
kube-score á áá±á¬ááºáááºá¡áá»ááºá¡áááºáá»á¬ážááᯠááœáẠááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
Kube-score á ááºážáááºááŸá¯áá»á¬ážááẠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáááºá¡ááœáẠáá±á¬ááºážááœááºáá±á¬áááááá¬áá áºáá¯ááŒá áºáááºá ááá¯á·áá±á¬áº áááºááẠá á¬áá±ážááœá²ááœáẠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááŒá¯áá¯ááºááẠááá¯á·ááá¯áẠááá·áºááá¯ááºááá¯ááºá ááºážáá»ááºážáá»á¬ážááᯠááá·áºááœááºážáá«á á¡áááºáááºážá ááŒá±á¬áº áá«á ááá¯ááºááá¯ááºáá°ážá
Kube-áááŸááºááᯠááá¯ážáá»á²á·áááááá¯ááºáá«- áááºážááœáẠáá°áá«ááá»á¬ážááá·áºááŒááºáž ááá¯á·ááá¯áẠáááºážááá¯á·ááᯠáá»áááºááŸáááááá«á
áá¯áá¹ááá®áá°áá«ááá»á¬ážááŸáá·áº ááá¯ááºáá®ááŒá±á¬ááºáž á¡áááºááŒá¯ááẠá áááºááŒáá¯ááºá ááºážáááºááŸá¯áá»á¬áž áá±ážáááºááá¯á¡ááºáá«áá áááºááẠá¡á±á¬ááºáá«áááááá¬áá±ážáá¯áá²á០áá áºáá¯ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááº- config-lintá copperá confest ááá¯á·ááá¯áẠpolarisá
3.Config-lint
Config-lint ááẠYAMLá JSONá Terraformá CSV ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááá¯ááºáá»á¬ážááŸáá·áº Kubernetes áááºáá®ážáááºá áºáá»á¬ážááᯠááá¬ážáááºá á áºáá±ážáááºá¡ááœáẠáááááá¬áá áºáá¯ááŒá áºáááºá
á¡áá¯á¶ážááŒá¯á áááºáááºááá¯ááºáá«áááºá
áá°áááºážáá±á¬ááºážáá«ážáá±ážáá¬ážáá»áááºá¡áá áááºááŸááá¯ááºáá±ááŸá¯ááẠ1.5.0 ááŒá áºáááºá
Config-lint ááœáẠKubernetes manifests áá»á¬ážááᯠá¡áááºááŒá¯áááºá¡ááœáẠbuilt-in á ááºážáááºááŸá¯áá»á¬áž áááŸááá«á
áááºááá·áºá á áºáá±ážááŸá¯áá»á¬ážááŒá¯áá¯ááºááẠááá·áºáá»á±á¬áºáá±á¬ á ááºážáá»ááºážáá»á¬ážáááºáá®ážááẠááá¯á¡ááºáá«áááºá áááºážááá¯á·ááᯠYAML ááá¯ááºáá»á¬ážááœáẠ"rulesets" áá¯áá±á«áºááẠ(á ááºážáááºážáá»ááºáá»á¬áž)ááŸáá·áº á¡á±á¬ááºáá«ááœá²á·á ááºážáá¯á¶ ááŸááááº-
version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
- "*.yaml"
rules:
# ÑпОÑПк пÑавОл
(rule.yaml
)
ááá¯ááŒá®áž á¡áá®ážááẠáá±á·áá¬ááŒáá·áºáá¡á±á¬ááºá
- áááºáá¬
type
configuration config-lint á¡áá¯á¶ážááŒá¯ááá·áº á¡áá»áá¯ážá¡á á¬ážááᯠáááºááŸááºáááºá K8s á¡ááœááºáá±á¬á· áá«á áááºááŸá¬ážáá«áááºá á¡ááŒá²Kubernetes
. - áááºááŒááºá
files
ááá¯ááºáá»á¬ážááá¯ááºááá¯ááºá¡ááŒááºá áááºáááºáááºážááœáŸááºáá áºáá¯áááºááŸááºááá¯ááºáááºá - áááºáá¬
rules
á¡áá¯á¶ážááŒá¯áá° á ááºážáááºááŸá¯áá»á¬ážááᯠáááºááŸááºááẠáááºááœááºáá«áááºá
Deployment ááŸá áá¯á¶áá»á¬ážááᯠáá¯á¶ááŒááºá
áááºáá»ááá±á¬ repository á០á¡ááŒá²áá±á«ááºážáá¯ááºáá¯ááºáá¬ážááŒá±á¬ááºáž áá±áá»á¬á
á±ááá¯áááºááá¯ááŒáá«á
áá¯á·á my-company.com/myapp:1.0
. ááá¯ááá¯á·áá±á¬á
á
áºáá±ážááŸá¯ááá¯áá¯ááºáá±á¬ááºááá·áº config-lint á
ááºážáá»ááºážááẠá€áá²á·ááá¯á·ááŒá
áºáááá·áºáááº-
- id: MY_DEPLOYMENT_IMAGE_TAG
severity: FAILURE
message: Deployment must use a valid image tag
resource: Deployment
assertions:
- every:
key: spec.template.spec.containers
expressions:
- key: image
op: starts-with
value: "my-company.com/"
(rule-trusted-repo.yaml
)
á ááºážáá»ááºážáá áºáá¯á á®ááœáẠá¡á±á¬ááºáá«á¡áááºá¡áá»ááºážáá»á¬áž ááŸáááááº-
id
- á ááºážáá»ááºážááá°ážááŒá¬ážáá±á¬áááºááŸááºááŸá¯;severity
- ááŒá áºááá¯ááºá áᬠáá»ááºááœááº, ááááá±ážáá»áẠО NON_COMPLIANT;message
â á ááºážáá»á¥áºážá ááºážáááºážááᯠáá»áá¯ážáá±á¬ááºáá«áá á€á á¬ááŒá±á¬ááºážá á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠááŒááááºááŒá áºáááºáresource
â á€á ááºážáá»ááºážááᯠáá»áá·áºáá¯á¶ážááá·áº á¡áááºážá¡ááŒá áºá¡áá»áá¯ážá¡á á¬ážáassertions
â á€á¡áááºážá¡ááŒá áºááŸáá·áºá ááºáá»ááºážá á¡áá²ááŒááºááá·áºá¡ááŒá±á¡áá±áá»á¬ážá á¬áááºážá
á¡áá±á«áºá áááºážá¥ááá±áá²ááŸá¬ assertion
á¡áááºááŸá every
key: spec.templates.spec.containers
) áá¯á¶ááŒááºááá±á¬ áá¯á¶áá»á¬ážááᯠáá¯á¶ážáá« (ááá¯ááá¯áááºááŸá¬ á
áááºááŒáá·áº my-company.com/
).
á ááºážáááºážáá»ááºá¡ááŒáá·áºá¡á á¯á¶ááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááº-
version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
- "*.yaml"
rules:
- id: DEPLOYMENT_IMAGE_REPOSITORY # !!!
severity: FAILURE
message: Deployment must use a valid image repository
resource: Deployment
assertions:
- every:
key: spec.template.spec.containers
expressions:
- key: image
op: starts-with
value: "my-company.com/"
(ruleset.yaml
)
á
ááºážáá¯á¶ážááŒáá·áºáááºá áááºážááᯠááááºážáááºážááá¯ááºááŒáá«á
áá¯á· check_image_repo.yaml
. ááá¯ááºááᯠá
á
áºáá±ážááŒáá·áºáá¡á±á¬áẠbase-valid.yaml
:
$ config-lint -rules check_image_repo.yaml base-valid.yaml
[
{
"AssertionMessage": "Every expression fails: And expression fails: image does not start with my-company.com/",
"Category": "",
"CreatedAt": "2020-06-04T01:29:25Z",
"Filename": "test-data/base-valid.yaml",
"LineNumber": 0,
"ResourceID": "http-echo",
"ResourceType": "Deployment",
"RuleID": "DEPLOYMENT_IMAGE_REPOSITORY",
"RuleMessage": "Deployment must use a valid image repository",
"Status": "FAILURE"
}
]
á á áºáá±ážááŸá¯ áá¡á±á¬ááºááŒááºáá«á ááᯠááŸááºáááºáá±á¬ áá¯ááºáá¯á¶ááá¯ááŸá±á¬ááºááŸá¯ááŒáá·áº á¡á±á¬ááºáá«áááºáá®ážáááºá áºááᯠá á áºáá±ážááŒáá·áºááŒáá«á áá¯á·á
apiVersion: apps/v1
kind: Deployment
metadata:
name: http-echo
spec:
replicas: 2
selector:
matchLabels:
app: http-echo
template:
metadata:
labels:
app: http-echo
spec:
containers:
- name: http-echo
image: my-company.com/http-echo:1.0 # !!!
args: ["-text", "hello-world"]
ports:
- containerPort: 5678
(image-valid-mycompany.yaml
)
á¡áááºáá±á¬áºááŒáá« manifest ááŒáá·áº áá°áá®áá±á¬á ááºážáááºááŸá¯ááᯠáá»áœááºá¯ááºááá¯á·áá¯ááºáá±á¬ááºáá«áááºá ááŒá¿áá¬áááœá±á·áá«
$ config-lint -rules check_image_repo.yaml image-valid-mycompany.yaml
[]
Config-lint ááẠYAML DSL ááᯠá¡áá¯á¶ážááŒá¯á Kubernetes YAML manifests áá»á¬ážááᯠááá¬ážáááºá¡á±á¬ááºááŒá¯áá¯ááºááẠááá·áºááá¯ááºááá¯ááºá ááºážáááºááŸá¯áá»á¬ážááᯠáááºáá®ážááá¯ááºá á±ááá·áº á¡áá¬ážá¡áá¬ááŸááá±á¬ áá°áá±á¬ááºáá áºáá¯ááŒá áºáááºá
áá«áá±ááá·áº ááá¯ááŸá¯ááºááœá±ážáá²á· áá¯áá¹áááá±ááá²á· á ááºážáááºááŸá¯ááœá± ááá¯á¡ááºáááºáá±á¬á YAML ááẠá€á¡ááœáẠá¡ááá·áºá¡áááºáááŸááá«áá¬ážá áááá¯ááááºážáááºážáá¬áá¬á áá¬áž á¡ááŒáá·áºá¡á á¯á¶ááŒáá·áº á ááºážáááºááŸá¯áá»á¬ážááᯠáááºáá®ážááá¯ááºáá»áŸááºáá±á¬á
4. ááŒá±ážáá®
ááá¯á·áá±á¬áºá á á¬áá±ážááœá²áá»á¬ážááá¯áá±á¬áºááŒááẠYAML ááá¯á¡áá¯á¶ážáááŒá¯áá±á¬ááŒá±á¬áá·áºáááºážáááºáá±á¬ááºáá¯á¶ážááŸáá·áºááœá²ááŒá¬ážáááºá á ááºážáááºááŸá¯áá»á¬ážááᯠJavaScript á¡á á¬áž áá±ážááá¯ááºáááºá ááŒá±ážáá®ááẠá¡ááŒá±áá¶áááááá¬áá»á¬ážá áœá¬ááŒáá·áº á á¬ááŒáá·áºááá¯ááºáá áºáá¯ááᯠáá¶á·ááá¯ážáá±ážáááºáKubernetes á¡áá¬ááá¹áá¯áá»á¬ážá¡ááŒá±á¬ááºáž á¡áá»ááºá¡áááºáá»á¬ážááᯠáááºááŸá¯ááá¯ááºááŒá®áž á¡ááŸá¬ážá¡ááœááºážáá»á¬ážááᯠááááºážááá¯á·ááẠáá°áá®áá±ážáá±á¬á
Copper áááºáááºááŒááºážá¡ááœáẠá¡ááá·áºáá»á¬ážááᯠááŒáá·áºááá¯ááºáá«áááºá
2.0.1 ááẠáá°áááºážáá±á¬ááºážáá«ážááá¯áá±ážáá¬ážáá»áááºááœáẠဠutility ááá±á¬ááºáá¯á¶ážááœááºááŸáááŸá¯ááŒá áºáááºá
config-lint áá²á·ááá¯á· Copper ááœáẠbuilt-in á
ááºážáááºááŸá¯áá»á¬ážáááŸááá«á áá
áºáá¯áá±ážááŒáá·áºáá¡á±á¬ááºá ááŒáá·áºáá»ááºááŸá¯áá»á¬ážáá²á·ááá¯á· áá¯á¶ááŒááºá
áááºáá»ááá±á¬ ááá¯ááŸá±á¬ááºáá¯á¶áá»á¬ážá០ááœááºááááºáá¬áá¯á¶áá»á¬ážááᯠáá®ážááá·áºá¡áá¯á¶ážááŒá¯ááŒá±á¬ááºáž á
á
áºáá±ážáá«á
á±á 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
, command ááá¯áá¯á¶ážáá«á 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 ááœáẠdomain names áá»á¬ážááᯠá á áºáá±ážááŒááºáž ááá¯á·ááá¯áẠá¡ááœáá·áºáá°ážáá¶áá¯ááºááœáẠáá¯ááºáá±á¬ááºáá±áá±á¬ pod áá»á¬ážááᯠááŒááºážáááºááŒááºážááŒá áºáááºááŸá¬ ááŸááºážáá«áááºá
Copper ááœáẠá¡áá»áá¯ážáá»áá¯ážáá±á¬ á¡áá¯á¶ážáááºáá±á¬ áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž áá«ááŸááááº-
DockerImage
áááºááŸááºáá¬ážáá±á¬ input ááá¯ááºááá¯áááºááŒá®áž á¡á±á¬ááºáá« attribute áá»á¬ážááŒáá·áº á¡áá¬ááá¹áá¯áá áºáá¯ááᯠáááºáá®ážáááº-name
- áá¯ááºáá¯á¶átag
- image tagáregistry
- áá¯ááºáá¯á¶ááŸááºáá¯á¶áááºááŒááºážáregistry_url
- áááá¯ááá¯áá±á¬ (https://
) ááŸáá·áº image registry áfqin
- áá¯á¶ááááºáá±áá¬á¡ááŒáá·áºá¡á á¯á¶á
- áá¯ááºáá±á¬ááºáá»ááº
findByName
áá±ážáá¬ážáá±á¬á¡áá»áá¯ážá¡á á¬ážáá áºáá¯ááŒáá·áº á¡áááºážá¡ááŒá áºáá áºáá¯ááᯠááŸá¬ááœá±ááẠáá°áá®áá±ážááẠ(kind
) ááŸáá·áº á¡ááẠ(name
input file ááŸ)á - áá¯ááºáá±á¬ááºáá»ááº
findByLabels
áááºááŸááºáá¬ážáá±á¬ á¡áá»áá¯ážá¡á á¬ážááŒáá·áº á¡áááºážá¡ááŒá áºááᯠááŸá¬ááœá±ááẠáá°áá®áá±ážááẠ(kind
) ááŸáá·áº áá¶ááááºáá»á¬áž (labels
).
áááŸáááá¯ááºáá±á¬áááºáá±á¬ááºááŸá¯áá¯ááºáá±á¬ááºáá»ááºá¡á¬ážáá¯á¶ážááᯠáááºááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
áá¯á¶ááŸááºá¡á¬ážááŒáá·áº áááºážááẠááá·áºááœááºážáá¬ážáá±á¬ YAML ááá¯ááºáá
áºáá¯áá¯á¶ážááᯠááááºážááŸááºáá
áºáá¯á¡ááŒá
Ạáááºáá«áááºá $$
ááŸáá·áº scripting (jQuery á¡ááœá±á·á¡ááŒá¯á¶ááŸááá°áá»á¬ážá¡ááœáẠá¡áá»áœááºážááááºááŸááá±á¬ áááºážááá¬áá
áºáá¯) ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
Copper á á¡áááá¡á¬ážáá¬áá»ááºááŸá¬ áááá¬áááºááŸá¬ážáááº- áááºááẠá¡áá°ážááŒá¯áá¬áá¬á áá¬ážááᯠáá»áœááºážáá»ááºááẠáááá¯á¡ááºáá²á string interpolationá functions á áááºááá¯á·áá²á·ááá¯á·áá±á¬ ááá·áºááá¯ááºááá¯ááºá ááºážáááºááŸá¯áá»á¬ážááᯠáááºáá®ážáááºá¡ááœáẠJavaScript á¡ááºá¹áá«áááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá
áááºááŸá Copper áá¬ážááŸááºážááẠES5 ááá¯ááºáá² JavaScript á¡ááºáá»ááºá ES6 áá¬ážááŸááºážááŸáá·áº á¡áá¯ááºáá¯ááºááŒá±á¬ááºážááá¯áááºáž áááááŒá¯ááá·áºáááºá
á¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠááœááºááá°ááá¯ááºáá«áááºá
ááá¯á·áá±á¬áºá á¡áááºá áááºááẠJavaScript ááᯠá¡ááŸááºáááẠáááŒáá¯ááºáá² áá±ážááœááºážáá»á¬ážáááºáá®ážááŒááºážááŸáá·áº áá°áá«ááá»á¬ážááᯠáá±á¬áºááŒááŒááºážá¡ááœáẠá¡áá°ážáá®ááá¯ááºážáá¯ááºáá¬ážáá±á¬ áá¬áá¬á áá¬ážááᯠááŸá áºáááºáá«áá confest ááᯠá¡á¬áá¯á¶á áá¯ááºááá·áºáááºá
5.Confest
Confest ááẠconfiguration data ááᯠá
ááºážáááºáááºá¡ááœáẠáá°áá±á¬ááºáá
áºáá¯ááŒá
áºáááºá Kubernetes manifests áá»á¬ážááᯠá
ááºážáááºááŒááºáž/á¡áááºááŒá¯ááŒááºážá¡ááœááºáááºáž ááá·áºáá»á±á¬áºáá«áááºá á
á¬áá±ážááœá²áá»á¬ážááᯠá¡áá°ážááŒá¯áá±ážááŒááºážáá±á¬áá¬áá¬á
áá¬ážááŒáá·áº áá±á¬áºááŒáá¬ážáá«áááºá
confest ááᯠá¡áá¯á¶ážááŒá¯á ááẠinstall áá¯ááºááá¯ááºáááºá
áá°áááºážáá±á¬ááºážáá«ážááᯠáá±ážáá¬ážáá»áááºááœááºá áá±á¬ááºáá¯á¶ážááœááºáá¬ážááŸááºážááŸá¬ 0.18.2 ááŒá áºáááºá
config-lint ááŸáá·áº copper áá²á·ááá¯á·áááºá confest ááẠáááºááá·áº built-in á ááºážáááºááŸá¯ááŸááá«áá² áá¬áá«áááºá áá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯ááºáá°áá«áááᯠá ááºážáá¯á¶ážááŒáá·áºááŒáá«á áá¯á·á ááááºááá°áá¬áá»á¬ážááœááºá¡ááá¯ááºážá ááœááºááááºáá¬áá¯á¶áá»á¬ážááᯠáá¯á¶ááŒááºá áááºáá»ááá±á¬ á¡áááºážá¡ááŒá áºá០áá°áá¬ážááŒááºážááŸááááŸá á á áºáá±ážáá«áááºá
áááºážááœáŸááºáá
áºáá¯áááºáá®ážáá«á 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 ááá¯ááºááœáẠáá»áœááºá¯ááºááá¯á·ááẠblock ááᯠáááºááŸááºáááºá 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
á¡ááŒá¬áž terminal ááœááºá á
á±á¬á
á±á¬á áááºáááºáá®ážáá²á·áá±á¬ áááºážááœáŸááºááá¯á· ááœá¬ážáá«á conftest-checks
á¡á±á¬ááºáá« command ááᯠrun áá«á
$ conftest push 127.0.0.1:5000/amitsaha/opa-bundle-example:latest
command á¡á±á¬ááºááŒááºáá«áá á€áá²á·ááá¯á·áá±á¬ áááºáá±á·áá»áºááᯠááœá±á·ááá«áááºá
2020/06/10 14:25:43 pushed bundle with digest: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609c
ááᯠáá¬áá®áááºážááœáŸááºáá
áºáá¯áááºáá®ážááŒá®áž áááºážááœáẠcommand ááá¯ááœáá·áºáá«á conftest pull
. áááẠcommand ááŒáá·áº áááºáá®ážáá¬ážáá±á¬ package ááᯠáá±á«ááºážáá¯ááºáá¯ááºáááá·áºáááº-
$ cd $(mktemp -d)
$ conftest pull 127.0.0.1:5000/amitsaha/opa-bundle-example:latest
áá¬áá®áááºážááŒá±á¬ááºážááœá²áá
áºáᯠáá±á«áºáá¬áá«áááºá policy
áá»áœááºá¯ááºááá¯á·á áá°áá«áááá¯áẠáá«áááºáááº-
$ tree
.
âââ policy
âââ check_image_registry.rego
á ááºážáááºááŸá¯áá»á¬ážááᯠrepository á០ááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºááá¯ááºáááº-
$ 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 ááᯠááá¶á·ááá¯ážááá±ážáá«á áá«ááŒá±á¬áá·áº áááºá¡áá¯á¶ážááŒá¯ááẠáá¶áá±á¬ááºážáááºááá¯á· áá°áááá¯ááºáá«á
Artifact áá±á¬áºáááºááẠáá°áááºá
áá°áá«ááá»áŸáá±ááŒááºážááŸáá·áº ááŒáá¯ááºááá¯ááºááŸá¯á á¡ááŒá¬ážá¡ááºá¹áá«áááºáá»á¬ážá¡ááŒá±á¬ááºáž ááá¯ááá¯áá±á·áá¬ááá¯ááºáá«áááºá
áá á áá°áá¶
áá®áá±á¬ááºážáá«ážááŸá¬ ááœá±ážááœá±ážááá·áº áá±á¬ááºáá¯á¶áž tool ááá±á¬á·
áá°áá¶ááᯠá¡á á¯á¡áá±ážáá áºáá¯ááœáẠááá·áºááœááºážááá¯ááºááẠááá¯á·ááá¯áẠá¡áááá·áºáá±ážá á¬ááŒá±á¬ááºážáá¯ááºááœáẠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá áááºááá·áºááŸááºážáá¬ážááá·áºá¡ááá¯ááºážá áááºážááẠKubernetes manifests áá»á¬ážááᯠáááºááŒáááºá áœá¬ááœá²ááŒááºážá áááºááŒá¬ááá¯ááºá á±áá«áááºá
á¡áááá·áºáá±ážá á¬ááŒá±á¬ááºážáá¯ááºááœáẠáá¯ááºáá±á¬ááºáá±áá»áááºááœááºá áá¯á¶ááŒá¯á¶áá±ážááŸáá·áº á¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬áž ( kube-score ááŸáá·áº áááºáá°áááº) áá²á·ááá¯á·áá±á¬ áááºáááºáá»á¬ážááœáẠáááºáááºáá¬ážáá±á¬ á ááºážáááºááŸá¯áá»á¬ážááᯠáááŸáááá¯ááºáááºá ááá¯á·á¡ááŒááºá áááºáááºáááºáááá¯ááºááá¯ááºá ááºážáááºááŸá¯áá»á¬áž (config-lintá copper ááŸáá·áº confest áá²á·ááá¯á·) ááá¯áááºáá®ážááá¯ááºáááºá
áá áºáááºážááá¯ááá±á¬áºá Polaris ááẠáááááᬠá¡áá»áá¯ážá¡á á¬áž ááŸá áºáá¯á áá¯á¶ážá á¡áá»áá¯ážáá»á±ážáá°ážáá»á¬ážááᯠáááºáááºááŒá®áž ááŸáá·áº á áááºááŒáá¯ááºá ááºážáááºááŸá¯áá»á¬ážááŒáá·áº áá±á«ááºážá ááºáá¬ážáááºá
á¡áááá·áºáá±ážá
á¬ááŒá±á¬ááºážáá¯ááºááœáẠPolaris ááá·áºááœááºážáááºá á¡áá¯á¶ážááŒá¯áá«á
áá°áááºážáá±á¬ááºážáá«ážááᯠáá±ážáá¬ážáá±áá»áááºááœáẠáá¬ážááŸááºáž 1.0.3 ááᯠáááŸáááá¯ááºáá«áááºá
áááºáááºááŸá¯ááŒá®ážááœá¬ážáááºááŸáá·áº áááºááẠmanifest ááœáẠpolaris ááᯠrun ááá¯ááºáááºá base-valid.yaml
á¡á±á¬ááºáá« command ááŒáá·áº
$ polaris audit --audit-path base-valid.yaml
áááºážááẠá ááºážáááºááŸá¯áá»á¬ážáá¯ááºáá±á¬ááºáá²á·ááá·áº á¡áá±ážá áááºáá±á¬áºááŒáá»ááºááŸáá·áº áááºážááá¯á·áááááºáá»á¬ážááᯠJSON áá±á¬áºáááºááœáẠá á¬áááºážáá áºáá¯áá¯ááºáá±ážáááºááŒá áºáááºá Output ááœáẠá¡á±á¬ááºáá«ááœá²á·á ááºážáá¯á¶áá«ááŸááááº-
{
"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 ááẠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááŸáá·áº áááá¯ááºáá®ááá·áº áá±áá¬áá»á¬ážááœáẠááŒá¿áá¬áá»á¬ážááᯠáá±á¬áºáá¯ááºáááº-
- á¡á á±á·á¡áááºáá»á¬ážá¡ááœáẠáá»ááºážáá¬áá±ážá á áºáá±ážááŸá¯áááŸááá«á
- ááœááºááááºáá¬áá¯á¶áá»á¬ážá¡ááœáẠáááºáá»á¬ážááᯠááá±á¬áºááŒáá¬ážáá«á
- ááœááºááááºáá¬ááẠroot á¡ááŒá áºá¡áá¯ááºáá¯ááºáááºá
- Memory ááŸáá·áº CPU á¡ááœáẠáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááŸáá·áº ááá·áºáááºáá»ááºáá»á¬ážááᯠááá±á¬áºááŒáá¬ážáá«á
á
ááºážáááºááŸá¯áá
áºáá¯á
á®ááᯠáááºážáááááºáá»á¬ážáá±á«áºáá°áááºá áá±áááºááŸá¯á¡ááá¯ááºážá¡áá¬áá
áºáᯠáááºááŸááºáá±ážáááº- ááááá±ážááŸá¯ ááá¯á·ááá¯áẠá¡áá¹ááá¬ááº. áááŸáááá¯ááºáá±á¬ built-in á
ááºážáááºááŸá¯áá»á¬ážá¡ááŒá±á¬ááºáž ááá¯ááá¯áá±á·áá¬áááºá áá»á±ážáá°ážááŒá¯á áááºááŸá¯áá«á
á¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážáááá¯á¡ááºáá«áá á¡áá¶ááá¯áááºáááºááŸááºááá¯ááºáááºá --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
á¡áá¹ááá¬ááºá ááºážáááºááŸá¯áá áºáá¯áá¡á±á¬ááºááŒááºáá«á code 3 ááŒáá·áº command ááá¯áá»ááºááœááºá á±áááá·áºáááºá
ááᯠáá¯á¶á¡á¬áž áá¯á¶ááŒááºá áááºáá»ááá±á¬ ááá¯ááŸá±á¬ááºáá¯á¶á០áá°áá¬ážááŒááºážááŸááááŸá á á áºáá±ážááá·áº á áááºááŒáá¯ááºá ááºážáááºááŸá¯áá áºáá¯ááᯠáááºáá®ážááŒáá·áºááŒáá«á áá¯á·á á áááºááŒáá¯ááºá ááºážáááºááŸá¯áá»á¬ážááᯠ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
áá¯á¶á¡áááºážá¡ááŒá áºááᯠááá¯á¡ááºáá±á¬áá¯á¶ááŸáá·áº ááŸáá¯ááºážááŸááºááẠá¡áá¯á¶ážááŒá¯áááºá
á¡áááºáá«á ááºážáááºááŸá¯ááᯠáá¯ááºáá±á¬ááºááẠá¡á±á¬ááºáá« Polaris configuration ááᯠáááºáá®ážááẠááá¯á¡ááºáá«áááºá
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
. ááá¯ááẠrun ááá¯ááºáááºá polaris audit
á¡áááºááŒá¯ááẠááá¯á¡ááºáá±á¬ YAML manifest ááŒáá·áºá
áá»áœááºá¯ááºááá¯á·ááá±á¬áºááŒáá»ááºááᯠá
ááºážáááºááŒáá·áºááŒáá«á
áá¯á· 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
.
ááá¯áá±ážááœááºážáá±á«áºáá¬áááº- á áááºááŒáá¯ááºá ááºážáááºááŸá¯áá»á¬ážááŸáá·áºá¡áá° built-in á ááºážáááºááŸá¯áá»á¬ážááá¯áááºááá¯á·áá¯ááºáá±á¬ááºááááºáááºážá ááœááºáá«áááº! áááºááá·áºááœááºážáá¬ážááá·áº á ááºážáááºááŸá¯á¡ááŸááºá¡áá¬ážáá»á¬ážááᯠá á®á ááºááœá²á·á ááºážááŸá¯ááá¯ááºááœáẠááá·áºááœááºážááẠááá¯á¡ááºáá«áááºá ááááºá¡áá±ááŒáá·áºá áááºážááẠá¡á±á¬ááºáá«áá¯á¶á á¶ááᯠáá°áááºááŒá áºáááºá
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
)
ááŒá®ážááŒáá·áºá
á¯á¶áá±á¬ ááœá²á·á
ááºážááŸá¯áá¯á¶á
á¶ááá¯ááºáá
áºáá¯á á¥ááá¬ááᯠáááá¯ááºáááºá
Manifest ááá¯á
á
áºáá±ážáá«á base-valid.yaml
built-in ááŸáá·áº á
áááºááŒáá¯ááºá
ááºážáááºááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á áááºááẠcommand ááá¯áá¯á¶ážááá¯ááºáááºá
$ polaris audit --config config_with_custom_check.yaml --audit-path base-valid.yaml
Polaris ááẠá áááºááŒáá¯ááºá ááºážáááºááŸá¯áá»á¬ážááŸáá·áº áá±á«ááºážá ááºááŒá®áž ááá¹áá¬ááŸá áºáá¯áá¯á¶ážá á¡áá±á¬ááºážáá¯á¶ážáá»á¬ážááᯠáá±á«ááºážá ááºáá¬ážáááºá
á¡ááŒá¬ážáá áºáááºááœááºá Rego ááá¯á·ááá¯áẠJavaScript áá²á·ááá¯á·áá±á¬ ááá¯ááá¯á¡á¬ážáá±á¬ááºážááá·áºáá¬áá¬á áá¬ážáá»á¬ážááᯠá¡áá¯á¶ážáááŒá¯ááá¯ááºááŒááºážááẠááá¯ááá¯áá±ááºáá®áááºážááŒá¬ážáá±á¬á ááºážáááºááŸá¯áá»á¬ážááŒá¯áá¯ááºááŒááºážááᯠááá·áºáá¬ážááá¯ááºááá·áº ááá·áºáááºáá»ááºáá áºáá¯ááŒá áºáááºá
Polaris á áá±á¬ááºáááºá¡áá»ááºá¡áááºáá»á¬ážááᯠááœááºááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
á¡áá»ááºážáá»á¯ááº
Kubernetes YAML ááá¯ááºáá»á¬ážááᯠá á áºáá±ážá¡áá²ááŒááºááẠáááááá¬áá»á¬ážá áœá¬ááŸááá±á¬áºáááºážá á á¬áá±ážááœá²áá»á¬ážááᯠáááºáá²á·ááá¯á· áá¯á¶á á¶áá¯ááºááŒá®áž áá¯ááºáá±á¬ááºáááºááᯠááŸááºážáááºážá áœá¬ áá¬ážáááºááẠá¡áá±ážááŒá®ážáá«áááºá.
á¥ááá¬á¡á¬ážááŒáá·áº, á¡áááºá áááºááẠááá¯ááºááá¯ááºážááá¯ááŒááºááœá¬ážááá·áº Kubernetes ááá¯ááºááᯠáá°áá«á Kubeval ááẠááá¯ááá¯á·áá±á¬ ááá¯ááºááá¯ááºážá¡ááœáẠááááá¯á¶ážááŒá±ááŸááºáž ááŒá áºááá¯ááºáááº. á¡áá¬ááá¹áá¯áá»á¬ážá á¡áááá¹áá«ááºááœáá·áºááá¯áá»ááºáá»á¬ážááẠKubernetes API schema ááŸáá·áº ááá¯ááºáá®ááŸá¯ááŸááááŸáááᯠá á±á¬áá·áºááŒáá·áºáááºááŒá áºáááºá
ááá¯ááá¯á·ááŒááºáááºáá¯á¶ážáááºááŒááºážááŒá®ážáááºááŸáá·áºá á á¶á¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááŸáá·áº áááá»áá±á¬áá°áá«ááá»á¬ážááᯠááá¯ááºáá¬ááŒááºážáá²á·ááá¯á·áá±á¬ ááá¯ááá¯áá±ááºáá®áá±á¬á ááºážáááºááŸá¯áá»á¬ážááá¯á· áááºáááºáá¯ááºáá±á¬ááºááá¯ááºáááºá á€áá±áá¬ááœáẠkube-score ááŸáá·áº Polaris ááẠá¡áááºááŒá±áááºááŒá áºáááºá
ááŸá¯ááºááœá±ážáá±á¬ááá¯á¡ááºáá»ááºáá»á¬ážááŸáá·áº á¡áá±ážá áááºá á áºáá±ážááŸá¯áá»á¬ážááᯠá áááºááŒáá¯ááºááŒááºáááºááẠááá¯á¡ááºáá°áá»á¬ážá¡ááœááºá ááŒá±ážáá®á config-lint ááŸáá·áº confest ááẠááá·áºáá»á±á¬áºáááºááŒá áºáááºá.
Confest ááŸáá·áº config-lint ááẠá áááºááŒáá¯ááºá ááºážáááºááŸá¯áá»á¬ážááᯠáááºááŸááºááẠYAML ááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž copper ááẠááá·áºá¡á¬áž ááœá²áá±á¬ááºááŸá¯ááŸááá±á¬ ááœá±ážáá»ááºááŸá¯áá áºáá¯ááŒá áºá á±ááá·áº á¡ááŒáá·áºá¡ááááá¯ááááºážáááºážáá¬áá¬á áá¬ážááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºáá±ážáááºá
á¡ááŒá¬ážáá áºáááºááœááºá á€áááááá¬áá»á¬ážáá²á០áá áºáá¯ááᯠá¡áá¯á¶ážááŒá¯ááá»áá¯ážáááºáá«ááá¬ážá ááá¯á·ááŒá±á¬áá·áº á ááºážáááºááŸá¯á¡á¬ážáá¯á¶ážááᯠááá¯ááºááá¯ááºáááºáá®ážááŒááºáž ááá¯á·ááá¯áẠPolaris ááᯠááá¯ááŸá áºáááºááŒá®áž áááºážá¡ááœáẠááá¯á¡ááºáá±á¬á¡áá¬áá»á¬ážááá¯áᬠááá·áºáá«á áá®áá±ážááœááºážá¡ááœáẠááŸááºážááŸááºážáááºážáááºáž á¡ááŒá±áááŸááá«áá°ážá.
á¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážáá±á¬ááá¬ážááẠtool áá áºáá¯á á®áá¡áá±ážá áááºáá±á¬áºááŒáá»ááºááá¯áá±ážáááº-
tool áá
áºáá¯
ááŒáá¹á
áá»áá¯á·ááœááºážáá»ááº
á¡áá¯á¶ážááŒá¯áá°á
ááºážáááºááŸá¯áá»á¬áž
kubeval
API schema á áá®ážááŒá¬ážáá¬ážááŸááºážááᯠYAML á០á¡áááºááŒá¯áááºá
CRD ááŸáá·áº ááœá²ááááá«á
á¡áááºáá°áá»áŸá
kube-áááŸááº
YAML ááẠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áºáá»á¬ážááᯠááá·áºáá»ááºááŒá±á¬ááºáž ááá¯ááºážááŒá¬ážá
áááºááŒá¬áááºá
á¡áááºážá¡ááŒá
áºáá»á¬ážááᯠá
á
áºáá±ážááẠáááºá Kubernetes API áá¬ážááŸááºážááᯠááœá±ážááááá«á
á¡áááºáá°áá»áŸá
ááŒá±ážáá®
YAML manifests á¡ááœáẠá
áááºááŒáá¯áẠJavaScript á
ááºážáááºááŸá¯áá»á¬ážááᯠáááºáá®ážáááºá¡ááœáẠáá±áá¯áá»áá±á¬ááºáá
áºáá¯
built-in á
ááºážáááºááŸá¯áá»á¬ážáááŸááá«á á
á¬ááœááºá
á¬áááºážáá¶á·áááºá
ááá¯
config-lint
YAML ááœáẠááá·áºááœááºážáá¬ážáá±á¬ ááá¯ááááºážá¡ááá¯áẠáá¬áá¬á
áá¬ážáá
áºáá¯ááœáẠá
ááºážáááºááŸá¯áá»á¬áž áááºáá®ážááŒááºážá¡ááœáẠáá±áá°áá»áá°áá±á¬ááºá á¡áá»áá¯ážáá»áá¯ážáá±á¬ ááœá²á·á
ááºážááŸá¯áá¯á¶á
á¶áá»á¬ážááᯠáá¶á·ááá¯ážááẠ(á¥ááᬠTerraform)
á¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ á
ááºážáááºááŸá¯áá»á¬áž áááŸááá«á ááá·áºááœááºážááŒá±á¬ááá¯ááŸá¯áá»á¬ážááŸáá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬áž ááá¯á¶áá±á¬ááºáá«á
ááá¯
ááŒáá¯ááºááá¯ááºááŸá¯
Rego (á¡áá°ážááŒá¯áá±ážááŒááºážááŸá¯áá¬áá¬á
áá¬áž) ááᯠá¡áá¯á¶ážááŒá¯á ááá·áºááá¯ááºááá¯ááºá
ááºážáááºááŸá¯áá»á¬ážááᯠáááºáá®ážáááºá¡ááœáẠáá°áá±á¬ááºáá
áºáá¯á OCI á¡á
á¯á¡áá±ážáá»á¬ážááŸáá
áºááá·áº áá°áá«ááá»á¬ážááᯠáá»áŸáá±ááœáá·áºááŒá¯áááºá
built-in á
ááºážáááºááŸá¯áá»á¬ážáááŸááá«á áá« Rego áááºáá°ááááºá áá°áá«ááá»á¬ážááᯠáá¯ááºáá±ááá·áºá¡áá« Docker Hub ááᯠááá¶á·ááá¯ážáá«á
ááá¯
Polaris
áá¯á¶ážáááºáá»ááºáá»á¬áž YAML ááẠá
á¶á¡áá±á¬ááºážáá¯á¶áž á¡áá±á·á¡áá»áá·áºáá»á¬ážááᯠááá·áºáá»ááºáááºá JSON Schema ááᯠá¡áá¯á¶ážááŒá¯á ááá·áºááá¯ááºááá¯áẠá
ááºážáááºááŸá¯áá»á¬ážááᯠáááºáá®ážááá¯ááºá
á±áá«áááºá
JSON Schema ááá¯á¡ááŒá±áá¶á á
ááºážáááºááá¯ááºá
áœááºážááẠááá¯á¶áá±á¬ááºáá«á
ááá¯
á€áááááá¬áá»á¬ážááẠKubernetes á¡á á¯á¡áá±ážááá¯á· áááºáá±á¬ááºááœáá·áºá¡áá±á«áº á¡á¬ážáááá¯ážáá±á¬ááŒá±á¬áá·áº áááºážááá¯á·ááᯠáááºáááºááẠááœááºáá°áá«áááºá áááºážááá¯á·ááẠááá·áºá¡á¬áž á¡áááºážá¡ááŒá áºááá¯ááºáá»á¬ážááᯠá á áºáá¯ááºááá¯ááºááŒá®áž ááá±á¬áá»ááºáá»á¬ážááœáẠááœá²áá°áá±á¬ááºážááá¯ááŸá¯áá»á¬ážá áá±ážáá¬ážáá°áá»á¬ážááᯠá¡ááŒááºáá¯á¶á·ááŒááºáá»ááºáá±ážááá¯ááºáááºá
PS áá¬áá¬ááŒááºááŸ
áá»áœááºá¯ááºááá¯á·áááá±á¬á·ááºááœááºáááºážáááºáá«
- «
Kubernetes á¡á á¯á¡áá±ážáá»á¬ážááᯠáá»ááºážáá¬á á±áááºá¡ááœáẠPolaris ááᯠááááºáááºáá±ážáá²á·áááºá "; - «
Kubernetes á¡ááœáẠYAML áá¶á·ááá¯ážááŸá¯ááŒáá·áº Vim "; - «
Google á¡á ááœááºááááºáá¬á¡áá¯á¶ážááŒá¯ááŒááºážá¡ááœáẠá¡áá±á¬ááºážáá¯á¶ážá¡áá±á·á¡áá»áá·áº 7 áᯠ"á
source: www.habr.com