Kubernetes 이야기

Prometheus-operator를 사용하여 Prometheus 및 Grafana 설치 본문

Kubernetes/모니터링

Prometheus-operator를 사용하여 Prometheus 및 Grafana 설치

kmaster 2022. 5. 9. 23:06
반응형

Kubernetes에서는 다양한 Pod들이 서비스가 되고 있다. 이 때 모니터링은  관리자나 개발자에게 무엇보다 중요한 일이 될 것이다. Kubernetes에서 다양한 모니터링 솔루션들이 있으나, 가장 범용적으로 많이 사용되는 도구는 Prometheus-Grafana 조합일 것이다.

 

Prometheus에는 일정시간 간격으로 모니터링 데이터를 수집하고 기본적으로 CPU, Memory, Disk IO, Network IO 등이 포함되고, ServiceMonitor 등을 통해 Third party Container의 모니터링 데이터도 수집한다.

Grafana는 이런 수집된 데이터를 각종 차트를 이용하여 사용자에게 시각화해 주는 도구이다.

( Thanos Project는 여러 Cluster에 설치된 Prometheus를 중앙에서 모니터링 해 줄수 있는 도구이다. 여러 클러스터를 사용하는 경우에는 Thanos-Prometheus 조합으로 하면 좋겠다. )

 

이제 Prometheus operator를 사용하여 Kubernetes Cluster에 Prometheus와 Grafana를 설치해보자.

 

설치

 

설치파일은 https://github.com/prometheus-operator/kube-prometheus 를 참고한다.

 

버전별로 지원하는 Kubernetes가 다르기 때문에 해당하는 버전으로 설치해야 한다.

(현재 설치하는 Kubernetes 버전은 1.24인데 아직 1.24 는 지원하지 않는다. main 버전으로 설치해 보자.)

kube-prometheus stack Kubernetes 1.19 Kubernetes 1.20 Kubernetes 1.21 Kubernetes 1.22 Kubernetes 1.23
release-0.7
release-0.8
release-0.9
release-0.10
main

 

1. 우선, git에서 소스를 clone한다.

# git clone https://github.com/prometheus-operator/kube-prometheus.git
# cd kube-prometheus

 

2. 모니터링 Namespace 및 CustomeResourceDefinitions 생성

# kubectl apply --server-side -f manifests/setup
customresourcedefinition.apiextensions.k8s.io/alertmanagerconfigs.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/alertmanagers.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/podmonitors.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/probes.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/prometheuses.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/prometheusrules.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/servicemonitors.monitoring.coreos.com serverside-applied
customresourcedefinition.apiextensions.k8s.io/thanosrulers.monitoring.coreos.com serverside-applied
namespace/monitoring serverside-applied

 

 

3. Prometheus 모니터링 스택 배포

# kubectl apply -f manifests/

 

설치된 내역을 확인해 보자.

# kubectl get all -n monitoring
NAME                                       READY   STATUS    RESTARTS   AGE
pod/alertmanager-main-0                    2/2     Running   0          94s
pod/alertmanager-main-1                    2/2     Running   0          94s
pod/alertmanager-main-2                    2/2     Running   0          94s
pod/blackbox-exporter-cdfcdbbc4-5rsf9      3/3     Running   0          2m11s
pod/grafana-f666d4fdd-gj2pm                1/1     Running   0          2m11s
pod/kube-state-metrics-7958cb65cc-m4pbg    3/3     Running   0          2m11s
pod/node-exporter-2gxcb                    2/2     Running   0          2m10s
pod/node-exporter-lg5v6                    2/2     Running   0          2m10s
pod/node-exporter-wd2zb                    2/2     Running   0          2m10s
pod/prometheus-adapter-5f68766c85-4q4bf    1/1     Running   0          2m10s
pod/prometheus-adapter-5f68766c85-zrrpv    1/1     Running   0          2m10s
pod/prometheus-k8s-0                       2/2     Running   0          93s
pod/prometheus-k8s-1                       2/2     Running   0          93s
pod/prometheus-operator-58558bd455-9mwzc   2/2     Running   0          2m10s

NAME                            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/alertmanager-main       ClusterIP   10.107.224.184   <none>        9093/TCP,8080/TCP            2m11s
service/alertmanager-operated   ClusterIP   None             <none>        9093/TCP,9094/TCP,9094/UDP   94s
service/blackbox-exporter       ClusterIP   10.104.137.30    <none>        9115/TCP,19115/TCP           2m11s
service/grafana                 ClusterIP   10.105.237.44    <none>        3000/TCP                     2m11s
service/kube-state-metrics      ClusterIP   None             <none>        8443/TCP,9443/TCP            2m11s
service/node-exporter           ClusterIP   None             <none>        9100/TCP                     2m10s
service/prometheus-adapter      ClusterIP   10.111.83.82     <none>        443/TCP                      2m10s
service/prometheus-k8s          ClusterIP   10.99.2.55       <none>        9090/TCP,8080/TCP            2m10s
service/prometheus-operated     ClusterIP   None             <none>        9090/TCP                     93s
service/prometheus-operator     ClusterIP   None             <none>        8443/TCP                     2m10s

