-
Kubernetes Prometheus MonitoringTool 2023. 8. 1. 11:45728x90반응형
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"
Reference
728x90반응형