티스토리 뷰

Cloud/Kubernetes

fluent-bit with azure service

Jacob_baek 2023. 1. 2. 20:15

fluent-bit pipeline 중 azure (log anayltics workspace) 혹은 azure_blob 에 log를 저장하는 방법을 알아보자.

Log Analytics workspace

azure Log Analytics workspace에 log를 저장하기 위해서는 fluent-bit의 pipeline에 다음 정보가 존재해야 한다.

  • log analysis workspace ID
  • sharedkey

위 정보는 다음과 같은 명령어로 확인이 가능하다.

WORKSPACEID=$(az monitor log-analytics workspace show -g $LogAppRG -n $LogAppName --query customerId -o tsv)
SHAREDKEY=$(az monitor log-analytics workspace get-shared-keys -g $LogAppRG -n $LogAppName --query primarySharedKey -o tsv)

만약 위 Log Analytics workspace가 없는 경우라면 다음 명령을 통해 생성하고
확인된 정보를 기반으로 다음과 같이 secret 및 fluent-bit daemonset 배포를 진행한다.

아래 가이드에서 나와있듯이 helm이 아닌 직접적인 yaml 기반의 설치를 진행할 예정이다.

prepare

위에 이야기했던 Log Analytics workspace 및 secret을 생성한다.

Prefix="fluentbitlog"
LogAppLoc="koreacentral"
LogAppRG="${Prefix}-rg"
LogAppName="${Prefix}-law"

NS="logging"

kubectl create ns $NS
kubectl create secret generic fluentbit-secrets -n $NS \
  --from-literal=WorkspaceId=$(az monitor log-analytics workspace show -g $LogAppRG -n $LogAppName --query customerId -o tsv) \
  --from-literal=SharedKey=$(az monitor log-analytics workspace get-shared-keys -g $LogAppRG -n $LogAppName --query primarySharedKey -o tsv)

kubectl get secret fluentbit-secrets -n $NS -o jsonpath='{.data}'

이후 제공되는 git 주소에서 yaml파일들을 가져와 설정 및 배포를 진행한다.

# git clone https://github.com/Microsoft/fluent-bit-azure-log-analytics
# cd fluent-bit-azure-log-analytics/fluentbit
# ls 
account.yaml  config.yaml  fluentbit-daemonset.yaml  fluentbit-pod.yaml  logapp.yaml  run-in-loop.yaml

fluent-bit 설정

가져온 yaml들의 namespace를 그대로 사용한다면 별도의 작업은 필요하지 않고
각 yaml들의 namespace 이름을 변경해야 한다.

그리고 docker가 아닌 containerd가 최신의 버전에서는 공식 사용되어지고 있기에 문제되지 않겠지만
일부 docker를 runtime으로 쓰고 있는 환경이라면 config.yaml내 parser를 변경해야 한다.

이후 다음 순서로 배포가 이루어지면 된다.

  1. account.yaml
  2. config.yaml
  3. fluentbit-daemonset.yaml

account.yaml은 sa 및 role 들이 지정되어 있기에 변경없이 배포하면되며
나머지 config.yaml 및 fluentbit-daemonset.yaml은 아래 내용을 참고하여 필요에 따라 변경해서 사용하면 된다.

config.yaml을 배포하게 되면 다음과 같은 output이 존재하며
이를 필요에 따라 변경해서 Log Analytics workspace에 저장되는것을 확인할 수 있다.

apiVersion: v1
data:
  filter-kubernetes.conf: |
    [FILTER]
        Name                kubernetes
        Match               kube.*
        ...

  fluent-bit.conf: |
    [SERVICE]
        Flush         1
        Log_Level     info
        ...

  input-kubernetes.conf: |
    [INPUT]
        Name              tail
        Tag               kube.*
        ...

  output.conf: |
    [OUTPUT]
        Name            azure
        Match           kube.var.log.containers.logapp*.*
        # Match           kube.*                   ##### <== 위 설정은 특정 logapp tag를 포함한 경우로 제한되어 있어 다음과 같은 설정이 되면 kube.* tag가 포함된 모든 log가 log anayltic workspace에서 확인이 되어진다.
        Customer_ID     ${WorkspaceId}
        Shared_Key      ${SharedKey}
        Log_Type        ${LogName}
        ...

