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가 동시에 처리됩니다.
- extraArgs:
- memcached-frontend
- memcached-index-queries
- memcached-index-writes: 이 캐시는 boltb-shipper와 함께 사용되지 않으므로 이 경우에는 활성화하지 않아야 합니다.
Compactor - doc link
Loki의 retention은 Table 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 |