본문 바로가기

Observability/Loki

[Loki]Install Grafana loki-distributed with helm chart

Service Account 설정

AWS EKS에서 S3를 사용할 수 있도록 Kubernetes의 Service Account 생성하고 AWS IAM Role을 설정하여 Kubernetes Service Account + AWS IAM Policy + Trust Relationship를 연결합니다.

아래 설명에 따라 Role을 생성한 뒤 helm chart의 `serviceAccount.annotations` 에 내용을 작성하여 사용할 수 있습니다.

IAM

Policy 생성

cat >Loki-S3-policy.json <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "LokiStorage",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::<bucket_name>",
                "arn:aws:s3:::<bucket_name>/*"
            ]
        }
    ]
}
EOF
aws iam create-policy --policy-name AWSS3EksLokiAccess --policy-document file://Loki-S3-policy.json

Role 생성

cat >trust-relationship.json <<EOF
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::[account]:oidc-provider/oidc.eks.ap-northeast-2.amazonaws.com/id/[oidc]"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "oidc.eks.ap-northeast-2.amazonaws.com/id/[oidc]:sub": "system:serviceaccount:[namespace]:[serviceAccount]",
                    "oidc.eks.ap-northeast-2.amazonaws.com/id/[oidc]:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}
EOF
aws iam create-role --role-name AmazonEKS-Loki-Role --assume-role-policy-document file://trust-relationship.json --description "AmazonEKS-Loki-Role"

참고) oidc 구하는 방법

➜ oidc_id=$(aws eks describe-cluster --name [cluster name] \\
--query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)

➜ echo $oidc_id
534#중략

Install loki-distributed with helm chart

# Add grafana helm repo
helm repo add grafana <https://grafana.github.io/helm-charts>

# Download helm chart
helm fetch grafana/loki-distributed
tar zxvf loki-distributed-0.69.16.tgz

Edit values.yaml

loki-distributed helm chart github - link
loki.config - doc link

Caching

Loki가 사용할 수 있는 4개의 Memcached 인스턴스를 구성할 수 있다.

  • memcached-chunks
    • extraArgs:
      • -m 2048: MemcachedChunks의 캐시 크기를 2048MB로 설정합니다. 이는 MemcachedChunks가 메모리에서 사용할 수 있는 최대 메모리 양을 나타냅니다.
      • -I 2m: MemcachedChunks의 캐시 아이템의 최대 크기를 2MB로 설정합니다. 이는 MemcachedChunks에 저장되는 각 아이템의 최대 크기를 제한하는 역할을 합니다.
      • -v: MemcachedChunks의 실행 로그를 자세하게 출력하도록 설정합니다. 이는 디버깅과 모니터링 목적으로 사용될 수 있습니다.
    • chunk_cache_config
      • batch_size: 100는 메모리 캐시 chunk에 대한 배치 작업의 크기를 지정합니다. 이는 한 번에 처리되는 메모리 캐시 chunk의 수를 나타냅니다. 100으로 설정되어 있으므로, 100개의 메모리 캐시 chunk가 한 번에 처리됩니다.
      • parallelism: 100은 메모리 캐시 chunk의 병렬 처리 수를 나타냅니다. 이는 동시에 처리되는 메모리 캐시 chunk의 수를 지정합니다. 100으로 설정되어 있으므로, 최대 100개의 메모리 캐시 chunk가 동시에 처리됩니다.
  • memcached-frontend
  • memcached-index-queries
  • memcached-index-writes: 이 캐시는 boltb-shipper와 함께 사용되지 않으므로 이 경우에는 활성화하지 않아야 합니다.

Compactor - doc link

Loki의 retentionTable Manager(tsdb_shipper,chunck,index) 또는 Compactor(tsdb_shipper)를 통해 이루어진다. 여기서는 single storage(tsdb_shipper)를 사용하여 loki를 구성하므로 compactor를 사용하여 retention을 관리한다.

limits_config - doc link

보존 기간은 limits_config 설정 섹션에서 구성할 수 있습니다.

There are two ways of setting retention policies:

  • retention_period: 전역 retention 설정
  • retention_stream: selector와 일치하는 일치하는 청크에만 적용되는 retention

indexGateway - doc link

object storage와 지속적으로 상호 작용할 필요 없이 인덱스 쿼리를 처리하는 object store와 지속적으로 상호 작용할 필요 없이 인덱스 쿼리를 서비스하도록 구성합니다.

ingester.lifecycler.ring.replication_factor

데이터의 복제수 설정, 단일 노드의 장애가 데이터 손실을 일으키지 않도록 합니다.또한 롤아웃 및 재시작 중에 쓰기가 중단되지 않도록 합니다.

그외 세부 설정 값은 아래 작성한 values.yaml에 주석으로 설명합니다.