NAME                           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/node-exporter   3         3         3       3            3           kubernetes.io/os=linux   2m10s

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/blackbox-exporter     1/1     1            1           2m11s
deployment.apps/grafana               1/1     1            1           2m11s
deployment.apps/kube-state-metrics    1/1     1            1           2m11s
deployment.apps/prometheus-adapter    2/2     2            2           2m10s
deployment.apps/prometheus-operator   1/1     1            1           2m10s

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/blackbox-exporter-cdfcdbbc4      1         1         1       2m11s
replicaset.apps/grafana-f666d4fdd                1         1         1       2m11s
replicaset.apps/kube-state-metrics-7958cb65cc    1         1         1       2m11s
replicaset.apps/prometheus-adapter-5f68766c85    2         2         2       2m10s
replicaset.apps/prometheus-operator-58558bd455   1         1         1       2m10s

NAME                                 READY   AGE
statefulset.apps/alertmanager-main   3/3     94s
statefulset.apps/prometheus-k8s      2/2     93s

 

이제, Grafana에 접속해 보자. 편의상 grafana 서비스를 NodePort 로 변경한 후 접속해 보겠다.

 

하지만 NodePort 로 변경 후 호출하였으나 접속이 안된다. 이유는 NetworkPolicy 정책때문이다.

 

# k get networkpolicies.networking.k8s.io -n monitoring
NAME                  POD-SELECTOR                                                                                                                                             AGE
alertmanager-main     app.kubernetes.io/component=alert-router,app.kubernetes.io/instance=main,app.kubernetes.io/name=alertmanager,app.kubernetes.io/part-of=kube-prometheus   54m
blackbox-exporter     app.kubernetes.io/component=exporter,app.kubernetes.io/name=blackbox-exporter,app.kubernetes.io/part-of=kube-prometheus                                  54m
grafana               app.kubernetes.io/component=grafana,app.kubernetes.io/name=grafana,app.kubernetes.io/part-of=kube-prometheus                                             3s
kube-state-metrics    app.kubernetes.io/component=exporter,app.kubernetes.io/name=kube-state-metrics,app.kubernetes.io/part-of=kube-prometheus                                 54m
node-exporter         app.kubernetes.io/component=exporter,app.kubernetes.io/name=node-exporter,app.kubernetes.io/part-of=kube-prometheus                                      54m
prometheus-adapter    app.kubernetes.io/component=metrics-adapter,app.kubernetes.io/name=prometheus-adapter,app.kubernetes.io/part-of=kube-prometheus                          54m
prometheus-k8s        app.kubernetes.io/component=prometheus,app.kubernetes.io/instance=k8s,app.kubernetes.io/name=prometheus,app.kubernetes.io/part-of=kube-prometheus        54m
prometheus-operator   app.kubernetes.io/component=controller,app.kubernetes.io/name=prometheus-operator,app.kubernetes.io/part-of=kube-prometheus                              54m

 

기본 설치를 진행하면 위와 같이 다양한 networkpolicy 정책이 반영되어 있다.

# cat grafana-networkPolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  labels:
    app.kubernetes.io/component: grafana
    app.kubernetes.io/name: grafana
    app.kubernetes.io/part-of: kube-prometheus
    app.kubernetes.io/version: 8.5.1
  name: grafana
  namespace: monitoring
spec:
  egress:
  - {}
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app.kubernetes.io/name: prometheus
    ports:
    - port: 3000
      protocol: TCP
  podSelector:
    matchLabels:
      app.kubernetes.io/component: grafana
      app.kubernetes.io/name: grafana
      app.kubernetes.io/part-of: kube-prometheus
  policyTypes:
  - Egress
  - Ingress

 

대부분 내부에서만 작동되도록 되어 있어  Grafana를 조회하려면 접속하려면 PC의 ipBlock등을 설정해야 한다.

자세한 설정 방법은 아래를 참고한다.

https://kmaster.tistory.com/70

 

Network Policy

Kubernetes에서는 다양한 Resource들 ( Deployment, Service, Secret, Configmap, PVC ... ) 존재한다. 이러한 Resource들은 Namespace에 속하고, RBAC 권한에 따라 다른 Namespace의 Resource들을 참조하지 못하..

kmaster.tistory.com

 

Grafana의 networkpolicy를 수정한 후 접속하면 아래와 같이 조회된다.

 

 

초기 계정 정보

ID admin
Password admin

 

로그인을 성공하면 Password 변경화면이 나타난다.

 

접속해보면 다양한 형태의 대시보드들을 지원한다.

 

 

 

삭제

 

삭제하고자 하는 경우에는 다음을 실행한다.

# kubectl delete --ignore-not-found=true -f manifests/ -f manifests/setup

 

반응형
Comments