EFK 설치 관련 Troubleshooting

Jiwan Ahn·2024년 7월 16일
0
post-thumbnail

들어가며

홈서버에 구축한 ELK Stack (ElasticSearch + Logstash + Kibana + Beats) 에서 EFK Stack (Fluent-bit)로 옮기는 과정에서 발생한 오류들에 대해 적으려 한다.

혹시 EFK Stack을 설치하는 과정에서 오류로 골머리를 앓고 있다면 이 글을 통해 도움을 얻길 바란다.

ECK Operator

우선 ElasticSearch + Kibana를 가장 쉽게 설치하는 방법은 ECK Operator를 설치하는 것이다. Operator가 ElasticSearch와 Kibana를 쿠버네티스에 적절하게 배포하기 때문에 웬만하면 ECK Operator로 설치하는 것이 좋다.

https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-eck.html

위 링크를 통해 그대로 따라하면 끝이다.

ElasticSearch의 경우도 아래의 링크를 그대로 따라하면 된다.
https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-elasticsearch.html

문제는 이 후 Kibana를 설치할 때 발생한다. Kibana 또한 https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-kibana.html 이 링크를 따라하면 되는데, 아마 높은 확률로 Kibana의 작동을 확인하기 위해 kubectl portforward 로 포트포워딩을 하면 연결이 되지 않을 것이다. localhost:5601로도 접속이 실패할 것이다.

허나 curl을 통해 해당 Endpoint로 접속을 시도하면 다음과 같은 오류가 발생한다.

curl: (60) SSL certificate problem: self signed certificate in certificate chain

Kibana가 Https 연결을 구축할 때 사용하는 인증서는 Self-Signed Certificate다. 즉 Certificate-Authority에서 공식적으로 인증받은 인증서가 아니기 때문에, 인증되지 않은 인증서라고 판단하여 연결이 거부되는 것이다.

따라서 Kibana Instance를 Deploy 할 때, 다음과 같이 옵션을 추가한다.

apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 8.14.2
  count: 1
  elasticsearchRef:
    name: quickstart
  http: ### Disable TLS certificate 
    tls:
      selfSignedCertificate:
        disabled: true

다음과 같이 자체 서명한 인증서를 사용하지 않도록 설정한다. "엥? 그럼 https 연결이 구축이 되지 않아서 위험한거 아니야?" 라고 생각할 수 있지만 그렇지 않다.

쿠버네티스 클러스터를 운용하기 위해서는 거의 반드시 Ingress Controller를 설치할 것이고, 이 때 여러분들은 Cert-manager 등을 이용해서 인증서를 적용할 것이다. 따라서 클라이언트와 Ingress Controller 간 https 통신은 암호화가 된다.

그러나 트래픽이 Ingress Controller에 도달했으면, 이후에는 쿠버네티스 클러스터 내부로 트래픽이 포워딩이 되며, 이 때는 외부 공격자가 이 트래픽을 볼 수 없으므로 굳이 TLS 연결을 하지 않아도 된다. 이를 "TLS Termination"이라고 부른다. Origin Server 내부에서는 추가적인 오버헤드가 발생하는 TLS 암호화를 하지 않아도 되기 때문에, 보통 인클러스터 통신은 TLS Termination을 수행한다.


Fluent-bit

로그 수집을 위해서는 여러가지 방법이 있는데, Beats+Logstash를 사용하거나 Fluent-bit를 이용하는 방법이 있다. Logstash는 좀 구시대 유물이라서 요즘은 Fluent-bit를 활용한 EFK 스택을 주로 쓰는데, Fluent-bit도 helm을 이용하면 설치는 문제가 없다.

https://artifacthub.io/packages/helm/fluent/fluent-bit

문제는 Fluent-bit를 설치하고 이 후 failed to flush the buffer 오류가 굉장히 많이 일어날 것이다. 로그를 전송할 때 버퍼 사이즈를 초과하거나, 또는 엔드포인트를 잘못 설정해서 발생하는 에러일 수 있다.

또 다른 오류로는

[error][output:es:es.0] HTTP status=400 URI=/_bulk, response: {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"}],"type":"illegal_argument_exception","reason":"Action/metadata line [1] contains an unknown parameter [_type]"},"status":400}

이 에러가 날 확률도 높다.

이를 해결하기 위해서는 fluent-bit를 설치할 때 (helm 기준) values.yaml을 다음과 같이 작성한다.

  outputs: |
    [OUTPUT]
        Name            es
        Match           *
        Host            quickstart-es-http.elastic-stack.svc
        Port            9200
        HTTP_User       ${ES_USER}
        HTTP_Passwd     ${ES_PASSWORD}
        Suppress_Type_Name On ## unknown parameter [_type] 무시
        Logstash_Format On
        Replace_Dots    On
        Buffer_Size     False ## Buffer size 무제한
        Retry_Limit     False
        TLS             On
        TLS.verify      Off

그러면 모든 문제가 해결될 것이다.

profile
Engineer, to be a Pioneer.

0개의 댓글