새소식

Observability/Loki

[Promtail]Install promtail with helm chart

  • -

Fetch promtail helm chart

➜ helm repo add grafana <https://grafana.github.io/helm-charts>
➜ helm repo update
➜ helm fetch grafana/promtail
➜ tar zxvf promtail-6.15.5.tgz
➜ helm upgrade --install promtail . -f ./values.yaml --namespace loki --create-namespace

Deploy helm chart

Edit values.yaml

daemonset:
  enabled: true  # DaemonSet을 사용하여 Promtail을 배포할지 여부를 결정합니다. Kubernetes 클러스터의 모든 노드에 Promtail을 배포하려면 true로 설정합니다.

serviceAccount:
  create: true  # Promtail이 사용할 Kubernetes Service Account를 생성할지 여부를 결정합니다.
  name: promtail-sa  # 생성할 Service Account의 이름을 지정합니다.
  annotations: {}  # Service Account에 추가할 어노테이션을 지정합니다.

config:
  logLevel: info
  serverPort: 3101
	#  로그를 전송할 Loki 서버의 URL을 지정
  clients:
    # - url: 
    - url: 

  enableTracing: false  # 트레이싱 기능을 활성화할지 여부를 결정합니다.

  snippets:
    pipelineStages:
      - cri: {}  # CRI 로그 포맷을 처리하기 위한 파이프라인 스테이지를 정의합니다.
    common:
      - action: replace
        source_labels:
          - __meta_kubernetes_pod_node_name
        target_label: node_name  # Kubernetes 노드 이름을 기반으로 node_name 레이블을 생성합니다.
      - action: replace
        source_labels:
          - __meta_kubernetes_namespace
        target_label: namespace  # Pod의 네임스페이스를 기반으로 namespace 레이블을 생성합니다.
      - action: replace
        replacement: $1
        separator: /
        source_labels:
          - namespace
          - app
        target_label: job  # namespace와 app 레이블을 조합하여 job 레이블을 생성합니다.
      - action: replace
        source_labels:
          - __meta_kubernetes_pod_name
        target_label: pod  # Pod 이름을 기반으로 pod 레이블을 생성합니다.
      - action: replace
        source_labels:
          - __meta_kubernetes_pod_container_name
        target_label: container  # 컨테이너 이름을 기반으로 container 레이블을 생성합니다.
      - action: replace
        replacement: /var/log/pods/*$1/*.log
        separator: /
        source_labels:
          - __meta_kubernetes_pod_uid
          - __meta_kubernetes_pod_container_name
        target_label: __path__  # 로그 파일의 경로를 지정합니다.
      - action: replace
        replacement: /var/log/pods/*$1/*.log
        regex: true/(.*)
        separator: /
        source_labels:
          - __meta_kubernetes_pod_annotationpresent_kubernetes_io_config_hash
          - __meta_kubernetes_pod_annotation_kubernetes_io_config_hash
          - __meta_kubernetes_pod_container_name
        target_label: __path__  # 수정된 조건으로 로그 파일의 경로를 지정합니다.

    addScrapeJobLabel: false  # 스크레이프 작업의 레이블을 추가하여 Promtail 구성을 디버깅하는 데 도움을 줍니다.
    extraLimitsConfig: ""  # 'limits_config' 블록에 직접 추가될 키를 지정할 수 있습니다.
    extraServerConfigs: ""  # 'server' 블록에 직접 추가될 키를 지정할 수 있습니다.
    extraScrapeConfigs: ""  # 추가적인 스크레이프 구성을 config 파일에 추가할 수 있습니다.
    extraRelabelConfigs: []  # "kubernetes-pods" 작업에 추가적인 relabel_configs를 추가할 수 있습니다.

    # Kubernetes 파드에서 로그를 수집하기 위한 스크레이프 구성입니다.
    scrapeConfigs: |
      # Promtail의 스크레이프 구성 예시입니다. 참조: <https://github.com/grafana/loki/blob/master/production/ksonnet/promtail/scrape_config.libsonnet>
      - job_name: kubernetes-pods
        pipeline_stages:
          {{- toYaml .Values.config.snippets.pipelineStages | nindent 4 }}
        kubernetes_sd_configs:
          - role: pod  # Kubernetes 파드에서 로그를 수집합니다.
        relabel_configs:
          - source_labels:
              - __meta_kubernetes_pod_controller_name
            regex: ([0-9a-z-.]+?)(-[0-9a-f]{8,10})?
            action: replace
            target_label: __tmp_controller_name
          - source_labels:
              - __meta_kubernetes_pod_label_app_kubernetes_io_name
              - __meta_kubernetes_pod_label_app
              - __tmp_controller_name
              - __meta_kubernetes_pod_name
            regex: ^;*([^;]+)(;.*)?$
            action: replace
            target_label: app
          - source_labels:
              - __meta_kubernetes_pod_label_app_kubernetes_io_instance
              - __meta_kubernetes_pod_label_release
            regex: ^;*([^;]+)(;.*)?$
            action: replace
            target_label: instance
          - source_labels:
              - __meta_kubernetes_pod_label_app_kubernetes_io_component
              - __meta_kubernetes_pod_label_component
            regex: ^;*([^;]+)(;.*)?$
            action: replace
            target_label: component
          {{- if .Values.config.snippets.addScrapeJobLabel }}
          - replacement: kubernetes-pods
            target_label: scrape_job
          {{- end }}
          {{- toYaml .Values.config.snippets.common | nindent 4 }}
          {{- with .Values.config.snippets.extraRelabelConfigs }}
          {{- toYaml . | nindent 4 }}
          {{- end }}

  # Promtail 구성 파일의 내용을 정의합니다. 이는 스트링 형태로 구성되어야 하며, 템플릿을 사용하여 재사용 가능한 스니펫으로부터 조합됩니다.
  file: |
    server:
      log_level: {{ .Values.config.logLevel }}  # 서버의 로그 레벨을 설정합니다.
      http_listen_port: {{ .Values.config.serverPort }}  # 서버의 HTTP 리스닝 포트를 설정합니다.
      {{- with .Values.httpPathPrefix }}
      http_path_prefix: {{ . }}  # HTTP 경로 접두사를 설정합니다.
      {{- end }}
      {{- tpl .Values.config.snippets.extraServerConfigs . | nindent 2 }}

    clients:
      {{- tpl (toYaml .Values.config.clients) . | nindent 2 }}  # Loki 서버로 로그를 전송할 클라이언트 구성을 정의합니다.

    positions:
      filename: /run/promtail/positions.yaml  # 로그 파일 위치 추적을 위한 파일 경로를 설정합니다.

    scrape_configs:
      {{- tpl .Values.config.snippets.scrapeConfigs . | nindent 2 }}  # 스크레이프 구성을 포함합니다.
      {{- tpl .Values.config.snippets.extraScrapeConfigs . | nindent 2 }}  # 추가 스크레이프 구성을 포함합니다.

    limits_config:
      {{- tpl .Values.config.snippets.extraLimitsConfig . | nindent 2 }}  # 처리 제한 설정을 포함합니다.

    tracing:
      enabled: {{ .Values.config.enableTracing }}  # 트레이싱 기능 활성화 여부를 설정합니다.

networkPolicy:
  enabled: false  # 네트워크 정책을 생성할지 여부를 결정합니다.
  metrics:
    podSelector: {}  # 메트릭 포트에 접근을 허용할 Pod를 지정합니다.
    namespaceSelector: {}  # 메트릭 포트에 접근을 허용할 네임스페이스를 지정합니다.
    cidrs: []  # 메트릭 포트에 접근을 허용할 특정 네트워크 CIDR을 지정합니다.
  k8sApi:
    port: 8443  # Kubernetes API 엔드포인트 포트를 지정합니다.
    cidrs: []  # 특정 네트워크 CIDR에 대한 접근을 제한합니다.

httpPathPrefix: ""

sidecar:
  configReloader:
    enabled: false  # 구성을 동적으로 리로드하는 사이드카 컨테이너를 활성화할지 여부를 결정합니다.
    image:
      registry: docker.io
      repository: jimmidyson/configmap-reload
      tag: v0.8.0
      pullPolicy: IfNotPresent 
    config:
      serverPort: 9533
    serviceMonitor:
      enabled: true

기본 설정

  • serviceAccount.annotations: AWS 리소스의 권한이 필요할 경우, AWS 역할을 만들고 여기에 추가해서 권한을 사용할 수 있습니다.
  • config.clients: Loki의 gateway 주소를 작성합니다.

Snippets 설정

  • pipelineStages: 로그 파이프라인 스테이지를 정의합니다. 예를 들어, cri: {}는 CRI 로그 포맷을 파싱합니다.
  • common: 여러 kubernetes_sd_configs에 공통적으로 사용될 수 있는 재사용 가능한 스니펫입니다. 이를 통해 레이블을 동적으로 설정하고, 로그 파일 경로를 지정할 수 있습니다. 예를 들어, __meta_kubernetes_pod_node_name 소스 레이블의 값을 node_name 타겟 레이블로 대체합니다.

추가 구성

  • addScrapeJobLabel: 스크레이프 작업 레이블을 추가하여 Promtail 구성을 디버깅할 때 도움을 줍니다. 기본값은 false입니다.
  • extraLimitsConfig, extraServerConfigs, extraScrapeConfigs, extraRelabelConfigs: 사용자가 추가로 제공할 수 있는 설정 옵션으로, Promtail의 limits_config, server, scrape_configs, 그리고 relabel_configs에 직접 추가됩니다.

Network Policy와 Sidecar 설정

  • networkPolicy: 네트워크 정책을 활성화하여 Promtail 서버에 대한 접근을 제한합니다. 기본값은 false입니다.
  • sidecar: Promtail 구성을 동적으로 리로드하는 사이드카 컨테이너를 설정합니다. 예를 들어, configReloader는 구성 변경 사항이 있을 때 Promtail을 자동으로 리로드합니다.

helm install promtail

➜ helm upgrade --install promtail . -f ./values.yaml --namespace loki --create-namespace

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

[Loki]Install Grafana loki-distributed with helm chart  (4) 2023.06.03
[Loki]Grafana Loki Architecture  (0) 2023.06.02
[Loki]What is Grafana Loki?  (0) 2023.06.01
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.