data engineering

rancher kubernetes kibana + elasticsearch 설치 삽질 정리.

qkqhxla1 2020. 2. 18. 14:05

로깅용으로 elasticsearch + kibana를 띄우려고 한다. 현재 우리서버에 엘라스틱서치서버가 있는데 여기 말고 내가 만들 서비스의 로깅용도로 새로 만들라고 하셔서, 즐거운 마음으로(?) 저 조합으로 띄워 보고자 하였다. 

그런데 애초에 엘라스틱서치와 친한 내가 아니어서, 쿠버네티스 설정의 어려움 말고도 엘라스틱서치 설정의 어려움까지 더해져서 진짜 엄청나게 삽질을 했다. 필요없었던 삽질은 정리하고, 유용한 삽질과 얻은것들을 정리해보고자 한다.


처음에는 가장 쉬운 방법으로 접근해보았다. 가장 쉬운 랜쳐에서 App으로 efk라고 불리는 elasticsearch + flunted + kibana조합으로 패키징이 이미 다 되어있어서 클릭만 하면 자동으로 만들어진다. 이거로 만들어보기로 하였다. 그런데 랜쳐 버전이 문제인지 쿠버네티스가 문제인지 가장 최신 버전으로 보이는 버전이 설치가 되지 않았고, 한단계 낮은 버전으로 설치를 했다. 둘다 6.2.0버전으로 설치가 되었고 키바나와 엘라스틱서치가 잘 연동이 되었다.

그런데 문제는 키바나에서 보이는 탭이 적다는거다.

오른쪽의 탭이 많은 부분이 내가 기대한 모습인데 efk 낮은 버전으로 설치했을시에 왼쪽처럼 탭이 안보인다. 탭이 많아야 하는 이유는 키바나에서 엘라스틱서치를 Monitoring하기 위해서다.


뭐지 하고 이것저것 찾아보니 이것은 x-pack이라는게 없거나 enable되지 않아서 생기는 문제였다. x-pack은 추가적인 플러그인같은 개념인것같다.


결국 나의 목표는 엘라스틱서치와 키바나를 설치후 연동시키고, x-pack을 설치 또는 enable시켜서 엘라스틱서치 모니터링이 가능하게끔 만들어주는거다.


https://www.elastic.co/guide/en/elasticsearch/reference/7.x/collecting-monitoring-data.html

https://www.elastic.co/guide/en/kibana/7.6/monitoring-settings-kb.html


얘내들을 읽어보고 나니 xpack.monitoring.enabled 이런애들을  설정해줘야 할것 같다. 


랜쳐의 efk앱에서는 설명도 부족하고, 만져볼 구석이 거의 없다. efk말고 elk도 설치해봤지만 상황이 비슷했다. 

그래서 이번엔 App으로 엘라스틱서치 설치 따로, 키바나 설치 따로한다음 둘이 연동해보기로 했다.(따로 설치하는만큼 내가 더 세세하게 컨트롤할수있는 부분이 많을것같아서 이랬다.)




엘라스틱서치 설치.

엘라스틱서치 최신버전을 App에서 추가옵션없이 설치해봤는데 오랫동안 제대로 deploy되지 않았다. 제대로 deploy되지 않은 인스턴스의 yml 로그를 봤더니 이와 같은 에러로그가 있다.

pod has unbound immediate PersistentVolumeClaims (repeated 17 times)

이건 PersistentVolume이 필요한데 제대로 할당이 안되었다는 거다. 랜쳐 클러스터의 Volumes탭에서 보면 Pending상태에서 변하지 않는다.

사진을 보면 제대로 할당된거는 Bound라고 뜨지만 아닌거는 계속 멈춰있다.

이런 에러를 본적이 있는데.. 제대로 Bound된건 내 클러스터가 현재 aws로 만들어진 cluster인 만큼 특별한게 없으면 ebs-volume를 할당해주면 된다. App에서는 볼륨을 할당하려고 하는데 내 클러스터가 aws로 만들어진 클러스터인지 잘 모르고.? 기본적인 볼륨 할당 요청을 하면 잘 만들어지지 않는 것 같다.(확실하지 않음. 나중에 확인 필요) 어쨌든 ebs-volume로 할당해주면 된다.


