티스토리 뷰
Grafana Dashboard를 통해 gatekeeper 모니터링을 하려 했으나
공식적으로 관리되어지는 dashboard가 없는 상황이었다.
- https://github.com/open-policy-agent/gatekeeper/issues/2081
- https://github.com/open-policy-agent/gatekeeper/issues/2070
- https://github.com/open-policy-agent/gatekeeper/issues/897
하여 검색되어지는 dashboard중 나름 최신인 다음 dashboard를 사용한 내용을 정리해보려 한다.
Prerequisite
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' 카테고리의 다른 글
fluentbit with azure blob storage (0) | 2024.08.27 |
---|---|
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 |
- Total
- Today
- Yesterday
- vmware openstack
- Jenkinsfile
- OpenStack
- DevSecOps
- openstack backup
- jenkins
- openstacksdk
- boundary ssh
- kubernetes
- nginx-ingress
- ceph
- Terraform
- ansible
- metallb
- hashicorp boundary
- K3S
- azure policy
- open policy agent
- wsl2
- socket
- kubernetes install
- Helm Chart
- minikube
- GateKeeper
- macvlan
- aquasecurity
- mattermost
- minio
- kata container
- crashloopbackoff
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |