Kubernetes. установка elk из helm чарта xpack ilm

Thank you for reading this post, don't forget to subscribe!

1.Подготовка, гене­ри­ро­ва­ние сертификатов
2.Настройка elasticsearch
3.Настройка kibana
4.Настройка logstash
5.Настройка filebeat
5.1 Настрой­ка filebeat multiline
6.Настройка отдель­но­го volume для snapshot
7.Запускаем elasticsearch и kibana, настра­и­ва­ем template и ilm
8. Запус­ка­ем logstash и filebeat настра­и­ва­ем snapshot
9.ДОПОЛНИТЕЛЬНО - Запус­ка­ем elasticsearch не в кла­сте­ре а в 1 поде.
10.Настройка ролей для пользователей
11.Восстановление из snapshot

Для нача­ла созда­ём namespase elk

kubectl create namespace elk

ну или

cat namespace.yml

 

 

kubectl apply -f namespace.yml

выка­чи­ва­ем чарт

 

git clone https://github.com/elastic/helm-charts.git
cd helm-charts/
git checkout 7.9

Далее нам надо сге­не­ри­ро­вать сер­ти­фи­ка­ты на осно­ве кото­рых будет всё работать.

[root@prod-vsrv-kubemaster1 helm-charts]# mkdir mkdir /certs
[root@prod-vsrv-kubemaster1 helm-charts]# cd /certs/

Созда­ём файл в кото­ром ука­жем наши домен­ные име­на (logstash тре­бо­ва­те­лен к нали­чию доме­на в сертификате)

cat cnf

 

 

 

openssl genpkey -aes-256-cbc -pass pass:123456789 -algorithm RSA -out mysite.key -pkeyopt rsa_keygen_bits:3072

Тут надо будет вве­сти пароль при гене­ра­ции а даль­ше запол­нить дан­ные сертификата.
Я вез­де задал пароль 123456789
openssl req -new -x509 -key mysite.key -sha256 -config cnf -out mysite.crt -days 7300
Enter pass phrase for mysite.key:

созда­ём сер­ти­фи­кат p12 кото­рый нужен elastic

openssl pkcs12 -export -in mysite.crt -inkey mysite.key -out identity.p12 -name "mykey"
Enter pass phrase for mysite.key:   вот тут вво­дим наш пароль 123456789
Enter Export Password:   ТУТ ОСТАВЛЯЕМ БЕЗ ПАРОЛЯ
Verifying - Enter Export Password:  ТУТ ОСТАВЛЯЕМ БЕЗ ПАРОЛЯ

docker run --rm -v /certs:/certs -it openjdk:oracle keytool -import -file /certs/mysite.crt -keystore /certs/trust.jks -storepass 123456789

появит­ся сооб­ще­ние в кото­ром мы согла­ша­ем­ся, что дове­ря­ем сертификату

Вытас­ки­ва­ем при­ват­ный ключ чтоб он у нас был без пароля
openssl rsa -in mysite.key -out mysite-without-pass.key
Enter pass phrase for mysite.key:
writing RSA key

Всё гото­во, все нуж­ные сер­ти­фи­ка­ты для elasticsearch сгенерированы:

[root@prod-vsrv-kubemaster1 certs]# ll
total 32
-rw-r--r-- 1 root root 575 Feb 10 10:15 cnf
-rw-r--r-- 1 root root 3624 Feb 10 10:15 identity.p12
-rw-r--r-- 1 root root 1935 Feb 10 10:15 mysite.crt
-rw-r--r-- 1 root root 2638 Feb 10 10:15 mysite.key
-rw-r--r-- 1 root root 2459 Feb 10 10:39 mysite-without-pass.key
-rw-r--r-- 1 root root 1682 Feb 10 10:15 trust.jks

Созда­ём сек­рет с сертификатами
[root@prod-vsrv-kubemaster1 certs]# kubectl create secret generic elastic-certificates -n elk --from-file=identity.p12 --from-file=mysite.crt --from-file=mysite.key --from-file=mysite-without-pass.key --from-file=trust.jks

Созда­ём сек­рет с логи­ном и паро­лем для elastic:
kubectl create secret generic secret-basic-auth -n elk --from-literal=password=elastic --from-literal=username=elastic

 

отме­тим что у нас в кла­сте­ре уже уста­нов­лен nfs-provisioner

Перейдём к настройке переменных у elastic

elasticsearch/values.yaml
Тут вклю­ча­ем xpack добав­ля­ем сер­ти­фи­ка­ты и ука­зы­ва­ем дирек­то­рию для снапшотов

 

 