위와 같은 configmap이 존재하는 상황에서 daemonset이 배포되어지게 되면
해당 변수를 아래와 같이 환경변수로 사용되게 된다.
(fluentbit-secrets은 앞서 생성한 secret 에 저장된 정보이다.)

   spec:                                                                                                                                              containers:                                                                                                                                      - env:                                                                                                                                             - name: WorkspaceId                                                                                                                                valueFrom:                                                                                                                                         secretKeyRef:                                                                                                                                      key: WorkspaceId                                                                                                                                 name: fluentbit-secrets                                                                                                                    - name: SharedKey                                                                                                                                  valueFrom:                                                                                                                                         secretKeyRef:
              key: SharedKey
              name: fluentbit-secrets
        - name: LogName
          value: logapp
        image: fluent/fluent-bit:1.6
        imagePullPolicy: Always
        name: fluent-bit

배포가 완료된 후 아래와 같은 log를 통해 rest api로 호출하여 추가되는 작업이 수행됨을 유추해 볼 수 있다.

[2023/01/03 06:56:11] [ info] [output:azure:azure.0] customer_id=103cf1e8-a911-420a-9cd5-dcc596eda577, HTTP status=200
[2023/01/03 06:56:12] [ info] [output:azure:azure.0] customer_id=103cf1e8-a911-420a-9cd5-dcc596eda577, HTTP status=200
[2023/01/03 06:56:13] [ info] [output:azure:azure.0] customer_id=103cf1e8-a911-420a-9cd5-dcc596eda577, HTTP status=200
[2023/01/03 06:56:13] [ info] [output:azure:azure.0] customer_id=103cf1e8-a911-420a-9cd5-dcc596eda577, HTTP status=200
[2023/01/03 06:56:14] [ info] [output:azure:azure.0] customer_id=103cf1e8-a911-420a-9cd5-dcc596eda577, HTTP status=200
[2023/01/03 06:56:15] [ info] [output:azure:azure.0] customer_id=103cf1e8-a911-420a-9cd5-dcc596eda577, HTTP status=200
[2023/01/03 06:56:16] [ info] [output:azure:azure.0] customer_id=103cf1e8-a911-420a-9cd5-dcc596eda577, HTTP status=200
[2023/01/03 06:56:16] [ info] [output:azure:azure.0] customer_id=103cf1e8-a911-420a-9cd5-dcc596eda577, HTTP status=200
[2023/01/03 06:56:16] [ info] [output:azure:azure.0] customer_id=103cf1e8-a911-420a-9cd5-dcc596eda577, HTTP status=200
[2023/01/03 06:56:17] [ info] [output:azure:azure.0] customer_id=103cf1e8-a911-420a-9cd5-dcc596eda577, HTTP status=200

다음 Log Analytics workspace 에 대한 fluent-bit 상의 설정정보가 정리된 페이지이다. 참고하여 설정을 진행한다.

Log Analytics Workspace에서 확인

이제 생성된 log가 log analytics workspace에서 query를 통해 검색이 이루어지는지 확인해보자.
먼저 log analytics workspace내 custom logs 항목에 다음과 같은 테이블이 생성되었음을 확인할 수 있다.
(이는 config.yaml에서 설정한 이름으로 추가되어진다.)

함께 생성된 field들이 아래와 같이 확인된다.

custom logs들을 logs 메뉴에서 검색 및 쿼리를 통해 선별해볼수 있다.

Azure Blob Storage

앞선 Log Analytics workspace와 같이 방식으로 sharedkey를 가져와 secret으로 지정한다.
먼저 storage account가 생성이 안되어 있다면 아래와 같은 명령을 이용해 생성을 진행하고 secret을 생성한다.

Prefix="fluentbitbloblog"
LOC="koreacentral"
RG="${Prefix}-rg"
SA_NAME="${Prefix}-law"

NS="logging"

az group create --name $RG --location $LOC
az storage account create \
  -n $SA_NAME -g $RG \
  --location $LOC \
  --sku Standard_RAGRS \
  --kind StorageV2


