EFK

Moon's DevOps·2023년 6월 23일
0

EKS

목록 보기
1/2

EKS에 efk 모니터링 설치 및 alert 설정

설치하기

elasticsearch -> 7.10.2
kibana -> 7.10.2
동일한 버전을 사용하여 설치

사전준비

  • 기존 7.15 버전에서는 alerting 기능을 사용하려면 라이센스 등록이 필요한데 무료로 alerting 기능을 사용할 수 있는 opendistro 라는 부가 플러그인을 설치하여 alerting 기능을 활성화하는 시나리오입니다. 하지만 이 때 opendistro라는 부가 플러그인을 사용하려면 최소 7.10.2 버전까지만 호환이 되기때문에 버전을 다운그레이드해서 사용했습니다.
    https://opendistro.github.io/for-elasticsearch-docs/

설치 순서

  1. helm 설치
  2. Kibana, Elastic에 대한 init continer 생성 (Plugin 설치)하고 본 Cotnaier에 해당 디렉토리 /usr/share/elasticsearch/plugins 공유
  3. Slack 연동 & 대시보드 구성

여기서 initcontainer를 설정안하려면 Dockerfile에서 Dockerhub를 이용하여 이미지를 넣는 방법도 있는데 본 실습에서는 initcontainer에 추가하는 방법입니다.

우아한형제들 기술블로그를 보고 참고하였습니다.
ELK 셋팅부터 알람까지 | 우아한형제들 기술블로그
나도 가고싶다....

elasticsearch 설치

7.10.2 버전의 elasticsearch와 kibana를 설치하고 압축까지 풀어줍니다.

이 과정에서 중요한 부분은 initcontainer를 통해 플러그인들을 볼륨마운트를 시켜줘야 정상적으로 alerting 기능이 정상 수행합니다. 따라서 helm values.yaml 값을 변경해줘야합니다.

$ cd helm-charts-7.10.2
$ cd elasticsearch

 25 esConfig:
 26   elasticsearch.yml: |
 27     xpack.security.enabled: false

여기서 xpack을 사용해서 alerting 기능을 사용하려면 라이센스를 구매해야합니다.
그래서 false 값을 임의로 넣어줍니다.

139 extraVolumes:
140   - name: elastic-plugin
141     emptyDir: {} 

volume을 생성하고

142 
143 extraVolumeMounts:
144  - name: elastic-plugin
145    mountPath: /usr/share/elasticsearch/plugins

volumeMount 경로를 지정해줍니다.

146 
153   - name: plugin-install
154     image: docker.elastic.co/elasticsearch/elasticsearch:7.10.2
155     command: ['sh', '-c', 'bin/elasticsearch-plugin install --batch https://d3g5vo6xdbdb9a.cloudfront.net/downloads/elasticsearch-plugins/opendistro-a    lerting/opendistro-alerting-1.13.1.0.zip']
156     volumeMounts:
157     - name: elastic-plugin
158       mountPath: "/usr/share/elasticsearch/plugins"

또한 pod 내에 있는 경로를 지정하여 본 컨테이너와의 연동을 위해 지정해주고
command 라인을 이용하여 opendistro plugin을 성공적으로 다운로드 했을 때 본 컨테이너가
실행될 수 있도록 설정하였습니다.
혹시 command라인의 뜻을 궁금해하시는 분들이 있는데 opendistro 사이트에 가면 elasticsearch
설치 방법이 나와있습니다.

$ bin/elasticsearch-plugin install https://d3g5vo6xdbdb9a.cloudfront.net/downloads/elasticsearch-plugins/opendistro-alerting/opendistro-alerting-1.13.1.0.zip
이 명령어를 참조하여 initcontainer command에 넣어준 모습입니다.

또한 elasticsearch 의 플러그인 공식 Document에서도 활용하여 넣어준 모습입니다.

여기서 중요한 부분은 initcontainer에도 7.10.2의 동일한 이미지가 들어가야 합니다!!

따라서 elasticsearch의 설치준비는 끝났습니다.

$ helm upgrade --install elasticsearch . \
-n logging \
--set volumeClaimTemplate.resources.requests.storage=20Gi \
--set volumeClaimTemplate.storageClassName=default \
--set antiAffinityTopologyKey=elasticsearch \
--set antiAffinity=soft

storage 용량은 20Gi 스토리지클래스 이름은 default로 설정을 하였습니다.

fluentd 설치

Fluentd는 0.3.2의 버전을 사용했습니다. fluentd의 공식 repo에서 가져왔습니다.

또한 시간기반의 로그를 뽑아와야하기때문에 config를 수정해줍니다.