fullnameOverride: "loki"

loki:

  config: |
    auth_enabled: false
    ingester:
      lifecycler:
        ring:
          kvstore:
            store: memberlist
          replication_factor: 2 # 데이터의 복제수 설정, 단일 노드의 장애가 데이터 손실을 일으키지 않도록 합니다.또한 롤아웃 및 재시작 중에 쓰기가 중단되지 않도록 합니다.
  server:
    #This sets the maximum size (in bytes) for incoming gRPC messages that Loki's server can receive.
    #If an incoming message exceeds the specified maximum size, the Loki server will reject or terminate the connection.
    #Increasing the value of grpc_server_max_recv_msg_size allows larger messages to be received by the server, accommodating scenarios where large log payloads or other data need to be transmitted.
    grpc_server_max_recv_msg_size: 8388608 # default 4194304
    #This parameter sets the maximum size (in bytes) for outgoing gRPC messages that Loki's server can send.
    grpc_server_max_send_msg_size: 8388608 # default 4194304
    http_server_read_timeout: 300s # default 30, Reade timeout for HTTP server
    http_server_write_timeout: 300s # default 30, Write timeout for HTTP server
  schemaConfig:
    configs:
    - from: "2023-07-28"
      index:
        period: 24h
        prefix: loki_index_
      object_store: s3
      schema: v12
      store: tsdb

  storageConfig:
    aws:
      region: ap-northeast-2
      bucketnames: jeff-test
      insecure: false
      s3forcepathstyle: false
    tsdb_shipper:
      active_index_directory: /var/loki/tsdb-index
      cache_location: /var/loki/tsdb-cache
      # index_gateway_client:
      #   # only applicable if using microservices where index-gateways are independently deployed.
      #   # This example is using kubernetes-style naming.
      #  server_address: dns:///index-gateway.<namespace>.svc.cluster.local:9095
      shared_store: s3

  structuredConfig:
    auth_enabled: false
    compactor:
      apply_retention_interval: 1h  # default 0s, 삭제 대상이 된 로그 스트림을 얼마나 자주 체크할 것인지 설정합니다.
      compaction_interval: 10m  # default 10m, Compactor가 작업을 얼마나 자주 수행할 것인지 설정합니다. compactor가 뒤쳐지면 compaction이 가능한 빨리 다시 실행됩니다.
      retention_delete_delay: 2h  # default 2h, 표시된 청크를 삭제할 때까지의 지연 시간입니다.
      retention_delete_worker_count: 150  # default 150, 삭제를 수행하는 worker의 수를 설정합니다.
      retention_enabled: true # default false,
      shared_store: s3
      working_directory: /var/loki/compactor  # Compactor가 작업을 수행하는 디렉토리를 설정합니다.
    limits_config:  # Configuring the retention period
      max_global_streams_per_user: 10000 # default: 5000, 클러스터 전체에서 사용자당 최대 활성 스트림 수입니다. 0을 입력하면 비활성화됩니다.
      max_streams_per_user: 10000 # default: 0, 사용자당, ingester당 최대 활성 스트림 수입니다. 0을 입력하면 비활성화됩니다.
      reject_old_samples: false # default: true
      retention_period: 90d  # 전역 retention 설정
      per_stream_rate_limit: 3MB # default: 3MB, 스트림당 초당 최대 바이트 전송률
      per_stream_rate_limit_burst: 10MB # default 15MB
      max_query_parallelism: 90 # default 32
      retention_stream:   # selector와 일치하는 일치하는 청크에만 적용되는 retention
      - selector: '{namespace="dev"}'
        priority: 1
        period: 24h
      ingestion_rate_mb: 1024  # default 4, 초당 인제스팅 될 수 있는 데이터의 최대 크기를 메가바이트 단위로 설정합니다.
      ingestion_burst_size_mb: 2048 # default 8, 인제스팅 데이터의 최대 버스트 크기를 메가바이트 단위로 설정합니다.
    ingester:
      max_transfer_retries: 0  # 이전 Ingester로부터 chunk를 이관받을 때 재시도할 최대 횟수를 설정합니다.
      chunk_idle_period: 1h  # default 30m, 로그를 받지 않는 상태에서 chunk를 얼마나 유지할 것인지 설정합니다.
      chunk_target_size: 1536000  #  default 1572864, 최적의 성능을 위해 목표로 하는 chunk 크기를 바이트 단위로 설정합니다.
      max_chunk_age: 1h  # default 2h,메모리에 유지되는 최대 chunk 기간을 설정합니다.
      chunk_encoding: snappy  # The algorithm to use for compressing chunk. (none, gzip, lz4-64k, snappy,lz4-256k, lz4-1M, lz4, flate, zstd)
    storage_config:
      index_queries_cache_config:
        memcached:
          batch_size: 100  # default 0, Memcached에 쿼리를 배치하는 크기를 설정합니다.
          parallelism: 100  # default 0, 동시에 처리할 수 있는 쿼리의 최대 개수를 설정합니다.
    chunk_store_config:  # chunk_store_config 블록은 청크가 캐시되는 방식과 청크를 백업 저장소에 저장하기 전에 대기하는 시간을 구성합니다.
      max_look_back_period: 48h  # default 0s, 과거의 로그를 얼마나 오래 조회할 것인지 설정합니다.
      chunk_cache_config:
        memcached:
          batch_size: 100  # default 1024, Memcached에 chunk를 배치하는 크기를 설정합니다.
          parallelism: 100  # default 100, 동시에 처리할 수 있는 chunk의 최대 개수를 설정합니다.
      write_dedupe_cache_config:
        memcached:
          batch_size: 100  # default 0, Memcached에 write dedupe 정보를 배치하는 크기를 설정합니다.
          parallelism: 100  # default 0, 동시에 처리할 수 있는 write dedupe의 최대 개수를 설정합니다.
    querier:
      max_concurrent: 30 # default 10, 하나의 쿼리어가 병렬로 처리할 수 있는 쿼리 수를 보여줍니다. CPU 수의 약 2배 정도를 넣는 것이 좋습니다. 기본값은 10입니다(이 숫자에 주의하세요)
    query_scheduler:
      max_outstanding_requests_per_tenant: 2048 # default 100, 쿼리 스케줄러당 테넌트당 최대 미결 요청 수입니다. 이 제한을 초과하는 인플라이트 요청은 HTTP 응답 상태 코드 429로 실패합니다.
      

