aews) datree 체험기
이번주차 과제를 뭐할지 도전과제를 훑어보다가 처음 본 툴이 있어 사용해봤다. datree는 kubernetes cluster의 리소스들이 생성하기에 오류가 있는지 확인해주는 도구이다. 🔗
설치
install datree
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# helm repo add datree-webhook https://datreeio.github.io/admission-webhook-datree
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# helm repo update
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# helm install -n datree datree-webhook datree-webhook/datree-admission-webhook --debug \
--create-namespace --set datree.token=$TOKEN
# token은 https://app.datree.io/webhook-instructions 에서 확인할 수 있다.
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# k get all -n datree
NAME READY STATUS RESTARTS AGE
pod/datree-cluster-scanner-server-7bcbd84658-74lch 1/1 Running 0 2m21s
pod/datree-webhook-server-558f65987c-gchlv 1/1 Running 0 2m21s
pod/datree-webhook-server-558f65987c-wfw4n 1/1 Running 0 2m21s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/datree-webhook-server ClusterIP 10.100.134.248 <none> 443/TCP 2m22s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/datree-cluster-scanner-server 1/1 1 1 2m21s
deployment.apps/datree-webhook-server 2/2 2 2 2m21s
NAME DESIRED CURRENT READY AGE
replicaset.apps/datree-cluster-scanner-server-7bcbd84658 1 1 1 2m21s
replicaset.apps/datree-webhook-server-558f65987c 2 2 2 2m21s
scanner-server는 기본적으로 1시간에 한번 cluster를 스캔한다. datree.scanIntervalHours 옵션으로 변경이 가능하지만 1시간보다 적게는 설정이 불가능하다. 수동으로는 대시보드에서 하거나 아래와 같이 job을 배포하여 가능하다. 🔗
kubectl delete jobs/scan-job -n datree; kubectl create job --from=cronjob/scan-cronjob scan-job -n datree
datree의 동작방식은 사용자가 kubectl등 명령어를 내려 k8s api-server를 호출하는 이벤트가 발생되면, api-server는 datree webhook으로 요청한다. 그러면 이제 이 작업을 검증을하게되는데, depoloyment로 배포된 webhook server에 저장되어 있는 policy를 기준으로 검증하게된다. 이 때 검증 결과의 메타데이터를 대시보드로 내보내게된다. 🔗 대시보드는 클러스터내에 띄우는 것이 아니라 datree에서 제공이 되어 app.datree.io에 로그인 후 사용가능하다.
dashboard를 확인해보면 action on failure가 monitor로 되어있는 것을 볼 수 있다. 기본으로 enforce설정이 비활성화 되어있어 정책 검증 시 실패했어도 경고만하고 클러스터에 적용이 된다. 🔗
enable enforce
# datree.enforce: 정책 검증에 실패한 리소스는 클러스터에 적용되지 않도록 차단 (configFromHelm: true 경우만 사용 가능)
# datree.configFromHelm: dashboard가 아닌 helmchart를 통해서 옵션 관리할 수 있음
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# helm upgrade -n datree datree-webhook datree-webhook/datree-admission-webhook \
--set datree.token=$TOKEN --set datree.clusterName=$(kubectl config current-context) \
--set datree.enforce=true --set datree.configFromHelm=true
action on failure의 값이 block이 된 것을 대시보드에서도 확인할 수 있음
위 캡처의 kubernetes version이 검증하려는 클러스터의 버전과 동일해야한다. 다를 경우, 좌측상단의 workspace > settings > default server version 에서 변경할 수 있다. 혹은 명령어로 확인 시 –schema-version 옵션을 붙여 쓸 수도 있다.
install datree cli
# 대시보드 메인의 우측 </>local을 클릭하여 cli 설치
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# curl https://get.datree.io | /bin/bash
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# datree config set token $TOKEN
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# k create deployment test --image=nginx --dry-run=client -oyaml > testdeploy.yaml
# 이렇게 먼저 테스트 해볼 수 있다.
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# datree test testdeploy.yaml
확인해보기
배포하여 확인해보기
# 위에서 만든 yaml 파일을 배포하려하면 policy에 통과하지 못해 리소스 생성이 되지않는다.
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# datree test testdeploy.yaml
>> File: testdeploy.yaml
[V] YAML validation
[V] Kubernetes schema validation
[X] Policy check
...
(Summary)
- Passing YAML validation: 1/1
- Passing Kubernetes (v1.24.13-eks-0a21954) schema validation: 1/1
- Passing policy check: 0/1
+-----------------------------------+-----------------------+
| Enabled rules in policy "Starter" | 67 |
| Configs tested against policy | 1 |
| Total rules evaluated | 67 |
| Total rules skipped | 0 |
| Total rules failed | 13 |
| Total rules passed | 54 |
| See all rules in policy | https://app.datree.io |
+-----------------------------------+-----------------------+
# 아무것도 배포되지 않았다..
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# k get deployment
No resources found in default namespace.
log에서도 실패한 것을 확인할 수있다. 내용을 보면 policy check를 통과하지 못하였고, 어떠한 규칙들에 통과되지 정도만 확인할 수 있다.
대시보드 확인해보기
대시보드의 cluster탭을 보면 주황박스의 C가 있다. datree 스캔하면서 정책에 통과 못한 수에따라 A-E로 등급이 매겨진다. 그 아래 failed rules이라고 통과되지 한 규칙들이 있다. 이 failed rule을 클릭하거나 좌측의 repairing 탭에 가면 각 네임스페이스별로 실패한 리소스들을 확인할 수도 있고, 해결방안도 같이 제시된다.
이런식으로 고치는 예시가 제시된다. 이것을 보고 배포된 resource yaml 형식에 맞춰 고쳐야한다.
배포되어있는 리소스를 확인해보면.. 12개씩이나 규칙을 통과하지 못했다.
+-----------------------------------+-----------------------+
| Enabled rules in policy "Starter" | 67 |
| Configs tested against policy | 1 |
| Total rules evaluated | 67 |
| Total rules skipped | 0 |
| Total rules failed | 12 |
| Total rules passed | 55 |
| See all rules in policy | https://app.datree.io |
+-----------------------------------+-----------------------+
조금 고쳐보면.. total rules failed와 passed의 숫자가 변한 것을 볼 수 있다.
이 규칙들이 어디에 있냐면, Enabled rules in policy "Starter"
+-----------------------------------+-----------------------+
| Enabled rules in policy "Starter" | 67 |
| Configs tested against policy | 1 |
| Total rules evaluated | 67 |
| Total rules skipped | 0 |
| Total rules failed | 9 |
| Total rules passed | 58 |
| See all rules in policy | https://app.datree.io |
+-----------------------------------+-----------------------+
위 규칙들은 좌측의 policies 에서 확인 할 수 있다. 기본으로 starter라는 정책이 있고 그 안에 많은 규칙들이 생성되어있다.
ns별 policy 다르게 적용
policy 생성
정책을 생성하면 기본인 규칙들이 들어있고, 버튼으로 활성/비활성화를 할 수 있다. 그 중에서 eks 규칙만 몇개 활성화해줬다. 🔗
multi policies 적용
# ns=test 경우에만 새로만든 testpolicy를 적용되도록 작성했다.
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# cat policy_values.yaml
datree:
configFromHelm: true
multiplePolicies:
- policy: "testpolicy"
namespaces:
includePatterns:
- "test"
- policy: "Starter"
namespaces:
includePatterns:
- ".*"
excludePatterns:
- "test"
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# helm upgrade -n datree datree-webhook datree-webhook/datree-admission-webhook \
--set datree.token=$TOKEN --set datree.clusterName=$(kubectl config current-context) \
--set datree.enforce=true --set datree.configFromHelm=true \
-f policy_values.yaml
Release "datree-webhook" has been upgraded. Happy Helming!
NAME: datree-webhook
LAST DEPLOYED: Fri Jun 2 23:56:35 2023
NAMESPACE: datree
STATUS: deployed
REVISION: 6
TEST SUITE: None
대시보드에서도 active policy에 muliple로 확인할 수 있다.
테스트
# test yaml
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# cat testdeploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: test
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: test
spec:
containers:
- image: nginx
name: nginx
resources:
requests:
memory: 128Mi
limits:
memory: 128Mi
securityContext:
capabilities:
add:
- AUDIT_WRITE
securityContext:
seccompProfile:
type: RuntimeDefault
# ns 지정없이 기본 default ns에 배포시, Starter policy가 적용되면서 검증에 실패하여 배포되지 못한다.
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# k apply -f testdeploy.yaml
Error from server: error when creating "testdeploy.yaml": admission webhook "datree-webhook-server.datree.svc" denied the request:
---
webhook-test-Deployment.tmp.yaml
[V] YAML validation
[V] Kubernetes schema validation
[X] Policy check
...
(Summary)
- Passing YAML validation: 1/1
- Passing Kubernetes (v1.24.13-eks-0a21954) schema validation: 1/1
- Passing policy check: 0/1
+-----------------------------------+-----------------------+
| Enabled rules in policy "Starter" | 59 |
| Configs tested against policy | 1 |
| Total rules evaluated | 59 |
| Total rules skipped | 0 |
| Total rules failed | 5 |
| Total rules passed | 54 |
| See all rules in policy | https://app.datree.io |
+-----------------------------------+-----------------------+
# test ns에 배포 시 모든 규칙에 통과되었기 때문에 문제없이 생성된다.
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# k apply -f testdeploy.yaml -n test
deployment.apps/test created
(eunyoung@myeks:N/A) [root@myeks-bastion ~]# k get all -n test
NAME READY STATUS RESTARTS AGE
pod/test-7b87cd799f-d8qv9 1/1 Running 0 3m27s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/test 1/1 1 1 3m28s
NAME DESIRED CURRENT READY AGE
replicaset.apps/test-7b87cd799f 1 1 1 3m27s
대시보드 로그에서 볼 수 있고, test ns의 리소스에는 문제가 없는 것을 확인 가능하다.
참고