ebs로 할당해주는 방법은 랜쳐에서 간단한 App의 경우에는 앱 설치시 아래처럼 친절하게 물어보는 경우가 있고

App 설치화면에서 PersistentVolume관련 설정이 없으면 helm설정에서 뭔가 다르거나 옵션이 있을텐데 뭔지 모르겠다. 뭐가 다른지 찾기 위해서 위처럼 친절하게 ebs-volume으로 자동으로 할당해주는 App과 PersistentVolume에러가 뜨는 App을 양쪽에서 열고 yml을 하나하나 비교해봤다. 


찾다보니 친절하게 물어봐주는 앱의 yml에서 volume관련 검색을 해봤더니 아래와 같았다.

volumeClaimTemplates:

  - metadata:

      creationTimestamp: null

      name: es-data

    spec:

      accessModes:

      - ReadWriteOnce

      dataSource: null

      resources:

        requests:

          storage: 50Gi

      storageClassName: ebs-volume

      volumeMode: Filesystem


그리고 계속 Pending되는 앱의 경우에는 volumeClaimTemplates에서 진하게 표시된 storageClassName이 없다. 역시 둘다 ebs-volume설정을 해줘야하는데 storageClassName이 그걸 결정하는것 같고, volumeClaimTemplates에 자동으로 ebs-volume이라고 들어가있는 애들은 에러가 안뜬다.


다시 엘라스틱서치 helm chart로 돌아와서 검색을 해봤다. 그리고 아래 옵션을 찾을수 있었다.

딱봐도 master.persistence.storageClass가 storageClassName을 결정하는것 같다. 기본값이 nil이어서 아무것도 안 들어가서 에러난것 같아서 저기에 뭘 넣어눠야하나 찾아봤더니 storage의 volume에 ebs-volume가 등록되어 있다.(누가 등록한듯)


ebs-volume값을 넣어주고 설치했더니 엘라스틱서치 최신버전이 드디어 설치가 되었다.




키바나 설치와 엘라스틱서치 연동.

키바나도 마찬가지로 persistentVolumeClaim.storageClass라는 비슷한 옵션이 있어서 그걸 세팅해줬더니 최신버전이 설치가 되었다. 둘이 연동해야하는데 일단 돌아가고 있는 키바나 인스턴스의 로그를 보니 

"message":"Unable to revive connection: http://elasticsearch:9200/"

라고 계속 뜨고있었다. 아하 키바나가 바라보는 기본 엘라스틱서치의 url이 http://elasticsearch:9200으로 되어있으며, 거기를 통해서 엘라스틱서치에 접속해 정보를 가져오는구나. 하고 추측할수 있었다.


그러면 이제 내가 할 일은 설치한 엘라스틱서치에 url을 붙여주고, 키바나의 엘라스틱서치 url을 내가 붙인 url을 바라보도록 설정하면 되겠다.


랜쳐로 들어와서 엘라스틱서치에 ingress를 추가해주면 되겠다.

이처럼 랜쳐의 Load Balancing탭에서 Add Ingress에서 테스트용으로 .xip.io도메인을 추가해주었다. xip.io는 도메인을 자동으로 만들어서 xip.io라는 이름으로 할당해준다. 


xip.ip가 뭔지는 공식 홈페이지를 보자. 보면 알수 있을텐데 {내가 지정한 이름}.{서버의 아이피 주소}.xip.ip포맷으로 url을 만들어준다. 특정한 이름을 적는다고 해보자. ex) elasticsearch-test 그러면 elasticsearch-test.10.208.66.89.xip.io와 같이 포맷을 만들어서 들어가보면 내 서버가 나옴을 알수있다.


타겟 포트는 엘라스틱서치의 기본포트 9200으로, Target은 elasticsearch master로 하면 되겠지? 하고 추측하고 master로 타겟을 만들었다. 

