소개

Grafana Loki 는 Prometheus 에서 영감을 받은 수평 확장 가능하고 고가용성이며 멀티테넌트 (multi-tenant) 로그 집계 시스템입니다. 매우 비용 효율적이고 운영하기 쉽도록 설계되었습니다. 다른 로깅 시스템과 달리 Loki 는 로그 콘텐츠를 인덱싱하지 않고, 각 로그 스트림에 대한 레이블 (label) 집합을 인덱싱합니다.

본 랩에서는 공식 Docker 이미지를 사용하여 Grafana Loki 의 기본 설치를 수행합니다. 최소한의 설정 파일 (configuration file) 을 생성하고 Loki 서비스를 컨테이너로 실행하는 방법을 배우게 됩니다. 이는 Loki 를 사용하여 완전한 로깅 스택을 구축하는 첫 번째 기본 단계입니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 100%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

Loki Docker 이미지 가져오기

이 단계에서는 공식 Grafana Loki Docker 이미지를 Docker Hub 에서 다운로드합니다. docker pull 명령어는 레지스트리에서 이미지 또는 리포지토리를 가져옵니다. 실습 환경에는 이미 Docker 가 설치 및 구성되어 있습니다.

최신 Loki 이미지를 가져오려면 터미널에서 다음 명령어를 실행하십시오:

docker pull grafana/loki

다운로드 진행 상황을 나타내는 출력이 표시됩니다. Docker 는 기본적으로 latest 태그가 지정된 이미지를 가져옵니다.

예상 출력 (버전 번호는 다를 수 있습니다):

latest: Pulling from grafana/loki
a48641c1b8a9: Pull complete
...
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for grafana/loki
docker.io/grafana/loki

기본 loki-config.yaml 파일 생성

이 단계에서는 Loki 를 위한 최소한의 설정 파일 (configuration file) 을 생성합니다. 이 파일인 loki-config.yaml은 Loki 가 어떻게 실행되어야 하는지, 데이터를 어디에 저장할지, 어떤 스키마 (schema) 를 사용할지를 지시합니다. 본 실습에서는 Loki 가 스토리지를 위해 로컬 파일 시스템을 사용하도록 구성할 것입니다.

nano 텍스트 편집기를 사용하여 파일을 생성합니다. loki-config.yaml이라는 새 파일을 열려면 다음 명령어를 실행하십시오:

nano loki-config.yaml

이제 다음 YAML 내용을 nano 편집기에 복사하여 붙여넣으십시오:

auth_enabled: false

server:
  http_listen_port: 3100

common:
  path_prefix: /tmp/loki
  storage:
    filesystem:
      chunks_directory: /tmp/loki/chunks
      rules_directory: /tmp/loki/rules
  ring:
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h

storage_config:
  boltdb_shipper:
    active_index_directory: /tmp/loki/index
    cache_location: /tmp/loki/cache
  filesystem:
    directory: /tmp/loki/chunks

ruler:
  alertmanager_url: http://localhost:9093

limits_config:
  allow_structured_metadata: false

이 설정은 컨테이너 내부의 /tmp/loki 아래에 Loki 가 필요로 하는 모든 것을 유지하여 권한 문제를 피하고 설정을 이해하기 쉽게 만듭니다. 이는 인증을 비활성화하고, 단일 노드 사용을 위해 인메모리 링 (in-memory ring) 을 활성화하며, 블록과 인덱스를 로컬 파일 시스템에 저장합니다.

파일의 각 섹션이 하는 일은 다음과 같습니다:

  • auth_enabled: false: 인증을 비활성화하여 추가 자격 증명 없이 Loki 와 통신할 수 있도록 합니다. 이는 로컬 테스트를 단순화하며, 프로덕션 환경에서는 인증을 활성화해야 합니다.
  • server.http_listen_port: 3100: Loki 에게 3100 포트에서 HTTP 요청을 수신 대기하도록 지시합니다. localhost:3100으로 curl 을 실행하면 이 포트에 접속하게 됩니다.
  • common.path_prefix: 컨테이너 내부에서 Loki 가 임시 데이터를 저장하는 기본 폴더를 설정합니다. 이 파일의 다른 모든 경로는 /tmp/loki를 기반으로 하므로 모든 것이 한 곳에 유지됩니다.
  • common.storage.filesystem: 로그 데이터의 청크 (chunk) 와 규칙 파일 저장을 위해 Loki 를 두 개의 폴더로 지정합니다. 컨테이너에 특별히 마운트하는 것이 없으므로 /tmp/loki를 사용하면 권한 문제를 피할 수 있습니다.
  • common.ring.kvstore.store: inmemory: 멤버십 정보를 메모리에 유지합니다. 단일 노드 실습에는 이것이 완벽하지만, 실제 클러스터에서는 Consul 이나 etcd 와 같은 공유 스토어를 사용하게 됩니다.
  • schema_config: Loki 가 로그 데이터에 대한 인덱스를 어떻게 구성할지 정의합니다. 시작 날짜를 설정하고, boltdb-shipper 스토어를 선택하며, 인덱스를 파일 시스템에 유지합니다. prefixperiod는 파일 이름 지정 방식과 새 인덱스 파일이 생성되는 빈도 (24 시간마다) 를 제어합니다.
  • storage_config: boltdb-shipper 인덱스 (active_index_directorycache_location) 와 원시 청크 스토리지를 위한 정확한 폴더를 제공합니다. 모든 경로는 깔끔하게 유지하기 위해 다시 /tmp/loki 아래에 위치합니다.
  • ruler.alertmanager_url: Loki 의 ruler 컴포넌트가 http://localhost:9093에 있는 Alertmanager 로 알림을 보내도록 준비합니다. Alertmanager 가 실행되고 있지 않아도 아무것도 중단되지 않으며, Loki 는 알림을 보내려고 시도할 때 경고 (warning) 를 기록할 뿐입니다.
  • limits_config.allow_structured_metadata: false: 고급 기능을 비활성화하여 Loki 가 초보자가 예상하는 더 간단한 일반 텍스트 로그 메타데이터를 사용하도록 합니다.

