• NCP(Naver Cloud Platform) - SES(Search Engine Service) 와 Fluent Bit 구축

    2024. 4. 15.

    by. Daramu

    환경: NCP

    구성: NKS 2Node

     

    NCP의 SES(Search engine Service)를 사용해서 Fluent bit를 구축할 것이다.

     

    우선 알아야할 것은, Fluent bit는 Log를 수집하고 보낸주는 역할을 하고, SES로 구축하는 Opensearch 는 Log를 받아 시각화 해주는 역할을 한다는 것이다.

     

    자주 이야기하는 Eliastic의 ELK스택과 유사하다 생각하면 편하다.

    애초에 Opensearch가 Elastic의 라이센스 변경에 대한 반발로 Fork질 해서 나온것이니.....

     

    이름을 붙이자면 OFO정도지 않을까?(Opensearch, Fluent bit, Opensearch-dashboard)......

     

     

    아무튼 구성도는 이러하다.

    각 Worker Node마다 Daemonset(Node마다 Pod를 하나씩 생성)형식으로  Pod를 배포한다.

    해당 Pod의 Image는 Fluent bit이며, 해당 항목을 통해 Container의 Log를 수집할 것이다.

     

    수집한 로그는 Opensearch로 보낼 것이고, 해당 Log를 Opensearch-dashboard를 통해 볼 수 있을 것이다.

     

    우선 NCP환경이기에 Kubernetes또한 NKS를 사용할 것이고,

    Opnesearch또한 Search engine Service를 사용할 것이다.

     

    직접 VM으로 구축하는 것과 완전관리형으로 제공받는 것, 무엇이 좋냐고 물어본다면...... 솔직하게는 직접 구축이 좋은 것 같다는 생각이 든다. 버전의 선택이나, 더 넓은 configure 범위, 비용적인 문제....

     

    하지만 CSAP나 보안인증등을 받을 생각이 있다면 NCP측에서 사전에 보안인증을 마친 완전관리형을 사용 하는 것이 훨씬 유리할 것이다.

     

    잡소리가 길었는데 이쯤에서 본론으로 들어가겠다.

     

    0.우선 NKS를 설치하고 Bastion Server에서 해당 Kubernetes Cluster와 연동한다.

    자세한 사항은 아래의 링크를 따라하면 된다.

    https://guide.ncloud-docs.com/docs/ko/k8s-k8soverview

     

    Ncloud Kubernetes Service 개요

     

    guide.ncloud-docs.com

     

    준비가 되었다면 이제 본격적으로 yaml파일을 생성한다.

    순서는 

    1. ServiceAccount

    2. ConfigMap

    3. Daemonset

     

    순으로 작성할 것이다.

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: fluentbitds
      namespace: logging
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: fluentbit
    rules:
      - apiGroups: [""]
        resources:
          - namespaces
          - pods
          - nodes
          - nodes/proxy
        verbs:
          - get
          - list
          - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: fluentbit
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: fluentbit
    subjects:
      - kind: ServiceAccount
        name: fluentbitds
        namespace: logging
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: fluent-bit-config
      namespace: logging
      labels:
        k8s-app: fluent-bit
    data:
      fluent-bit.conf: |
        [SERVICE]
            Flush         1
            Log_Level     info
            Daemon        off
            Parsers_File     /fluent-bit/etc/parsers.conf
        @INCLUDE input-kubernetes.conf
        @INCLUDE filter-kubernetes.conf
        @INCLUDE output-opensearch.conf
        @INCLUDE input-nodeexporter.conf
        @INCLUDE output-nodeexporter.conf
    
      input-kubernetes.conf: |
        [INPUT]
            Name             tail
            Path             /var/log/containers/*.log
            Tag              kube.*
            Parser           cri
            Mem_Buf_Limit    0
            Skip_Long_Lines  On
    
      filter-kubernetes.conf: |
        [FILTER]
            Name             kubernetes
            Match            kube.*
            Kube_URL         https://kubernetes.default.svc:443
    
      output-opensearch.conf: |
        [OUTPUT]
            Name            opensearch
            Match           *
            Host            SES IP
            Port            9200
            HTTP_User       name
            HTTP_Passwd     pw
            tls             On
            tls.verify      Off
            Index           nks-%Y.%m.%d
    
      parsers.conf: |
        [PARSER]
            # http://rubular.com/r/tjUt3Awgg4
            Name cri
            Format regex
            Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<message>.*)$
            Time_Key    time
            Time_Format %Y-%m-%dT%H:%M:%S.%L%z
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentbit
      namespace: logging
      labels:
        app.kubernetes.io/name: fluentbit
    spec:
      selector:
        matchLabels:
          name: fluentbit
      template:
        metadata:
          labels:
            name: fluentbit
        spec:
          serviceAccountName: fluentbitds
          containers:
            - name: fluent-bit
              imagePullPolicy: Always
              image: fluent/fluent-bit:latest
              ports:
              - containerPort: 9090
              volumeMounts:
                - name: varlog
                  mountPath: /var/log
                - name: varlibdockercontainers
                  mountPath: /var/lib/docker/containers
                  readOnly: true
                - name: fluent-bit-config
                  mountPath: /fluent-bit/etc/
          volumes:
            - name: varlog
              hostPath:
                path: /var/log
            - name: varlibdockercontainers
              hostPath:
                path: /var/lib/docker/containers
            - name: fluent-bit-config
              configMap:
                name: fluent-bit-config

     

    이렇게 생성하면 fluent bit pod가 생성되었을 것이다.

     

    SES로 생성한 대시보드를 보고 싶다면, 해당 Manager Node에 대하여 LB(Load Balancer)를 생성하여 접속할 수 있다.

     

     

    TCP 80번에 타겟그룹은 자동으로 생성된 xxx-ses-m-xxxx 를 선택하여 타겟그룹을 생성한 후에,

    해당 타겟그룹을 사용하는 LB를 생성하면 된다.

     

    해당하는 작업을 마쳤다면 LB를 통해 opensearch로 접근한다.

    최초 ses를 생성할때 id/pw를 입력했을 텐데, 해당하는 id/pw가 opensearch 웹페이지의 계정이다.

     

    ses로 접속했다면 좌측의 줄무늬 3개를 클릭하여 메뉴를 열고, index를 생성한 후에 discover를 클릭하면 log를 볼 수 있다.

     

    댓글