У нас для сбора логов из 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) справа: