Kubernetes Prometheus Monitoring
Prometheus
프로메테우스는 오픈소스 기반의 모니터링, 알람 도구이다. 다른 모니터링 도구와 다른점은 각 서버에 설치된 agent가 메트릭 데이터를 전송하는 것이 아니라 수집 서버에서 각 서버들의 메티릭 데이터를 수집하는 구조이다.
Prometheus는 크게 3가지 구성요소가 있다. 첫번째는 Prometheus server
이다. Prometheus server
는 각 서버들의 메트릭 정보를 수집한다. 두번째는 Expoter
이다. Expoter
는 각 서버에 설치되며 해당 서버의 메트릭 데이터를 HTTP Server를 통해 제공한다. Prometheus server
는 HTTP Server의 Endpoint에서 데이터를 가져가게 된다. 마지막은 Alertmanager
이다. Alertmanager
는 규칙에 따라 알림을 만들고 전송할 수 있게 만들어 준다.
Service Discovery
- Service Discovery는 Prometheus가 수집해야하는 대상(Target)의 정보를 수집하는 과정을 말한다. Prometheus에서는 다양한 종류의 Target을 찾을 수 있도록 지원한다.
- Prometheus는 Kubernetes의 다양한 리소스를 Target으로 찾을 수 있도록 지원한다.
<kubernetes_sd_config>
를 통해 설정할 수 있고,node
service
pod
endpints
endpointslice
ingress
를 지원한다.
Kubernetes Setting
Kubernetes의 리소스들의 정보를 수집하기 위해서는 권한 설정과 prometheus 설정 등을 만들어 줘야한다.
1. RBAC 설정
Kubernetes에 연결된 노드의 정보를 조회하기 위해서는 권한이 필요하다. 아래는 Namespace
ServiceAccount
ClusteRrole
ClusterRoleBinding
을 생성한다.
apiVersion: v1
kind: Namespace
metadata:
name: monitoring
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: monitoring
namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: monitoring
namespace: monitoring
rules:
- apiGroups: [""]
resources:
- nodes/metrics
verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: monitoring
subjects:
- kind: ServiceAccount
name: monitoring
namespace: monitoring
roleRef:
kind: ClusterRole
name: monitoring
apiGroup: rbac.authorization.k8s.io
2. Configmap 설정
Prometheus는 prometheus.yaml파일을 통해 설정을 하게 된다. 아래는 Prometheus 서버에서 다른 node에 직접 접근해서 metrics를 수집하도록 하였다. 하지만 tls 인증은 skip 하도록 되어있다. 각 서버에는 Kubernetes API 서버의 CA인증서는 있으나 각 노드의 kubelet에 인증은 되지 않기 때문에 skip하였다.
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: null
name: prometheus-server-conf
namespace: monitoring
data:
prometheus.yaml: |-
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: node
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
만약 보안에 문제가 우려된다면 API서버로 metrics를 받아올 수 도 있다.
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: null
name: prometheus-server-conf
namespace: monitoring
data:
prometheus.yaml: |-
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: node
scheme: https
# -- ca 인증서 설정 -- #
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
# -- API 서버로 Endpoint 변경 -- #
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- target_label: __address__
replacement: kubernetes.default.svc:443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics
3. Prometheus Server
apiVersion: v1
kind: PersistentVolume
metadata:
name: prometheus-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/mnt/data"
---
apiVersion: v1
kind: Service
metadata:
name: prometheus-server-http
namespace: monitoring
labels:
app: prometheus
annotations:
prometheus.io/scrape: "true"
spec:
selector:
app: prometheus
type: NodePort
ports:
- port: 9090
nodePort: 32100
protocol: TCP
name: prometheus
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: prometheus-server
namespace: monitoring
labels:
app: prometheus
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
serviceName: prometheus-server-http
volumeClaimTemplates:
- metadata:
name: prometheus-storage
namespace: monitoring
spec:
accessModes:
- ReadWriteOnce
storageClassName: manual
resources:
requests:
storage: 5Gi
template:
metadata:
labels:
app: prometheus
spec:
serviceAccountName: monitoring
securityContext:
runAsUser: 0
volumes:
- name: prometheus-server-conf
configMap:
defaultMode: 420
name: prometheus-server-conf
containers:
- name: prometheus
image: prom/prometheus:v2.20.1
ports:
- name: prometheus
containerPort: 9090
volumeMounts:
- name: prometheus-storage
mountPath: /prometheus
- name: prometheus-server-conf
mountPath: /etc/prometheus
args:
- "--storage.tsdb.path=/prometheus"
- "--storage.tsdb.retention.time=1d"
- "--config.file=/etc/prometheus/prometheus.yaml"
- "--web.enable-admin-api"