Ctrl+X를 눌러 종료하고, Y를 눌러 저장을 확인한 다음, 마지막으로 Enter를 눌러 loki-config.yaml이라는 이름으로 파일을 저장하십시오.

설정 파일을 사용하여 3100 포트에서 Loki 컨테이너 실행

이제 Loki 이미지와 구성 파일이 준비되었으므로, Loki 를 Docker 컨테이너로 실행할 것입니다. docker run 명령어를 사용하여 컨테이너를 시작하고, 구성 파일을 마운트하며, 필요한 포트를 노출할 것입니다.

다음 명령어를 실행하십시오:

docker run -d --name loki -v $(pwd)/loki-config.yaml:/etc/loki/config.yml -p 3100:3100 grafana/loki -config.file=/etc/loki/config.yml

이 명령어를 분석해 보겠습니다:

  • -d: 컨테이너를 데태치 모드 (detached mode, 백그라운드) 로 실행합니다.
  • --name loki: 컨테이너에 loki라는 이름을 지정하여 쉽게 참조할 수 있도록 합니다.
  • -v $(pwd)/loki-config.yaml:/etc/loki/config.yml: 로컬의 loki-config.yaml 파일을 컨테이너 내부의 /etc/loki/config.yml 위치에 마운트합니다. Loki 는 이 파일에서 구성을 읽습니다.
  • -p 3100:3100: 호스트 머신의 포트 3100을 컨테이너 내부의 포트 3100에 매핑하여 Loki API 에 접근할 수 있도록 합니다.
  • grafana/loki: 컨테이너에 사용할 이미지입니다.
  • -config.file=/etc/loki/config.yml: Loki 프로세스에 전달되는 명령줄 인수 (command-line argument) 로, 구성 파일의 위치를 알려줍니다.

명령어를 실행한 후, Docker 는 새로 생성된 컨테이너의 고유 ID 를 출력합니다.

e8a9f2b1c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0

localhost:3100/ready 에서 Loki 준비 엔드포인트 확인

이 단계에서는 Loki 서버가 정상적으로 실행 중인지 확인하기 위해 헬스 체크 (health check) 를 수행합니다. Loki 는 이 목적으로 사용될 수 있는 /ready HTTP 엔드포인트를 노출합니다. 성공적인 응답은 서버가 요청을 수신할 준비가 되었음을 나타냅니다.

curl 명령어를 사용하여 이 엔드포인트로 요청을 보냅니다. 이전 단계에서 포트 3100을 매핑했으므로, localhost:3100을 통해 접근할 수 있습니다.

curl http://localhost:3100/ready

Loki 가 성공적으로 시작되었다면, HTTP 200 OK 상태 코드와 함께 ready라는 텍스트로 응답할 것입니다.

예상 출력:

ready

시작 확인을 위해 Loki 로그 확인

Loki 가 성공적으로 시작되었는지 확인하는 또 다른 방법은 컨테이너 로그를 검사하는 것입니다. 이는 구성 문제나 기타 시작 문제를 디버깅할 때 유용합니다. docker logs 명령어는 컨테이너의 로그를 가져옵니다.

다음 명령어를 사용하여 loki 컨테이너의 로그를 확인하십시오:

docker logs loki

시작 프로세스에 대한 세부 정보가 담긴 출력을 보게 될 것입니다. 연결 수신 대기 중임을 확인하는 줄을 찾으십시오. 이는 서비스가 심각한 오류 없이 초기화되었음을 확인시켜 줍니다.

예상 출력 스니펫 (로그 세부 정보는 다를 수 있음):

level=info ts=... caller=server.go:299 http=[::]:3100 grpc=[::]:9096 msg="server listening on addresses"
level=info ts=... caller=loki.go:372 msg="Loki started"

요약

축하합니다! 이 랩 (lab) 을 성공적으로 완료했습니다.

이 랩에서는 Grafana Loki 인스턴스를 가동하고 실행하기 위한 기본 단계를 학습했습니다. 다음을 수행했습니다:

  • Docker Hub 에서 공식 Loki Docker 이미지를 가져왔습니다.
  • 서버 및 스토리지 설정을 정의하기 위해 기본적인 loki-config.yaml 파일을 생성했습니다.
  • 구성 파일을 마운트하고 API 포트를 노출하여 Docker 컨테이너에서 Loki 를 실행했습니다.
  • /ready 엔드포인트를 사용하고 컨테이너 로그를 확인하여 Loki 인스턴스가 실행 중이며 정상 상태인지 확인했습니다.

이 기본 설정은 더 복잡하고 견고한 로깅 아키텍처를 구축하기 위한 기반이 됩니다. 이제 Promtail 과 같은 로그 수집 에이전트 (log shipping agent) 를 구성하여 Loki 로 로그를 보내고 Grafana 를 사용하여 로그를 쿼리하고 시각화할 수 있습니다.