$ helm upgrade --install fluentd . -n efk

<source>
106       @id fluentd-containers.log
107       @type tail
108       path /var/log/containers/*.log
109       pos_file /var/log/containers.log.pos
110       tag raw.kubernetes.*
111       read_from_head true
112       <parse>
113         @type multi_format
114         <pattern>
115           format json
116           time_key time
117           time_format %Y-%m-%dT%H:%M:%S.%NZ
118           keep_time_key true
119         </pattern>
120         <pattern>
121           format /^(?<time>.+) (?<stream>stdout|stderr) [^ ]* (?<log>.*)$/
122           time_format %Y-%m-%dT%H:%M:%S.%N%:z
123           keep_time_key true
124         </pattern>
125       </parse>
126       emit_unmatched_lines true
127     </source>

time 부분에 true라고 설정을 해줘야합니다.

kibana 설치

Kibana 또한 elasticsearch 7.10.2의 helm-chart에 있습니다. 따라서 설치 방법은 동일합니다.

kibana helm 공식 repo입니다.

helm-charts/values.yaml at main · elastic/helm-charts

HTTPS 통신을 위해 secret을 생성해야합니다.(crt,key 값을 이용하여)

여기서 crt와 key 값은 구하셔서 넣어야 합니다.

$ kubectl create -n logging secret tls efk-tls-ingress --key private.key --cert certificate.crt
$ cd helm-charts-7.10.2
$ cd kibana

16 envFrom:
 17  - secretRef:
 18      name: [생성한 secrets 이름]
		-> ingress를 하기위한 secret 등록

89 extraVolumes:
 90  - name: kibana-plugin
 91    emptyDir: {}
	 볼륨마운트
 93 extraVolumeMounts:
 94  - name: kibana-plugin
 95    mountPath: /usr/share/kibana/plugins

 97 extraContainers: ""
 98 # - name: dummy-init
 99 #   image: busybox
100 #   command: ['echo', 'hey']
101 
102 extraInitContainers:
103  - name: plugin-install
104    image: docker.elastic.co/kibana/kibana:7.10.2
105    command: ['sh', '-c', 'bin/kibana-plugin install https://d3g5vo6xdbdb9a.cloudfront.net/downloads/kibana-plugins/opendistro-alerting/opendistroAlertingKibana-1.13.0.0.zip']
106    volumeMounts:
107    - name: kibana-plugin
108      mountPath: "/usr/share/kibana/plugins"

ingress:
  enabled: true
  annotations:
     kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  path: /
  hosts:
    - [DNS 주소]
  tls:
    - secretName: [생성한 secrets 이름]
      hosts:
        - [DNS 주소]

elasticsearch에서 설명하듯 비슷한 설정 파일을 가지고 있고 initcontainer를 통해서 플러그인 설치를 진행합니다. 이 때도 volume을 마운트 시켜 플러그인 설치 경로를 지정해 줍니다.

단, helm-Chart를 보시면 extra항목이 차트에 없기 때문에 추가로 넣어줘야합니다.

template → deployment.yaml 수정

helm-charts/deployment.yaml at main · elastic/helm-charts

53       {{- if .Values.extraVolumes }}
54 {{ toYaml .Values.extraVolumes | indent 8 }}
55       {{- end }}

158         {{- if .Values.extraVolumeMounts }}
159 {{ toYaml .Values.extraVolumeMounts | indent 10 }}
160         {{- end }}

공식 helm-chart를 보고서 값을 추가해준 모습입니다. 값을 넣지 않으면 플러그인 설치 시 오류가 납니다.

또한 ingress를 통한 https 통신을 하기위해 secrets 정보를 넣어준 모습이고 ingress 설정한 모습입니다.

ingress를 생성하였기때문에 ingress controller도 설치를 해야합니다.

$ helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx \
--set controller.replicaCount=2

$ kubectl get ingress

helm upgrade --install kibana . -n logging \
--set service.type=ClusterIP \
--set service.port=5601

command

$ bin/kibana-plugin install https://d3g5vo6xdbdb9a.cloudfront.net/downloads/kibana-plugins/opendistro-alerting/opendistroAlertingKibana-1.13.0.0.zip

위와 같은 command를 초기화컨테이너에 플러그인 설치를 넣어줍니다

Standalone Kibana Plugin Install

이제 기본적인 설정은 끝났습니다. ingress에 등록된 HOST를 타고 들어가서 Alerting 기능을 설정하는 모습입니다.

설치 완료.


Alert 설정




slack으로 보내는 웹훅 주소 추가

profile
Devops, AWS infra

0개의 댓글