Развертывание стека ELK с использованием одноузловой архитектуры MiniKube


Установка Minikube

При запуске Minikube вам потребуется выделить немного дополнительной мощности, поскольку планируется развернуть многоузловой кластер Elasticsearch.

minikube start --cpus 4 --memory 8192
Вход в полноэкранный режим Выйдите из полноэкранного режима

Вы должны увидеть следующее:

[Output]
Вы должны увидеть следующее:
Starting local Kubernetes v1.10.0 cluster…
Запуск VM…
Получение IP-адреса виртуальной машины…
Перемещение файлов в кластер…
Установка сертификатов…
Подключение к кластеру…
Настройка kubeconfig…
Запуск компонентов кластера…
Kubectl теперь настроен на использование кластера.

Чтобы убедиться, что ваш одноузловой кластер Kubernetes запущен и работает, используйте:

kubectl cluster-info
Войти в полноэкранный режим Выйти из полноэкранного режима

[Output]
Kubernetes master работает по адресу https:// 192.168.59.102:8443.
CoreDNS запущен по адресу https:// 192.168.59.102:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

Для дальнейшей отладки и диагностики проблем кластера используйте:

kubectl cluster-info dump
Войдите в полноэкранный режим Выйти из полноэкранного режима

Развертывание Elasticsearch

Прежде всего, нам нужно развернуть экземпляр Elasticsearch в нашем кластере. Обычно Elasticsearch требует 3 узла для работы в своем собственном кластере.
Однако, поскольку мы используем Minikube в качестве среды разработки, мы настроим Elasticsearch для работы в одноузловом режиме, чтобы он мог работать на нашем единственном симулированном узле Kubernetes в Minikube.

Итак, в терминале введите следующую команду для развертывания Elasticsearch в нашем кластере.

C:Helm>kubectl create -f es-deployment.yaml
Войти в полноэкранный режим Выход из полноэкранного режима

[Output]

deployment.apps/es-logging created

C:Helm>kubectl get deployments
Войти в полноэкранный режим Выйти из полноэкранного режима

[Output]

ИМЯ ГОТОВО АКТУАЛЬНО ДОСТУПНО ВОЗРАСТ
es-logging 1/1 1 1 3m31s

C:Helm>kubectl get pods
Вход в полноэкранный режим Выйти из полноэкранного режима

[Output]

ИМЯ ГОТОВО СОСТОЯНИЕ ПЕРЕЗАПУСК ВОЗРАСТ
es-logging-5744d89fb9-xhbq7 1/1 Running 0 4m28s

Для получения дополнительной информации о состоянии развертывания или подсистемы используйте команды kubectl describe или kubectl logs:

$ kubectl describe deployment es-logging
$ kubectl describe pod es-logging-5744d89fb9-xhbq7
$ kubectl logs –f deployments/es-logging
Вход в полноэкранный режим Выйти из полноэкранного режима

Раскрытие Elasticsearch

Теперь, когда Elasticsearch запущен в нашем кластере, нам нужно раскрыть его, чтобы мы могли подключать к нему другие сервисы. Для краткого объяснения, это позволит нам раскрыть наш ресурс развертывания Elasticsearch через службу, которая даст нам возможность получить доступ к нашему Elasticsearch HTTP API из других ресурсов (а именно Logstash и Kibana).

Выполните следующую команду, чтобы открыть наш Deployment:

C:Helm>kubectl create -f es-svc.yaml
Войти в полноэкранный режим Выйти из полноэкранного режима

[Output]

service/es-service created

В результате будет создан ресурс Kubernetes Service, который открывает порт 9200 из нашего ресурса Elasticsearch Deployment, HTTP-порт Elasticsearch. Теперь этот порт будет доступен через порт, назначенный в кластере. Чтобы увидеть эту службу и внешний порт, который был назначен, выполните следующую команду:

C:Helm>kubectl get svc
Войти в полноэкранный режим Выйти из полноэкранного режима

[Output]

ИМЯ ТИП КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВОЗРАСТ
es-service NodePort 10.97.114.162 9200:32375/TCP 6s
kubernetes ClusterIP 10.96.0.1 443/TCP 54m