serviceAccount:
  create: true
  name: "loki-sa"
  imagePullSecrets: []
  annotations:
    "eks.amazonaws.com/role-arn": "arn:aws:iam::[account]:role/AmazonEKS-Loki-Role"
  automountServiceAccountToken: true

ingester:
  resources:
    requests:
      cpu: 100m
      memory: 256Mi
    limits:
      memory: 256Mi

distributor:
  resources:
    requests:
      cpu: 100m
      memory: 256Mi
    limits:
      memory: 256Mi

querier:
  resources:
    requests:
      cpu: 100m
      memory: 1Gi
    limits:
      memory: 1Gi

queryFrontend:
  resources:
    requests:
      cpu: 100m
      memory: 1Gi
    limits:
      memory: 1Gi

gateway:
  resources:
    requests:
      cpu: 100m
      memory: 1Gi
    limits:
      memory: 1Gi

compactor:
  enabled: true
  serviceAccount:
    create: true
    name: "loki-sa-compactor"
    annotations:
      "eks.amazonaws.com/role-arn": "arn:aws:iam::[account]:role/AmazonEKS-Loki-Role"
    automountServiceAccountToken: true

# index_gateway 블록은 개체 저장소와 지속적으로 상호 작용할 필요 없이 인덱스 쿼리 서비스를 담당하는 Loki 인덱스 게이트웨이 서버를 구성합니다.
indexGateway:
  enabled: true

memcachedChunks:
  enabled: true
  extraArgs:
    - -I 32m

memcachedFrontend:
  enabled: true
  extraArgs:
    - -I 32m

memcachedIndexQueries:
  enabled: true
  extraArgs:
    - -I 32m

Helm install

➜ helm install loki . 
NAME: loki
LAST DEPLOYED: Fri May 26 22:31:26 2023
NAMESPACE: loki
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
***********************************************************************
 Welcome to Grafana Loki
 Chart version: 0.69.16
 Loki version: 2.8.2
***********************************************************************

Installed components:
* gateway
* ingester
* distributor
* querier
* query-frontend
* compactor
* memcached-chunks
* memcached-frontend
* memcached-index-queries

Install Promtail with helm chart

# Add grafana helm repo
helm repo add grafana <https://grafana.github.io/helm-charts>

# Download helm chart
helm fetch grafana/promtail
tar zxvf promtail-6.11.2.tgz

Edit values.yaml

fullnameOverride: promtail
config:
  logLevel: info
  serverPort: 3101
  clients:
    - url: <http://loki-gateway.jeff/loki/api/v1/push>

url: loki-gateway-svc.namespace/loki/api/v1/push

Verify application

AWS S3 데이터 확인

config.auth_enabled: false 으로 설정하면 chunk가 fake라는 이름으로 저장된다.

Grafana

connect to loki datasource

url: http://loki-gateway-svc.namespace

Explore

'Observability > Loki' 카테고리의 다른 글

[Promtail]Install promtail with helm chart  (0) 2024.03.03
[Loki]Grafana Loki Architecture  (0) 2023.06.02
[Loki]What is Grafana Loki?  (0) 2023.06.01