path.repo: /snapshot   - это наша дирек­то­рия для снап­шо­тов, они будут сохра­нять­ся в отдель­ном volume

 

так­же добав­ля­ем в пере­мен­ные наш логин и пароль что мы ука­за­ли при созда­нии секрета

 

 

 

так­же под­клю­ча­ем дирек­то­рию для сертификатов

 

 

 

так­же ука­зы­ва­ем наш nfs провижинер

 

 

 

так­же выстав­ля­ем antiAffinity soft (так как у нас 2 вор­ке­ра а эла­стик запус­ка­ет­ся в 3х подах он не может стар­та­нуть) эта настрой­ка гово­рит что на одной ноде могут быть запу­ще­ны 2 пода из кла­сте­ра уэластика.

antiAffinity: "soft"

так­же пра­вим про­то­кол на https

protocol: https

весь файл будет иметь сле­ду­ю­щий вид:

[root@prod-vsrv-kubemaster1 helm-charts]# cat elasticsearch/values.yaml

 

 

 

========================================================================================

перейдём к настройке kibana:

kibana/values.yaml

Пра­вим http на https
elasticsearchHosts: "https://elasticsearch-master:9200"

так­же

 

 

 

так­же под­клю­ча­ем дирек­то­рию с сертификатами

 

 

 

так­же добав­ля­ем в основ­ной кон­фиг пути до сертификатов

 

 

 

так­же настра­и­ва­ем ingress что­бы по наше­му доме­ну откры­ва­лась киба­на, отме­тим что строка:
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
обя­за­тель­на так как без неё ингрес по умол­ча­нию прок­си­ру­ет всё на HTTP

 

 

 

весь файл будет иметь вид:

 cat kibana/values.yaml

 

 

 

==========================================================================================

перейдём к настройке logstash

logstash/values.yaml

вклю­ча­ем xpack

 

 

 

так­же настра­и­ва­ем  при­ём на порт 5045 так как 5044 под­ни­ма­ет­ся авто­ма­ти­че­ски и если оста­вить input с 5044 то будет кон­фликт пор­тов, настра­и­ва­ем так­же фильтр по нейм­с­пей­су если при­хо­дят логи из нейм­с­пей­са terminal-soft мы к ним добав­ля­ем тэг, уби­ра­ем пару лиш­них  полей и отправ­ля­ем в ластик, ука­зы­вая имя индек­са имя ilm поли­ти­ки  -кото­рая долж­на быть пред­ва­ри­тель­но создана.

 

 

так­же ука­зы­ва­ем логин пароль с кото­рым будем под­клю­чать­ся к elasticearch

 

 

 

так­же

 

 

 

так­же

antiAffinity: "soft"

так­же рас­ко­мен­тим сер­вис и ука­жем в нём порт куда всё пере­сы­лать 5045 (его мы зада­ли выше в input)

 

 

 

весь файл име­ет вид:

[root@prod-vsrv-kubemaster1 helm-charts]# cat logstash/values.yaml

 

 

===========================================================================================

Перейдём к настройке filebeat

filebeat/values.yaml

 

 

 

пол­но­стью файл будет выгля­деть сле­ду­ю­щим образом:

[root@prod-vsrv-kubemaster1 helm-charts]# cat filebeat/values.yaml

 

 

==========================================================================================

Filebeat multiline.

Появи­лась зада­ча: логи с кон­тей­не­ра в кото­ром джа­ва при­ло­же­ние при­хо­дят построч­но, т.е. каж­дая стро­ка это отдель­ный мес­седж при отоб­ра­же­нии в kibana, это не удоб­но читать, чтоб их объ­еде­нить в одно сооб­ще­ние, доба­вим в filebeat фильтр

multiline.pattern: '^([0-9]{4}-[0-9]{2}-[0-9]{2})'
multiline.negate: true
multiline.match: after

в общем виде:

vim filebeat/values.yaml

и обнов­ля­ем наш чарт:
helm upgrade --install filebeat -n elk --values filebeat/values.yaml filebeat/

всё теперь логи будут фор­ми­ро­вать­ся отно­си­тель­но даты в самом нача­ле сообщения.

===========================================================================================

Дополнение для работы snapshot

Созда­ём PV кото­рый даль­ше будем под­ки­ды­вать в template elasticsearch  (напо­ми­наю что у меня nfs-provisioner)
cat pvc-snapshot.yml

 

 

 

запус­ка­ем

kubectl apply -f pvc-snapshot.yml

смот­рим имя создан­но­го PV

 

 

 

вот наше имя

pvc-30e262ad-770c-45ad-8e3c-28d70a6400ef

теперь пра­вим temaplate

vim elasticsearch/templates/statefulset.yaml

 

 

 

