[{"data":1,"prerenderedAt":15},["ShallowReactive",2],{"article-loki":3},{"slug":4,"title":5,"description":6,"date":7,"category":8,"tags":9,"content":13,"_path":14},"loki","Loki 相關筆記","Loki 部署筆記 [未整理]","2025-11-23","技術",[10,11,12],"Kubernetes","Logs","Loki","\u003Ch1>Loki\u003C/h1>\n\u003Cul>\n\u003Cli>storageclass\u003C/li>\n\u003C/ul>\n\u003Cpre>\u003Ccode class=\"hljs\">\u003Cspan class=\"hljs-attr\">apiVersion:\u003C/span> \u003Cspan class=\"hljs-string\">storage.k8s.io/v1\u003C/span>\n\u003Cspan class=\"hljs-attr\">kind:\u003C/span> \u003Cspan class=\"hljs-string\">StorageClass\u003C/span>\n\u003Cspan class=\"hljs-attr\">metadata:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">name:\u003C/span> \u003Cspan class=\"hljs-string\">ebs-sc-log\u003C/span>\n\u003Cspan class=\"hljs-attr\">provisioner:\u003C/span> \u003Cspan class=\"hljs-string\">ebs.csi.eks.amazonaws.com\u003C/span>\n\u003Cspan class=\"hljs-attr\">parameters:\u003C/span>\n  \u003Cspan class=\"hljs-attr\">type:\u003C/span> \u003Cspan class=\"hljs-string\">gp3\u003C/span>\n\u003Cspan class=\"hljs-attr\">reclaimPolicy:\u003C/span> \u003Cspan class=\"hljs-string\">Retain\u003C/span>\n\u003Cspan class=\"hljs-attr\">allowVolumeExpansion:\u003C/span> \u003Cspan class=\"hljs-literal\">true\u003C/span>\n\u003Cspan class=\"hljs-attr\">volumeBindingMode:\u003C/span> \u003Cspan class=\"hljs-string\">Immediate\u003C/span>\n\u003Cspan class=\"hljs-attr\">allowedTopologies:\u003C/span>\n  \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">matchLabelExpressions:\u003C/span>\n      \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-attr\">key:\u003C/span> \u003Cspan class=\"hljs-string\">topology.kubernetes.io/zone\u003C/span>\n        \u003Cspan class=\"hljs-attr\">values:\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">us-east-1a\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">us-east-1c\u003C/span>\n          \u003Cspan class=\"hljs-bullet\">-\u003C/span> \u003Cspan class=\"hljs-string\">us-east-1d\u003C/span>\n\n\u003C/code>\u003C/pre>\n\u003Cul>\n\u003Cli>values.yaml\u003C/li>\n\u003C/ul>\n\u003Cpre>\u003Ccode class=\"hljs\">deploymentMode: Distributed\n\n# configuration for Loki with S3 storage\nserviceAccount:\n  annotations:\n    # 要先建置service role\n    # policy 要incude s3 bueckt 存取權限\n    &quot;eks.amazonaws.com/role-arn&quot;: &quot;arn:aws:iam::354950674167:role/bit-au-prod-nv-loki-service-role&quot;\n\n# Main Loki configuration\nloki:\n  # Schema configuration for TSDB with S3\n  schemaConfig:\n    configs:\n      - from: 2024-04-01\n        store: tsdb\n        object_store: s3\n        schema: v13\n        index:\n          prefix: bit_prod_au_hk_loki_index_\n          period: 24h\n\n  # Server configuration\n  server:\n    http_listen_port: 3100\n    log_level: info\n    log_format: json\n    http_server_read_timeout: 1m\n    http_server_write_timeout: 1m\n\n  # Authentication disabled\n  auth_enabled: false\n\n  # Common configuration (this will be merged with storage config automatically)\n  commonConfig:\n    path_prefix: /var/loki\n    replication_factor: 3\n\n  limits_config:\n    # 查詢性能優化\n    split_queries_by_interval: 5m\n    query_timeout: 5m\n    max_query_parallelism: 64\n    max_cache_freshness_per_query: 1m\n    max_query_series: 5000\n    max_query_length: 24h\n\n    # 保持你的其他現有配置不變\n    reject_old_samples: true\n    reject_old_samples_max_age: 168h\n    creation_grace_period: 10m\n    ingestion_rate_mb: 50\n    ingestion_burst_size_mb: 100\n    max_line_size: 1MB\n    max_line_size_truncate: true\n    max_label_name_length: 1024\n    max_label_value_length: 4096\n    max_label_names_per_series: 30\n    max_streams_per_user: 100000\n    max_global_streams_per_user: 100000\n    per_stream_rate_limit: 10MB\n    per_stream_rate_limit_burst: 20MB\n    volume_enabled: true\n    unordered_writes: true\n    use_owned_stream_count: false\n\n  # Ingester configuration\n  ingester:\n    chunk_encoding: snappy\n    chunk_target_size: 1048576 # 1MB\n    chunk_idle_period: 30m\n    max_chunk_age: 2h\n    chunk_retain_period: 1m\n    wal:\n      dir: /var/loki/wal\n    lifecycler:\n      ring:\n        kvstore:\n          store: memberlist\n        replication_factor: 3\n        heartbeat_timeout: 1m\n        zone_awareness_enabled: false\n\n  # Distributor configuration\n  distributor:\n    ring:\n      kvstore:\n        store: memberlist\n\n  # Querier configuration\n  querier:\n    max_concurrent: 32\n    tail_max_duration: 1h\n\n  # Storage configuration\n  # s3 這定檔在這\n  storage:\n    type: s3\n    bucketNames:\n      chunks: &quot;bit-prod-au-hk-loki-data&quot;\n      ruler: &quot;bit-prod-au-hk-loki-data&quot;\n      admin: &quot;bit-prod-au-hk-loki-data&quot;\n    s3:\n      region: ap-east-1\n      s3ForcePathStyle: false\n      insecure: false\n      http_config:\n        idle_conn_timeout: 90s\n        response_header_timeout: 0s\n        insecure_skip_verify: false\n\n  # Storage config for TSDB\n  storage_config:\n    tsdb_shipper:\n      active_index_directory: /var/loki/tsdb-index\n      cache_location: /var/loki/tsdb-cache\n      cache_ttl: 24h\n\n  # Compactor configuration\n  compactor:\n    working_directory: /tmp/loki/compactor\n    compaction_interval: 10m\n    retention_enabled: true # 如果不需要 retention，設為 false\n    retention_delete_delay: 2h\n    retention_delete_worker_count: 150\n    delete_request_store: s3 # 只有當 retention_enabled=true 時才需要\n\n  # Frontend configuration\n  frontend:\n    log_queries_longer_than: 5s\n    compress_responses: true\n    max_outstanding_per_tenant: 2048\n\n  # Ruler configuration (internal)\n  ruler:\n    storage:\n      type: s3\n    rule_path: /var/loki/rules-temp\n    wal:\n      dir: /var/loki/ruler-wal\n    ring:\n      kvstore:\n        store: memberlist\n    enable_api: true\n\n  # Tracing\n  tracing:\n    enabled: true\n\n  # Index gateway configuration\n  index_gateway:\n    mode: simple\n\n  # Memberlist configuration\n  memberlist:\n    node_name: &quot;&quot;\n    randomize_node_name: true\n    stream_timeout: 10s\n    retransmit_mult: 4\n    push_pull_interval: 30s\n    gossip_interval: 200ms\n    gossip_nodes: 3\n    gossip_to_dead_time: 30s\n    dead_node_reclaim_time: 0s\n    compression_enabled: true\n\n# Component-specific configurations\ningester:\n  replicas: 6\n  resources:\n    requests:\n      cpu: 2\n      memory: 2560Mi\n    limits:\n      cpu: 2\n      memory: 2560Mi\n  podDisruptionBudget:\n    maxUnavailable: 1\n  nodeSelector:\n    karpenter.sh/nodepool: bit-au-ops-node-pool\n\nquerier:\n  replicas: 6\n  maxUnavailable: 1\n  resources:\n    requests:\n      cpu: 3 # 從 2 增加到 3\n      memory: 6Gi # 從 4Gi 增加到 6Gi\n    limits:\n      cpu: 3\n      memory: 6Gi\n  podDisruptionBudget:\n    maxUnavailable: 1\n  nodeSelector:\n    karpenter.sh/nodepool: bit-au-ops-node-pool\n\nqueryFrontend:\n  replicas: 6\n  maxUnavailable: 1\n  resources:\n    requests:\n      cpu: 3 # 從 2 增加到 3\n      memory: 6Gi # 從 4Gi 增加到 6Gi\n    limits:\n      cpu: 3\n      memory: 6Gi\n  podDisruptionBudget:\n    maxUnavailable: 1\n  nodeSelector:\n    karpenter.sh/nodepool: bit-au-ops-node-pool\n\nqueryScheduler:\n  replicas: 6\n  resources:\n    requests:\n      cpu: 3\n      memory: 6Gi\n    limits:\n      cpu: 3\n      memory: 6Gi\n  nodeSelector:\n    karpenter.sh/nodepool: bit-au-ops-node-pool\n\ndistributor:\n  replicas: 3\n  maxUnavailable: 1\n  resources:\n    requests:\n      cpu: 2\n      memory: 2Gi\n    limits:\n      cpu: 2\n      memory: 2Gi\n  podDisruptionBudget:\n    maxUnavailable: 1\n  nodeSelector:\n    karpenter.sh/nodepool: bit-au-ops-node-pool\n\ncompactor:\n  replicas: 3\n  resources:\n    requests:\n      cpu: 2\n      memory: 2Gi\n    limits:\n      cpu: 2\n      memory: 2Gi\n  nodeSelector:\n    karpenter.sh/nodepool: bit-au-ops-node-pool\n  persistence:\n    size: 20Gi\n    storageClass: ebs-sc-log\n\nindexGateway:\n  replicas: 3\n  maxUnavailable: 1\n  resources:\n    requests:\n      cpu: 2\n      memory: 2Gi\n    limits:\n      cpu: 2\n      memory: 2Gi\n  nodeSelector:\n    karpenter.sh/nodepool: bit-au-ops-node-pool\n  podDisruptionBudget:\n    maxUnavailable: 1\n\n# Cache configurations\n\n# Ruler configuration\nruler:\n  enabled: true\n  replicas: 1\n  resources:\n    requests:\n      cpu: 100m\n      memory: 256Mi\n    limits:\n      cpu: 200m\n      memory: 512Mi\n\n# Disabled components (using distributed mode)\nbloomCompactor:\n  replicas: 0\nbloomGateway:\n  replicas: 0\nbackend:\n  replicas: 0\nread:\n  replicas: 0\nwrite:\n  replicas: 0\nsingleBinary:\n  replicas: 0\nresultsCache:\n  enabled: true\n  resources:\n    requests:\n      memory: &quot;2Gi&quot; # 從 512Mi 增加\n      cpu: &quot;500m&quot; # 從 200m 增加\n    limits:\n      memory: &quot;4Gi&quot; # 從 1Gi 增加\n      cpu: &quot;1000m&quot; # 從 500m 增加\n\nchunksCache:\n  enabled: true\n  replicas: 3\n  resources:\n    requests:\n      cpu: 3 # 從 2 增加\n      memory: 8Gi # 從 4Gi 增加\n    limits:\n      cpu: 3\n      memory: 8Gi\n\n# Disable minio (using S3)\nminio:\n  enabled: false\n\n# Gateway configuration (optional - for external access)\ngateway:\n  enabled: true\n  replicas: 6\n  resources:\n    requests:\n      cpu: 2\n      memory: 2Gi\n    limits:\n      cpu: 2\n      memory: 2Gi\n  nodeSelector:\n    karpenter.sh/nodepool: bit-au-ops-node-pool\n  ingress:\n    enabled: false # Set to true if you need external access\n\nmonitoring:\n  serviceMonitor:\n    enabled: true\n    labels:\n      app: loki\n      release: prometheus\n    interval: 30s\n    scrapeTimeout: 10s\n    metricRelabelings: []\n    relabelings: []\n\n  prometheusRule:\n    enabled: true\n    groups:\n      - name: loki-alerts\n        rules:\n          - alert: LokiIngestionRateHigh\n            expr: rate(loki_distributor_ingester_append_failures_total[5m]) &gt; 0.1\n            for: 5m\n            labels:\n              severity: warning\n            annotations:\n              summary: &quot;Loki ingestion failure rate is high&quot;\n              description: &quot;Loki ingestion failure rate is {{ $value }} per second&quot;\n\n          - alert: LokiRequestLatencyHigh\n            expr: histogram_quantile(0.99, rate(loki_request_duration_seconds_bucket[5m])) &gt; 1\n            for: 5m\n            labels:\n              severity: warning\n            annotations:\n              summary: &quot;Loki request latency is high&quot;\n              description: &quot;Loki 99th percentile latency is {{ $value }}s&quot;\n\n          - alert: LokiIngesterDown\n            expr: up{job=~&quot;loki/ingester&quot;} == 0\n            for: 5m\n            labels:\n              severity: critical\n            annotations:\n              summary: &quot;Loki ingester is down&quot;\n              description: &quot;Loki ingester {{ $labels.instance }} has been down for more than 5 minutes&quot;\n\n          - alert: LokiDistributorDown\n            expr: up{job=~&quot;loki/distributor&quot;} == 0\n            for: 5m\n            labels:\n              severity: critical\n            annotations:\n              summary: &quot;Loki distributor is down&quot;\n              description: &quot;Loki distributor {{ $labels.instance }} has been down for more than 5 minutes&quot;\n\n# Network policies (optional security enhancement)\nnetworkPolicy:\n  enabled: false # Set to true if you want network isolation\n  # egress:\n  #   enabled: true\n  #   ports:\n  #     - port: 443\n  #       protocol: TCP\n  #     - port: 53\n  #       protocol: UDP\n  # ingress:\n  #   enabled: true\n  #   namespaceSelector: {}\n\n# Pod Security Context\nsecurityContext:\n  runAsNonRoot: true\n  runAsUser: 10001\n  runAsGroup: 10001\n  fsGroup: 10001\n\n# Container Security Context\ncontainerSecurityContext:\n  readOnlyRootFilesystem: false # 允許寫入 /var/loki\n  capabilities:\n    drop:\n      - ALL\n  allowPrivilegeEscalation: false\n\n# Resource quotas and limits (optional)\n# rbac:\n#   pspEnabled: false\n\n# Enterprise features (if using Grafana Enterprise Logs)\nenterprise:\n  enabled: false\n\n# Test configuration\ntest:\n  enabled: true\n  prometheusAddress: &quot;http://prometheus-stack-kube-prom-prometheus.monitoring.svc.cluster.local:9090&quot;\n\n# Global settings\nglobal:\n  # Pod annotations\n  podAnnotations:\n    prometheus.io/scrape: &quot;true&quot;\n    prometheus.io/port: &quot;3100&quot;\n    prometheus.io/path: &quot;/metrics&quot;\n\n  # Image settings\n  image:\n    registry: docker.io\n    pullPolicy: IfNotPresent\n\n  # Priority class (optional)\n  # priorityClassName: &quot;high-priority&quot;\n\n# Grafana Agent configuration (if using)\ngrafanaAgent:\n  enabled: false\n\n\u003C/code>\u003C/pre>\n\u003Ch3>Install\u003C/h3>\n\u003Cpre>\u003Ccode class=\"hljs\">helm repo add grafana https://grafana.github.io/helm-charts \nhelm upgrade --install --values values.yaml loki grafana/loki -n logs --create-namespace   \n\n\u003C/code>\u003C/pre>\n","/articles/loki",1784608356099]