• 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를 볼 수 있다.

     

    댓글