시간이 지나고 url이 할당되고, 내가 만든 http://elasticsearch-loadbalancer.efk.x.x.x.x.xip.io/ 로 들어가보니 엘라스틱서치의 기본 화면이 잘 나온다.

마스터:9200으로 접속하는게 맞았구나.


접속되는걸 확인했으니 이제 키바나가 바라보는 엘라스틱서치 url을 내가 만든 http://elasticsearch-loadbalancer.efk.x.x.x.x.xip.io/를 보도록 바꿔주면 된다. 근데 뭘 바꿔야되지.. 하다가 위에서 persistentVolume관련 옵션을 찾은걸 생각하고 키바나의 helm chart검색에서 elasticsearch를 검색해봤다.

그러니 맨 끝에 


The default value of elasticsearch.url (for kibana < 6.6) has been removed in favor of elasticsearch.hosts (for kibana >= 6.6)


라는 글이 보인다. 딱 봐도 elasticsearch.url이 키바나 6.6버전 이전에 쓰던 엘라스틱서치 url설정 관련 값이고, elasticsearch.hosts가 키바나 6.6이후로 쓰는 값이구나? 하는걸 알수있었다.(구글링해보니 맞음.) 그럼 이제 키바나에서 elasticsearch.hosts를 설정할 방법만 찾아보면 된다.


구글링해서 찾아보니 https://www.elastic.co/guide/en/kibana/current/production.html 에서 보니 kibana.yml에서 설정하면 된다고 한다. 쿠버네티스로 설치한건데 kibana.yml이 있나? 하던 도중


kubernetes의 config map에서 kibana.yml을 찾았다.

elasticsearch.hosts: http://elasticsearch:9200/
server.host: "0"
server.name: kibana

로 되있어서 저걸 바꾸면 되겠다는게 보였다. elasticsearch.hosts부분을 찾고 있었으므로..

config map을 수정해서 저 부분을 내가 받아온 xip.io 도메인의 url:80으로 변경했다. 그리고 재배포하고 로그를 보니 계속 나오던 "message":"Unable to revive connection: http://elasticsearch:9200/"

에러가 사라지고 뭔가 통신이 잘 되는것 같다.


이제 키바나의 ui를 볼 차례이다. 키바나에 간단하게 ingress를 추가해주고. 키바나를 바라보도록 xip.io url을 하나 만들었다.

그러고 접속을 하니 잘 된다!


결국 돌아돌아 엘라스틱서치와 키바나를 따로 설치해서 서로 연동하는데 성공하였다. (대충 아래와 같음.)



키바나와 엘라스틱서치에 x-pack옵션 추가.

그런데..... 따로따로 설치했음에도 불구하고 가장 처음에 원했던 키바나에서 여러 개의 탭 보기가 안된다. 기껏 열심히 설치했는데 새로 설치한 키바나도 탭이 조금밖에 없다. 이제 다시 처음으로 돌아왔다. x-pack설정을 찾아야 한다. 엘라스틱서치의 helm chart에서 x-pack, xpack으로 검색을 해봤다.

오 그러니 다행히도 관련 설명이 있다.

결론만 말하자면 엘라스틱서치에서는 중간에 저 3줄을 추가해주면 된다. 그리고 키바나 설치시에도 oss버전이 아닌 저 이미지를 설치해주면 된다고 한다. 

oss버전과 oss가 없는 버전이 무슨 차이가 있는지 찾아봤는데 패키징 차이인것 같다. 중요하진 않음. 참고 링크


엘라스틱서치 부분이다. 중간에 얻은 persistent storageClass부분까지 포함해서 아래처럼 구성했다.

그리고 키바나도 다시 깔아줬다.


들어간 옵션은 persistent storageClass + 키바나 이미지 레포 변경이다.

그리고 키바나에 접속해보니 내가 원했던 탭이 여러개가 다 뜬다!


이거 모두 알아내느라 4일동안 삽질했다.