Logz.io: сбор логов из Kubernetes – fluentd vs filebeat

Автор: | 27/01/2021
 

У нас для сбора логов из Kubernetes-кластера и их просмотра используется Logz.io (есть и локальный Loki).

Конкретно сбором и отправкой логов занимается Fluentd-под на каждой WorkerNode, которые деплоятся из DaemonSet в его дефотной конфигурации, см. документацию logzio-k8s.

Столкнулся с проблемой, что эти поды используют слишком много CPU – до 3000 millicpu, при том, что на серверах доступно всего 4 ядра, т.е. 4000 millicpu, и решил поискать другие варианты, плюс хотелось деплоить из Ansible с Helm, а готового чарта с Fluentd нет.

Нашёлся вариант с Filebeat, см. Ship k8s logs with Helm via Filebeat – попробуем его.

Сначала выполним руками на Dev-кластере, потом добавим в Ansible-роль, и установим на Production.

Logz.io Filebeat Helm-чарт

Добавляем репозиторий:

[simterm]

$ helm repo add logzio-helm https://logzio.github.io/logzio-helm/filebeat
"logzio-helm" has been added to your repositories

[/simterm]

Далее, нам потребуется токен и регион, их можно взять в General Settings аккаунта:

У нас дефолтный регион – us-east-1, см. How to look up your account region, значит убираем параметр secrets.logzioRegion.

По-умолчанию Logz.io устанавливается в неймспейс kube-system – но я хочу вынести его в отдельный NS, что бы проще было мониторить используемые им ресурсы.

Namespace задаётся через values, поэтому передадим его в --set, плюс добавим --create-namespace и --debug, что бы посмотреть всё, что было установлено:

[simterm]

$ helm install --namespace=dev-1-18-devops-logzio-ns \
--create-namespace --debug \
--set secrets.logzioShippingToken='AVG***Onq' \
--set secrets.clusterName='bttrm-eks-dev-1-18' \
--set namespace=dev-1-18-devops-logzio-ns \
logzio-k8s-logs logzio-helm/logzio-k8s-logs

[/simterm]

Проверяем:

[simterm]

$ kubectl -n dev-1-18-devops-logzio-ns get pod
NAME             READY   STATUS    RESTARTS   AGE
filebeat-2qt5s   1/1     Running   0          96s
filebeat-4xb44   1/1     Running   0          96s
filebeat-9prr9   1/1     Running   0          96s
filebeat-cth47   1/1     Running   0          96s
filebeat-fgmgx   1/1     Running   0          96s
filebeat-gb5ts   1/1     Running   0          96s
filebeat-hs9tr   1/1     Running   0          96s
filebeat-nskvg   1/1     Running   0          96s
filebeat-wfgbg   1/1     Running   0          96s

[/simterm]

И логи в Kibana на app.logs.io:

Ansible

Деплой Helm-чарта из Ансибл описывался в посте Ansible: модуль community.kubernetes и установка Helm-чарта с ExternalDNS, тут быстрый пример.

Добавляем when, так как логи собираем только с Production-кластера:

- name: "Add Logzio chart repo"
  when: "eks_env.startswith('prod')"
  community.kubernetes.helm_repository:
    name: "logzio-helm"
    repo_url: "https://logzio.github.io/logzio-helm/filebeat"

- name: "Deploy Logzio Filebit chart to the {{ eks_env }}-devops-logzio-ns namespace"
  when: "eks_env.startswith('prod')"
  community.kubernetes.helm:
    kubeconfig: "{{ kube_config_path }}"
    name: "logzio-k8s-logs"
    chart_ref: "logzio-helm/logzio-k8s-logs"
    release_namespace: "{{ eks_env }}-devops-logzio-ns"
    create_namespace: true
    values:
      secrets:
        logzioShippingToken: "{{ logzio_token }}"
        clusterName: "{{ eks_cluster_name }}"
      namespace: "{{ eks_env }}-devops-logzio-ns"

logzio_token выносим в файл переменных, и шифруем с ansible-vault.

Fluentd vs Filebeat – CPU и производительность

Ну и потребление CPU – старый fluentd (Ruby + C) слева vs новый filebeat (Go) справа: