홈서버에 구축한 ELK Stack (ElasticSearch + Logstash + Kibana + Beats) 에서 EFK Stack (Fluent-bit)로 옮기는 과정에서 발생한 오류들에 대해 적으려 한다.
혹시 EFK Stack을 설치하는 과정에서 오류로 골머리를 앓고 있다면 이 글을 통해 도움을 얻길 바란다.
우선 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을 수행한다.
로그 수집을 위해서는 여러가지 방법이 있는데, 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
그러면 모든 문제가 해결될 것이다.