C:Helm>minikube service es-service
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

|————|————|————-|——————————|
| NAMESPACE | NAME | TARGET PORT | URL |
|————|————|————-|——————————|
| по умолчанию | es-service | 9200 | http://192.168.59.102:32375 | |
|————|————|————-|——————————|

  • Открываем сервис default/es-service в браузере по умолчанию…

Чтобы получить IP-адрес Minikube:

C:Helm>minikube ip
Войдите в полноэкранный режим Выйти из полноэкранного режима

[Output]

192.168.59.102

Как вы можете видеть, наш HTTP-порт Elasticsearch был сопоставлен с внешним портом 32375. Поскольку мы работаем через Minikube, внешний порт будет предназначен для этой виртуальной машины, поэтому мы будем использовать IP-адрес Minikube и внешний порт, чтобы проверить, что наша настройка работает правильно.

[Browser Output]

{
«name» : «es-logging-5744d89fb9-xhbq7»,
«cluster_name» : «docker-cluster»,
«cluster_uuid» : «XKT9bYwCR1CencccW6JggQ»,
«version» : {
«number» : «7.8.0»,
«build_flavor» : «default»,
«build_type» : «docker»,
«build_hash» : «757314695644ea9a1dc2fecd26d1a43856725e65»,
«build_date» : «2020-06-14T19:35:50.234439Z»,
«build_snapshot» : false,
«lucene_version» : «8.5.1»,
«minimum_wire_compatibility_version» : «6.8.0»,
«minimum_index_compatibility_version» : «6.0.0-beta1»
},
«tagline» : «You Know, for Search»
}

Чтобы проверить настройку точки здоровья для зондов liveness и readyiness, выполните команду Run:

http://192.168.59.102:32375/_cluster/health
Войдите в полноэкранный режим Выйти из полноэкранного режима

[Output]

{ «cluster_name»: «docker-cluster», «status»: «green», «timed_out»:false, «number_of_nodes»:1, «number_of_data_nodes»:1, «active_primary_shards»:0, «active_shards»:0, «relocating_shards»:0, «initializing_shards»: 0, «unassigned_shards»:0, «delayed_unassigned_shards»:0, «number_of_pending_tasks»:0, «number_of_in_flight_fetch»:0, «task_max_waiting_in_queue_millis»:0, «active_shards_percent_as_number»:100. 0}

Развертывание Kibana

Теперь, когда у нас есть запущенный экземпляр Elasticsearch, доступный через IP-адрес Minikube и назначенный номер порта, мы запустим экземпляр Kibana и подключим его к Elasticsearch. Мы сделаем это тем же способом, которым настраивали Elasticsearch: создадим еще один ресурс Kubernetes Deployment.

C:Helm>kubectl create -f kibana-deployment.yaml
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

deployment.apps/kibana-logging created

C:Helm>kubectl get deployment kibana-logging
Войдите в полноэкранный режим Выход из полноэкранного режима

[Output]

ИМЯ ГОТОВО АКТУАЛЬНО ДОСТУПНО ВОЗРАСТ
kibana-logging 1/1 1 1 1 70s

Как и в случае с экземпляром Elasticsearch, наш экземпляр Kibana не будет работать сразу. Причина в том, что он не знает, где запущен экземпляр Elasticsearch. По умолчанию он будет пытаться подключиться, используя URL http://elasticsearch:9200. Вы можете убедиться в этом, проверив журналы Kibana pod.

C:Helm>kubectl get pods
Войти в полноэкранный режим Выход из полноэкранного режима

[Output]

ИМЯ ГОТОВЫЙ СТАТУС ПЕРЕЗАПУСК ВОЗРАСТ
es-logging-5744d89fb9-xhbq7 1/1 Running 0 33m
kibana-logging-5dc77584cc-7jfnt 1/1 Running 0 2m13s

C:Helm>kubectl logs kibana-logging-5dc77584cc-7jfnt
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