И в этом же фай­ле в ещё одном месте:

 

 

 

на вся­кий слу­чай файл име­ет вид:

cat elasticsearch/templates/statefulset.yaml

 

 

 

===========================================================================================

Начинаем установку:

[root@prod-vsrv-kubemaster1 helm-charts]# helm install elasticsearch -n elk --values elasticsearch/values.yaml elasticsearch/

[root@prod-vsrv-kubemaster1 helm-charts]# helm install kibana -n elk --values kibana/values.yaml kibana/

ждём когда запу­стит­ся киба­на и пере­хо­дим по доме­ну ука­зан­но­му в ingress у киба­на в переменных

https://elk.prod.test.local/login

Сюда вби­ва­ем наши логин и пароль из сек­ре­та создан­но­го в самом нача­ле, напом­ню elastic elastic

Пере­хо­дим в
Stack Management Index Management index templates

на вто­ром пунк­те нажи­ма­ем next, на тре­тьем пишем @timespamp и выби­ра­ем date

потом нажи­ма­ем next далее:

теперь созда­ём поли­ти­ку на рол­ло­вер и удаление

 

Запускаем logstash и filebeat настраиваем snapshot

[root@prod-vsrv-kubemaster1 helm-charts]# helm install logstash -n elk --values logstash/values.yaml logstash/

[root@prod-vsrv-kubemaster1 helm-charts]# helm install filebeat -n elk --values filebeat/values.yaml filebeat/

теперь созда­ём репо­зи­то­рий для снап­шо­тов и их политику

тут ука­зы­ва­ем нашу дирек­то­рию /snapshot она под­клю­ча­лась через отдель­ный вольюм

далее вво­дим
name terminal-soft

snapshot name:  <terminal-soft-{now/d}>    (кавыч­ки обязательны)

 

Роли и поль­зо­ва­те­лей мож­но настра­и­вать тут:

 

 

======================================================================================================================================================

запускаем elastic в 1 instance

vim elasticsearch/values.yaml

 

 

 

[root@prod-vsrv-kubemaster1 helm-charts-7.9.4.elasticsearch-1-pod]# helm install elasticsearch -n elk --values elasticsearch/values.yaml elasticsearch/

[root@prod-vsrv-kubemaster1 helm-charts-7.9.4.elasticsearch-1-pod]# helm install kibana -n elk --values kibana/values.yaml kibana/

Созда­ём в kibana так же темплейт
Но зада­ём пара­метр number_of_replicas": "0"

после запус­ка­ем logstash filebeat
[root@prod-vsrv-kubemaster1 helm-charts-7.9.4.elasticsearch-1-pod]# helm install logstash -n elk --values logstash/values.yaml logstash/
[root@prod-vsrv-kubemaster1 helm-charts-7.9.4.elasticsearch-1-pod]# helm install filebeat -n elk --values filebeat/values.yaml filebeat/
После это­го настра­и­ва­ем snapshot

====================================================================================================

Настройка доступов пользователю для индексов.

Созда­ём пространство:

ука­зы­ва­ем - что долж­но отоб­ра­жать­ся в пространстве:

Созда­ём роль для наше­го индекса:

ука­зы­ва­ем при­ви­ле­гии как для кла­сте­ра так и непо­сред­ствен­но для индек­са terminal-soft

добав­ля­ем при­ви­ле­гии для пространства:

настра­и­ва­ем досту­пы для про­стран­ства, - чтение/полный доступ/отключить

Созда­ём пользователя:

зада­ём пароль и создан­ную нами ранее роль:

Логи­ним­ся под нашим новым пользователем

Созда­ём index pattern

Про­ве­ря­ем:

как видим дан­ные отображаются:

 

11.Восстановление из snapshot

Если тре­бу­ет­ся вос­ста­но­вить индек­сы из snapshot то дела­ем следующее:

Тут надо доба­вить параметр

"indexing_complete": "true"
толь­ко в том слу­чае если  при вос­ста­нов­ле­нии воз­ни­ка­ет ошиб­ка сле­ду­ю­ще­го вида:

Unable to restore snapshot

[illegal_state_exception] alias [terminal-soft] has more than one write index [terminal-soft-2021.03.04-000022,terminal-soft-2021.03.16-000034]

 

Поэто­му когда про­из­во­дишь вос­ста­нов­ле­ние необ­хо­ди­мо вос­ста­нав­ли­вать индекс из само­го послед­не­го снапшота.
т.е. Если нужен индекс за 10 чис­ло то снап­шот смот­рим где-то  за 15 чис­ло. Ну или добав­ля­ем пера­метр "indexing_complete": "true"