kubectl create ns $NS
kubectl create secret generic fluentbit-blob-secrets -n $NS \
  --from-literal=SharedKey=$(az storage account keys list -n $SA_NAME -g $RG --query '[0].value' -o tsv)

이번에도 동일하게 다음 순서대로 배포를 진행한다.
(배포전에 다음 파일들을 수정해야 한다.)

  1. account.yaml
  2. config.yaml
  3. fluentbit-daemonset.yaml

실제 사용될 config.yaml / fluentbit-daemonset.yaml 파일들은 다음과 같이 변경이 필요하다.
아래는 config.yaml 파일의 설정중 변경이 필요한 부분이다.

  output.conf: |
    [OUTPUT]
        name                  azure_blob
        #match                 kube.*
        match                 kube.var.log.containers.logapp*.*
        account_name          jacoblogsa
        shared_key            ${SharedKey}
        path                  kubernetes
        container_name        fluentbitlogs
        auto_create_container on
        tls                   on

위 정보중 continaer_name 및 path는 auto_create_container가 on(default)으로 설정되어 있다면
없는 경우에도 새로 생성하여 저장이 이루어지게되니 입맛에 맞게 지정하면 된다.

아래는 fluentbit-daemonset.yaml에서 변경이 필요한 부분이다.

      containers:
      - name: fluent-bit
        image: fluent/fluent-bit:1.6
        imagePullPolicy: Always

        ports:
          - containerPort: 2020

        env:
        - name: SharedKey
          valueFrom:
            secretKeyRef:
              name: fluentbit-blob-secrets
              key: SharedKey

배포가 완료된이후 blob으로 log 전송이 이루어짐을 짐작할 수 있는 로그가 아래와 같이 출력된다.

[2023/01/03 06:48:20] [ info] [output:azure_blob:azure_blob.0] content appended to blob successfully
[2023/01/03 06:48:21] [ info] [output:azure_blob:azure_blob.0] content appended to blob successfully
[2023/01/03 06:48:22] [ info] [output:azure_blob:azure_blob.0] content appended to blob successfully
[2023/01/03 06:48:23] [ info] [output:azure_blob:azure_blob.0] content appended to blob successfully
[2023/01/03 06:48:24] [ info] [output:azure_blob:azure_blob.0] content appended to blob successfully
[2023/01/03 06:48:25] [ info] [output:azure_blob:azure_blob.0] content appended to blob successfully
[2023/01/03 06:48:26] [ info] [output:azure_blob:azure_blob.0] content appended to blob successfully

실제 storage account에서 확인해보면 다음과 같이 container로 저장된 로그 파일들을 확인 할 수 있다.

다음 Azure Blob 에 대한 fluent-bit 상의 설정정보가 정리된 페이지이다. 참고하여 설정을 진행한다.

Summary

azure blob로 직접 log를 저장하는 경우 파일 형태로 저장되어지기에 실제 log 검색은 직접 다운받아 검색을 하거나 별도의 data explorer cluster에 event grid 를 연결하여 넘기는 방법이 있다.

Log Analytics workspace에 있는 log들을 아래 기능을 이용해 storage account로 백업하는 법도 있으니 이를 참고해보면 좋을것 같다.
(Log Analytics workspace에 있는 data export 기능은 custom table에 대해 기능일 지원하고 있지 않아 아래 방법을 사용해야 한다.)

또한 위 두가지 방식 모두 secret 정보인 shared key가 포함되어지기에 운영환경이라면 필히 Azure Key vault와 같은 서비스를 통한 key 보관 및 가져오기를 사용하는것을 추천한다.

Disclaim
Microsoft의 공식적인 문서가 아닌 개인의 경험을 바탕으로 작성된 내용임을 알립니다.
This is not official document published by Microsoft. Note that this document is based on personal experience.

'Cloud > Kubernetes' 카테고리의 다른 글

Custom Container Registry with containerd runtime on Kubernetes  (0) 2023.02.13
cert-manager with ingress-nginx  (0) 2023.02.13
Kaniko  (0) 2022.12.26
kubectl debug and koolkit  (0) 2022.04.14
Kubernetes Sealed Secrets  (0) 2022.03.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함