..

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에 로그인 후 사용가능하다.

1-0

dashboard를 확인해보면 action on failure가 monitor로 되어있는 것을 볼 수 있다. 기본으로 enforce설정이 비활성화 되어있어 정책 검증 시 실패했어도 경고만하고 클러스터에 적용이 된다. 🔗

1-1

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이 된 것을 대시보드에서도 확인할 수 있음

1-2

위 캡처의 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를 통과하지 못하였고, 어떠한 규칙들에 통과되지 정도만 확인할 수 있다.

1-3

대시보드 확인해보기

대시보드의 cluster탭을 보면 주황박스의 C가 있다. datree 스캔하면서 정책에 통과 못한 수에따라 A-E로 등급이 매겨진다. 그 아래 failed rules이라고 통과되지 한 규칙들이 있다. 이 failed rule을 클릭하거나 좌측의 repairing 탭에 가면 각 네임스페이스별로 실패한 리소스들을 확인할 수도 있고, 해결방안도 같이 제시된다.

1-4

이런식으로 고치는 예시가 제시된다. 이것을 보고 배포된 resource yaml 형식에 맞춰 고쳐야한다.

1-5

배포되어있는 리소스를 확인해보면.. 12개씩이나 규칙을 통과하지 못했다.

1-6

+-----------------------------------+-----------------------+
| 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라는 정책이 있고 그 안에 많은 규칙들이 생성되어있다.

1-7

ns별 policy 다르게 적용

policy 생성

정책을 생성하면 기본인 규칙들이 들어있고, 버튼으로 활성/비활성화를 할 수 있다. 그 중에서 eks 규칙만 몇개 활성화해줬다. 🔗

1-9

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로 확인할 수 있다.

1-8

테스트

# 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의 리소스에는 문제가 없는 것을 확인 가능하다.

1-10

1-11


참고