- Loki Stack은 loki, promtail, grafana로 구성된 플랫폼 조합이다.
- K8S 클러스터로부터 promtail 수집한 로그를 loki에 적재하면, loki는 수집된 로그를 저장하고 요청에 따라 검색 기능을 제공한다. 그리고 Grafana를 통해 loki에 적재된 데이터를 시각화한다.
- Grafana Loki (grafana/loki:2.6.0)
- Grafana Promtail (grafana/promtail:2.6.0)
- 필수 모듈
- 설치를 진행하기 전 아래의 과정을 통해 필요한 이미지 및 yaml 파일을 준비한다.
- 그 후, Install Step을 진행하면 된다.
-
사용하는 image repository에 Loki stack 설치 시 필요한 이미지를 push한다.
- 작업 디렉토리 생성 및 환경 설정
$ mkdir -p ~/loki-install $ export OS_HOME=~/loki-install $ cd $OS_HOME $ export LOKI_VERSION=2.6.0 $ export PROMTAIL_VERSION=2.6.0 $ export REGISTRY={ImageRegistryIP:Port}
- 외부 네트워크 통신이 가능한 환경에서 필요한 이미지를 다운받는다.
$ sudo docker pull grafana/loki:${LOKI_VERSION} $ sudo docker save grafana/loki:${LOKI_VERSION} > loki_${LOKI_VERSION}.tar $ sudo docker pull grafana/promtail:${PROMTAIL_VERSION} $ sudo docker save grafana/promtail:${PROMTAIL_VERSION} > promtail_${PROMTAIL_VERSION}.tar
-
위의 과정에서 생성한 tar 파일들을 폐쇄망 환경으로 이동시킨 뒤 사용하려는 registry에 이미지를 push한다.
$ sudo docker load < loki_${LOKI_VERSION}.tar $ sudo docker load < promtail_${PROMTAIL_VERSION}.tar $ sudo docker tag grafana/loki:${LOKI_VERSION} ${REGISTRY}/grafana/loki:${LOKI_VERSION} $ sudo docker tag grafana/promtail:${PROMTAIL_VERSION} ${REGISTRY}/grafana/promtail:${PROMTAIL_VERSION} $ sudo docker push ${REGISTRY}/grafana/loki:${LOKI_VERSION} $ sudo docker push ${REGISTRY}/grafana/promtail:${PROMTAIL_VERSION}
- 목적 :
yaml/loki.config 파일에 설치를 위한 정보 기입
- 순서:
- 환경에 맞는 config 내용 작성
- LOKI_VERSION
- Loki 의 버전
- ex) 2.6.0
- PROMTAIL_VERSION
- Promtail 의 버전
- ex) 2.6.0
- STORAGECLASS_NAME
- Loki가 사용할 StorageClass 의 이름
- {STORAGECLASS_NAME} 그대로 유지시 default storageclass 사용
- ex) csi-cephfs-sc
- REGISTRY
- 폐쇄망 사용시 image repository의 주소
- 폐쇄망 아닐시 {REGISTRY} 그대로 유지
- ex) 192.168.171:5000
- LOKI_VERSION
- 환경에 맞는 config 내용 작성
- 목적 :
설치를 위한 shell script 실행
- 순서:
- 권한 부여 및 실행
$ sudo chmod +x yaml/install.sh $ sudo chmod +x yaml/uninstall.sh $ ./yaml/install.sh
- 목적 :
삭제를 위한 shell script 실행
- 순서:
- 실행
$ ./yaml/uninstall.sh
-
Namespace 생성
- loki stack을 설치할 namespace를 생성한다.
$ kubectl create ns monitoring
-
변수 export
- 다운 받을 버전을 export한다.
$ export LOKI_VERSION=2.6.0 $ export PROMTAIL_VERSION=2.6.0 $ export STORAGECLASS_NAME=csi-cephfs-sc
- 비고
- 이하 인스톨 가이드는 StorageClass 이름이 csi-cephfs-sc 라는 가정하에 진행한다.
- 목적 :
loki-stack yaml에 이미지 registry, 버전 및 노드 정보를 수정
- 생성 순서 :
- 아래의 command를 사용하여 사용하고자 하는 image 버전을 입력한다.
$ sed -i 's/{LOKI_VERSION}/'${LOKI_VERSION}'/g' 01_loki.yaml $ sed -i 's/{STORAGECLASS_NAME}/'${STORAGECLASS_NAME}'/g' 01_loki.yaml $ sed -i 's/{PROMTAIL_VERSION}/'${PROMTAIL_VERSION}'/g' 02_promtail.yaml
- 비고 :
폐쇄망에서 설치를 진행하여 별도의 image registry를 사용하는 경우 registry 정보를 추가로 설정해준다.
$ sed -i 's/docker.io\/grafana\/loki/'${REGISTRY}'\/grafana\/loki/g' 01_loki.yaml $ sed -i 's/docker.io\/grafana\/promtail/'${REGISTRY}'\/grafana\/promtail/g' 02_promtail.yaml
- 목적 :
Loki 설치
- 생성 순서 :
- 01_loki.yaml 실행
$ kubectl apply -f 01_loki.yaml
- 비고 :
- StorageClass 이름이 csi-cephfs-sc가 아니라면 환경에 맞게 수정해야 한다.
- 목적 :
loki stack의 daemon 역할을 수행하는 promtail을 설치
- 생성 순서 : 02_promtail.yaml 실행
$ kubectl apply -f 02_promtail.yaml
-
목적: loki에 적재된 log data를 Grafana UI를 통해 조회
-
순서:
-
Admin 권한을 가진 유저로 Grafana UI에 접속하여 Configuration > DataSource를 클릭한다.
-
Datasource 화면에서 Add data source 버튼을 클릭 후, data source type 목록에서 loki를 클릭한다.
-
Loki 설정에서 HTTP URI에 "http://loki.monitoring.svc:3100" 을 추가한 뒤 Save & Test를 클릭한다.
-
-
Grafana의 Explore 화면에서 Loki에 적재된 로그 내용을 확인할 수 있다.
- Loki: logger class는 DEBUG, INFO, WARN, ERROR 총 4단계로 지원, default로 설정된 log level은 INFO
- loki-config ConfigMap에서 원하는 log level로 설정한다.
ex) loki-config ConfigMap 적용 예시
loki.yaml: |
server:
http_listen_port: 3100
log_level: error ## 원하는 log level로 설정한다.
- Promtail: loki와 동일하게 DEBUG, INFO, WARN, ERROR 총 4단계로 지원, default로 설정된 log level은 INFO
- promtail-config ConfigMap에서 원하는 log level로 설정한다.
ex) loki-config ConfigMap 적용 예시
promtail-config.yaml: |
server:
http_listen_port: 9080
grpc_listen_port: 0
log_level: error ## 원하는 log level로 설정한다.
-
목적: Loki 파드에 대하여 Active-Active 방식으로 기동하기 위한 설정이다.
-
Loki 구성: Loki Statefulset의 replica를 2로 수정한다.
- ex) 01_loki.yaml의 statefulset 예시
apiVersion: apps/v1 kind: StatefulSet metadata: name: loki namespace: monitoring labels: app: loki spec: replicas: 2 ## 1에서 2로 수정 selector: matchLabels: app: loki
-
목적: Promtail에서 로그 수집 시, 원하는 label만 볼 수 있도록 whitelist를 기반으로 필터링하기 위함.
-
Promtail config에서 job_name 별로 pipeline_stages 설정을 추가하여 조회를 원하는 label 이름을 기입한다.
- 비고: 현재 promtail config에 설정된 job_name은 총 5개이며, 각 pipeline_stages 설정도 5번 추가해야 한다
- ex) 02_promtail.yaml의 configmap 예시
promtail-config.yaml: | scrape_configs: - job_name: kubernetes-pods-name kubernetes_sd_configs: - role: pod pipeline_stages: - labelallow: ## app, job, filename, namespace, pod_name, container_name label만 loki에서 조회할 수 있다. - app - job - filename - namespace - pod_name - container_name relabel_configs: - source_labels: - __meta_kubernetes_pod_label_name target_label: __service__ ...
-
목적: 로키에 적재된 로그 데이터의 보관 주기를 설정하고 특정 label에 대한 custom retention을 적용할 수 있다.
-
loki-config의 limits_config에서 retention_period를 원하는 기간으로 설정하여 전체 로그 데이터의 보관주기를 설정할 수 있다.
-
특정 라벨만 별도의 retention 기간을 설정할 경우, retention_stream을 통해 설정할 수 있다.
-
기존 설정에서 configmap 설정을 변경한 후에는 loki statefulset을 재기동해야한다.
-
ex) 01_loki.yaml의 configmap인 loki-config에서 limits_config retention 설정 예시
limits_config:
retention_period: 168h ### default로 설정한 retention 기간은 7일이며, 최소 설정 가능 기간은 24h이다.
retention_stream:
- selector: '{namespace=""}' or '{pod_name=""}' ### 특정 네임스페이스 또는 특정 파드만 별도의 기간으로 설정하고자 할 경우
priority: 1 ### selector에 해당 라벨을 지정한 후, period에서 원하는 기간으로 설정한다.
period: 24h ### 최소 설정 가능 기간은 24h이다.
enforce_metric_name: false
ingestion_rate_mb: 16
ingestion_burst_size_mb: 32
per_stream_rate_limit: 10mb
per_stream_rate_limit_burst: 50mb