elasticsearch -> 7.10.2
kibana -> 7.10.2
동일한 버전을 사용하여 설치
여기서 initcontainer를 설정안하려면 Dockerfile에서 Dockerhub를 이용하여 이미지를 넣는 방법도 있는데 본 실습에서는 initcontainer에 추가하는 방법입니다.
우아한형제들 기술블로그를 보고 참고하였습니다.
ELK 셋팅부터 알람까지 | 우아한형제들 기술블로그
나도 가고싶다....
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는 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 또한 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 기능을 설정하는 모습입니다.
설치 완료.
slack으로 보내는 웹훅 주소 추가