{«type»:»log»,»@timestamp»:»2022-03-28T10:15:18Z»,»tags»:[«warning»,»elasticsearch»,»admin»],»pid»:11,»message»:»Unable to revive connection: http://elasticsearch:9200/»}

URL экземпляра Elasticsearch определяется через переменную окружения в докер-образе Kibana, как и режим для Elasticsearch. Однако фактический ключ переменной — ELASTICSEARCH_HOSTS, который содержит все допустимые символы для использования команды kubectl для изменения переменной окружения в ресурсе развертывания. Поскольку теперь мы знаем, что можем получить доступ к HTTP-порту Elasticsearch через сопоставленный с хостом порт 32375 на IP Minikube, мы можем обновить Kibana для указания на экземпляр Elasticsearch.

C:Helm>minikube ip
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

192.168.59.102

Затем установите переменную окружения с помощью следующей команды

kubectl set env deployments/kibana-logging ELASTICSEARCH_HOSTS=http://$(minikube ip):elasticsearch-Node-port
Войти в полноэкранный режим Выйти из полноэкранного режима

например

C:Helm>kubectl set env deployments/kibana-logging ELASTICSEARCH_HOSTS=http://192.168.59.102:32375
Войти в полноэкранный режим Выйти из полноэкранного режима

[Output]

deployment.apps/kibana-logging env updated

Примечание: Нам не нужно использовать IP Minikube, чтобы наши компоненты могли общаться друг с другом. Поскольку они живут в одном кластере Kubernetes, мы можем использовать кластерный IP, назначенный каждому ресурсу Service (выполните kubectl get services, чтобы узнать IP-адреса кластера). Это особенно полезно, если ваша установка возвращает IP-адрес localhost для вашей установки Minikube. В этом случае вам не нужно будет использовать порт узла, а вместо него использовать фактический порт контейнера.

Это вызовет изменения в развертывании, в результате чего существующий Kibana Pod будет завершен, и будет запущен новый Pod (с новым значением переменной окружения). Если вы снова запустите kubectl get pods, вы должны увидеть этот новый Pod. Опять же, если мы проверим журналы нового Pod, мы увидим, что он успешно подключился к экземпляру Elasticsearch и теперь размещает веб-интерфейс на порту 5601.

C:Helm>kubectl logs -f pod/kibana-logging-59d555748b-mg76x
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

{«type»:»log»,»@timestamp»:»2022-03-28T10:51:14Z»,»tags»:[«listening»,»info»],»pid»:9,»message»:»Server running at http://0:5601″}
{«type»:»log»,»@timestamp»:»2022-03-28T10:51:15Z»,»tags»:[«info»,»http»,»server»,»Kibana»],»pid»:9,»message»:»http server running at http://0:5601″}

Доступ к пользовательскому интерфейсу Kibana

Теперь, когда Kibana запущена и взаимодействует с Elasticsearch, нам нужно получить доступ к веб-интерфейсу, который позволит нам настраивать и просматривать журналы. Мы уже видели, что он работает на порту 5601, но, как и в случае с HTTP-портом Elasticsearch, этот порт является внутренним для контейнера, запущенного внутри Pod. Поэтому нам нужно также открыть этот ресурс развертывания через службу.

C:Helm>kubectl create -f kibana-svc.yaml
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

сервис/kibana-service created
Теперь мы должны иметь возможность просматривать веб-интерфейс, используя тот же IP Minikube, что и раньше, и новый порт. Посмотрите на новый сервис, чтобы получить сопоставленный порт.

C:Helm>kubectl get services
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

ИМЯ ТИП КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВОЗРАСТ
es-service NodePort 10.97.114.162 9200:32375/TCP 32m
kibana-logging NodePort 10.105.131.15 5601:32457/TCP 8s
kubernetes ClusterIP 10.96.0.1 443/TCP 87m

C:Helm>minikube service kibana-service
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

|————|—————-|————-|——————————|
| NAMESPACE | NAME | TARGET PORT | URL |
|————|—————-|————-|——————————|
| default | kibana-service | 5601 | http://192.168.59.102:32417 | http://192.168.59.102:32417 |
|————|—————-|————-|——————————|

  • Открываем сервис default/kibana-logging в браузере по умолчанию… Теперь перейдите в браузере на URL: «http://192.168.59.102:32417/status», чтобы проверить, что веб-интерфейс запущен и Elasticsearch подключен правильно.

Развертывание Logstash

Следующим шагом будет запуск Logstash в нашей установке. Logstash будет работать как инструмент, который будет собирать журналы из нашего приложения и отправлять их в Elasticsearch. Он предоставляет различные преимущества для фильтрации и переформатирования сообщений журнала, а также для сбора из различных источников и вывода в различные места назначения. В данном руководстве мы будем использовать его только в качестве сквозного сборщика и перенаправителя журналов.

На приведенной выше схеме вы можете видеть нашу желаемую установку. Наша цель — развернуть контейнер Logstash в новый Pod. Этот контейнер будет настроен на прослушивание порта 5044 для получения записей журнала, отправляемых приложением Filebeat (подробнее об этом позже). Затем эти сообщения журнала будут перенаправляться прямо на наш экземпляр Elasticsearch, который мы настроили ранее, через HTTP-порт, который мы открыли.

Для достижения этой настройки нам придется использовать YAML-файлы Kubernetes. Это более подробный способ создания развертываний, который можно использовать для описания различных ресурсов (таких как развертывания, службы и т.д.) и их создания с помощью одной команды. Причина, по которой нам нужно использовать этот способ, заключается в том, что нам нужно настроить том для доступа к нему нашего контейнера Logstash, что невозможно с помощью команд CLI. Аналогично, мы могли бы использовать этот подход, чтобы сократить количество шагов, необходимых для предыдущей настройки Elasticsearch и Kibana, а именно конфигурацию переменных окружения и отдельные шаги для создания ресурсов Service для открытия портов в контейнерах.

Создайте файл под названием logstash.conf и введите следующие параметры:

Note: Please update the minikube_ip:elasticsearch-nodeport

input {
beats {
port => "5044"
}
}
output {
elasticsearch {
hosts => ["http://192.168.99.102:30445"]
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Далее нам нужно создать новый файл под названием deployment.yml. Введите следующее содержимое YAML ресурса развертывания Kubernetes для описания нашего развертывания Logstash.

Нам нужно создать этот ConfigMap. Этот том будет содержать созданный нами файл logstash.conf, который будет сопоставлен с папкой конфигурации трубопровода в контейнере Logstash. Он будет использоваться для настройки нашего необходимого сквозного трубопровода. Итак, выполните следующую команду:

C:Helm>kubectl create configmap log-manual-pipeline --from-file ./logstash.conf
Войти в полноэкранный режим Выйти из полноэкранного режима

[Output]

configmap/log-manual-pipeline created

Теперь мы можем создать ресурс Deployment из нашего файла logstash-deployment.yml.

C:Helm>kubectl create -f logstash-deployment.yml
Войти в полноэкранный режим Выход из полноэкранного режима

[Output]

deployment.apps/logstash-logging created

Примечание: Вы можете заметить ошибки, говорящие об отсутствии доступных подключений к конечной точке экземпляра Elasticsearch с URL http://elasticsearch:9200/. Это происходит из-за некоторой конфигурации по умолчанию в образе Docker, но не влияет на наш конвейер, поэтому в данном случае ее можно проигнорировать.

Открыть порт Logstash Filebeats

Теперь, когда Logstash запущен и прослушивает контейнерный порт 5044 для записей сообщений журнала Filebeats, нам нужно убедиться, что этот порт отображен на хост, чтобы мы могли настроить экземпляр Filebeats в следующем разделе. Для этого нам нужен еще один ресурс Service, чтобы открыть порт на хосте Minikube. Мы могли бы сделать это в том же файле deployment.yml, но стоит использовать тот же подход, что и раньше, чтобы показать, как дескриптор ресурса и команды CLI могут использоваться совместно.

C:Helm>kubectl create -f logstash-svc.yml
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

сервис/logstash-service created

C:Helm>kubectl get svc
Войти в полноэкранный режим Выход из полноэкранного режима

[Output]

ИМЯ ТИП КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВОЗРАСТ
es-service NodePort 10.97.114.162 9200:32375/TCP 74m
kibana-service NodePort 10.105.131.15 5601:32457/TCP 15m
kubernetes ClusterIP 10.96.0.1 443/TCP 129m
logstash-service NodePort 10.110.161.161 5044:31810/TCP 13с

Как вы можете видеть, порт 5044 контейнера был сопоставлен с портом 31810 на узле. Теперь мы можем перейти к последнему шагу: настройке нашего приложения и контейнера Sidecar Filebeats для отправки сообщений журнала через наш экземпляр Logstash в Elasticsearch.

Развертывание приложения

Существует несколько различных способов структурировать это, но я собираюсь описать подход, при котором мы развертываем наше приложение и экземпляр Filebeat как отдельные контейнеры в одном Pod. Затем мы будем использовать том Kubernetes, известный как Empty Directory, для разделения доступа к файлу журнала, в который приложение будет писать, а Filebeats — читать из него. Причина использования этого типа тома заключается в том, что его жизненный цикл будет напрямую связан с Pod. Если вы хотите сохранить данные журнала вне Pod, чтобы при завершении и повторном создании Pod том оставался, то я бы предложил рассмотреть другой тип тома, например, Local.

Для начала мы создадим конфигурационный файл для экземпляра Filebeats. Создайте файл с именем filebeat.yml и введите в него следующее содержимое.

Note: Please update the minikube_ip:logstash-nodeport

filebeat.inputs:
- type: log
paths:
- /tmp/output.log
output:
logstash:
hosts: [ "192.168.99.102:31010" ]
Войти в полноэкранный режим Выйти из полноэкранного режима

Это укажет Filebeat отслеживать файл /tmp/output.log (который будет расположен в общем томе) и затем выводить все сообщения журнала в наш экземпляр Logstash (обратите внимание, что здесь мы использовали IP-адрес и номер порта для Minikube).

Теперь нам нужно создать том ConfigMap из этого файла.

C:Helm>kubectl create configmap beat-manual-config --from-file ./filebeat.yml
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

configmap/beat-manual-config created

Далее нам нужно создать наш Pod с настройкой двойного контейнера. Для этого, как и в предыдущем разделе, мы создадим файл app-deployment.yml.

Чтобы создать этот ресурс развертывания, выполните следующую команду:

C:Helm>kubectl create -f app-deployment.yml
Войти в полноэкранный режим Выйти из полноэкранного режима

[Output]

deployment.apps/logging-app-manual created

Оба контейнера будут иметь общую папку, сопоставленную с путем /tmp, в которую будет записываться и из которой будет считываться файл журнала. Контейнер Filebeat также будет использовать только что созданный том ConfigMap, который мы указали для экземпляра Filebeat для чтения конфигурационного файла, перезаписав конфигурацию по умолчанию.

Вы также заметите, что наш контейнер приложения использует Docker-образ sladesoftware/log-application:latest. Это простой образ Docker, который построен на основе образа Alpine Linux и выполняет команду бесконечного цикла, которая добавляет небольшой объект JSON в выходной файл каждые несколько секунд.

C:Helm>minikube service kibana-service
Вход в полноэкранный режим Выход из полноэкранного режима

[Output]

|————|—————-|————-|——————————|
| ПРОСТРАНСТВО ИМЕН | ИМЯ | ЦЕЛЕВОЙ ПОРТ | URL |
|————|—————-|————-|——————————|
| default | kibana-service | 5601 | http://192.168.59.102:32457 | http://192.168.59.102:32457 |
|————|—————-|————-|——————————|

  • Открываем сервис default/kibana-service в браузере по умолчанию… Теперь вы должны иметь возможность перейти к панели Kibana в веб-браузере, чтобы просмотреть поступающие журналы. Убедитесь, что вы сначала создали индексный шаблон для чтения этих журналов — вам нужен формат типа filebeat*.

После создания индексного шаблона вы сможете просматривать сообщения журнала по мере их поступления в Elasticsearch на странице Discover в Kibana.

Оцените статью
Procodings.ru
Добавить комментарий