티스토리 뷰

Cloud/Kubernetes

Gatekeeper monitoring and logging

Jacob_baek 2023. 5. 26. 17:36

Grafana Dashboard를 통해 gatekeeper 모니터링을 하려 했으나
공식적으로 관리되어지는 dashboard가 없는 상황이었다.

하여 검색되어지는 dashboard중 나름 최신인 다음 dashboard를 사용한 내용을 정리해보려 한다.

prerequiste

prometheus와 grafana 그리고 gatekeeper가 준비되었다는 가정하에 아래와 같은 추가 component 배포 및 설정이 필요하다.

kubernetes service discovery

gatekeeper에서 제공하는 metric을 수집하기 위한 service discovery를 수행하는 job을 지정해보자.
다음 링크를 참조하여 kubernetes_sd_configs를 사용하는 service discovery를 생성한다.

실제 생성에 사용한 job은 다음과 같다.

- job_name: 'kubernetes-pods'
  kubernetes_sd_configs:
  - role: pod
  relabel_configs:
  - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
    action: keep
    regex: true
  - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
    action: replace
    regex: ([^:]+)(?::\d+)?;(\d+)
    replacement: $1:$2
    target_label: __address__
  - action: labelmap
    regex: __meta_kubernetes_pod_label_(.+)
  - source_labels: [__meta_kubernetes_namespace]
    action: replace
    target_label: kubernetes_namespace
  - source_labels: [__meta_kubernetes_pod_name]
    action: replace
    target_label: kubernetes_pod_name
  - source_labels: [__meta_kubernetes_pod_node_name]
    action: replace
    target_label: kubernetes_nodename

위에 지정한 nodename 부터 pod_name, namespace 등이 prometheus에 label로 선택이 가능하다.

이후 아래와 같이 annotation을 pod에 지정하여 service discovery에 의해 scrap이 이루어질수 있도록 한다.

$ kubectl get pod -l app=gatekeeper -n gatekeeper-system -o jsonpath='{.items[*].metadata.annotations}' | jq
{
  "prometheus.io/port": "8888",
  "prometheus.io/scrap": "true"
}
{
  "prometheus.io/port": "8888",
  "prometheus.io/scrape": "true"
}
{
  "prometheus.io/port": "8888",
  "prometheus.io/scrape": "true"
}
{
  "prometheus.io/port": "8888",
  "prometheus.io/scrape": "true"
}

opa-scorecard

위 dashboard는 opa-scorecard 라는 별도의 exporter를 요구한다.
실제 opa_scorecard를 prefix로 하는 metric으로 dashboard panel이 존재한다.

kubectl create ns opa-exporter
kubectl apply -f https://raw.githubusercontent.com/mcelep/opa-scorecard/master/exporter-k8s-resources/clusterrole.yaml
kubectl apply -f https://raw.githubusercontent.com/mcelep/opa-scorecard/master/exporter-k8s-resources/clusterrolebinding.yaml
kubectl apply -f https://raw.githubusercontent.com/mcelep/opa-scorecard/master/exporter-k8s-resources/deployment.yaml
kubectl apply -f https://raw.githubusercontent.com/mcelep/opa-scorecard/master/exporter-k8s-resources/service.yaml

위와 같이 opa-exporter를 설치하게되면 0.0.3 버전으로 설치가 되어 진다.
아래와 같이 0.0.4로 변경한다. (0.0.3에서는 몇가지 metric이 제공되지 않아 0.0.4로 해야 한다.)

$ kubectl get deploy opa-exporter -n opa-exporter -o jsonpath='{.spec.template.spec.containers[].image}'
mcelep/opa_scorecard_exporter:v0.0.4

이후 scrap을 위해 아래와 같은 annotation을 추가한다.

$ kubectl get pod -n opa-exporter -o jsonpath='{.items[*].metadata.annotations}' | jq
{
  "prometheus.io/port": "9141",
  "prometheus.io/scrape": "true"
}

kube-prometheus-stack 을 이용한 monitoring 환경 구성

아래와 같은 secret을 생성한다.

$ cat prometheus-additional.yaml
- job_name: "gatekeeper-metrics"
  static_configs:
  - targets: ["gatekeeper-webhook-service.gatekeeper-system:8888"]
$ kubectl create secret generic additional-scrape-configs --from-file=prometheus-additional.yaml --dry-run=client -oyaml > additional-scrape-configs.yaml
$ kubectl apply -f additional-scrape-configs.yaml -n monitoring
secret/additional-scrape-configs created

summary

모든 작업을 완료하게 되면 아래와 같은 dashboard가 출력된다.(violation에 따라 dynamic 하게 변동이 된다.)

logging

kubectl 로 명령 수행시 deny된 경우 default 설정으로는 로그를 남기지 않는다.
실제 관리자가 이런 명령을 수행했는지 알기 위해 "--log-denies=true" argument를 gatekeeper-controller에 추가해준다.

$ kubectl get deploy/gatekeeper-controller-manager -n gatekeeper-system -o jsonpath='{.spec.template.spec.containers[].args}' | jq
[
  "--port=8443",
  "--logtostderr",
  "--exempt-namespace=gatekeeper-system",
  "--operation=webhook",
  "--operation=mutation-webhook",
  "--disable-opa-builtin={http.send}",
  "--log-denies=true"
]

이후 로그를 확인해보면 아래와 같은 로그가 남겨진다.

gatekeeper-controller-manager-5c4d66fb9c-r26r5 {"level":"info","ts":1686730427.7662854,"logger":"webhook","msg":"denied admission: container <testdeny> uses not allowed podname : <testdeny>","process":"admission","event_type":"violation","constraint_name":"custompodnamedeny","constraint_group":"constraints.gatekeeper.sh","constraint_api_version":"v1beta1","constraint_kind":"podnamedeny","constraint_action":"deny","resource_group":"","resource_api_version":"v1","resource_kind":"Pod","resource_namespace":"default","resource_name":"testdeny","request_username":"masterclient"}

metric

아래 metric들이 기본제공된다.

'Cloud > Kubernetes' 카테고리의 다른 글

kubernetes_sd_config on Prometheus  (0) 2023.06.13
Eraser (Image cleaner)  (0) 2023.04.25
trivy-operator  (0) 2023.04.01
Postee  (0) 2023.03.17
kubent(no trouble)  (0) 2023.03.14
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함