В рамках моей работы мне недавно пришлось модифицировать Fluentd, чтобы иметь возможность транслировать журналы в нашу автономико -зебримо. Tagged with Kubernetes, DevOps.
В рамках моей работы мне недавно пришлось изменить Fluentd Чтобы иметь возможность транслировать журналы в нашем Зебриум Автономная платформа мониторинга журнала. Чтобы сделать это, мне нужно было сначала понять, как Fluentd собрал метаданные Kubernetes. Я думал, что то, что я узнал, может быть полезным/интересным для других, и поэтому решил написать этот блог.
Если вы хотите поиграть с Fluentd в контейнере Daemonset, вы можете установить версию, которую мы используем здесь (Вы также можете найти более подробную информацию на нашей странице Docs ).
Вот снимок экрана из нашего пользовательского интерфейса метаданных, которые мы собираем из Kubernetes:
Как вы можете видеть, в кластере Kubernetes есть много метаданных, таких как имя хоста, пространство имен, пространство имен, имя стручка, имя контейнера и многое другое. Теперь вам может быть интересно, как эти метаданные в вашем кластере Kubernetes волшебным образом собираются?
Чтобы понять, как это работает, сначала я объясню соответствующие разделы конфигурации FluentD, используемые коллекционером журналов (который работает внутри контейнера Daemonset). Ниже приведен пример файла конфигурации FluentD (я немного продезинфицировал его, чтобы удалить что -то чувствительное).
В разделе «» сообщает Fluentd для хвоста файлов журналов контейнеров Kubernetes. На хосте Kubernetes есть один файл журнала (на самом деле символическая ссылка) для каждого контейнера в каталоге/var/log/containers, как вы можете видеть ниже:
root# ls -l
total 24
lrwxrwxrwx 1 root root 98 Jan 15 17:27 calico-node-gwmct_kube-system_calico-node-2017627b57442d7d41d39bc8c2f62fd9979cd61ca2afbd53ba2c9f712aa7f311.log -> /var/log/pods/kube-system_calico-node-gwmct_62c0dba5-36fd-432d-bb10-da7040165c33/calico-node/0.log
lrwxrwxrwx 1 root root 98 Jan 15 17:27 calico-node-gwmct_kube-system_install-cni-1e6b3d4b09c4b881f6bf837da98b41fe555332d4638339b79acb16c7b0c2478e.log -> /var/log/pods/kube-system_calico-node-gwmct_62c0dba5-36fd-432d-bb10-da7040165c33/install-cni/0.log
Вы также можете увидеть, как символическая ссылка имеет имя POD, пространство имен, имя контейнера в символических ссылках.
Сообщения журнала из контейнеров помечены «контейнерами». Они соответствуют фильтру «контейнеры». ** «В следующем разделе. Этот фильтр является типом kubernetes_metadata. by TAG_TO_KUBERNETES_NAME_REGEXP на теге, чтобы извлечь имя POD, пространство имен и имя контейнера.
Получение дополнительных метаданных
Помимо имени POD, имен имени контейнера, есть и другие метаданные, такие как хост, имя развертывания, namespace_id и т. Д., Которые мне были необходимы. Чтобы достичь этого, мне нужно было выполнить дополнительную работу в рамках Zlog-Collector (см. Ссылки в верхней части этого блога).
Эти дополнительные метаданные на самом деле извлекаются, вызывая API Kubernetes. Поскольку API Kubernetes требует аутентификации, вам может быть интересно, как этот плагин получает разрешение на вызов API.
Чтобы понять, как коллекционер журналов использует API Kubernetes, нам нужно посмотреть на файл развертывания Zlog-Collector Zlog-Collector.yaml. В верхней части этого файла он определяет учетную запись службы, роль кластера и связывание роли кластера:
Как вы видите в разделе Clusterrole, он создает роль кластера с именем Zlog-Collector, которая имеет разрешение на получение, перечисление и наблюдение за пространством имен ресурсов, развертываниями, стручками и событиями. Учетная запись сервиса Zlog-Collector связана с роли кластера Zlog-Collector. Сервисная учетная запись используется в конфигурации Daemonset, поэтому Zlog-Collector Daemonset имеет разрешение на получение, перечисление и просмотр ресурсов:
Но как именно все эти разрешения переходят в реальные программы, работающие внутри Zlog-Collector? К сожалению, это нигде не задокументировано, поэтому я провел некоторое время, чтобы понять, как это работает. Теперь я делюсь этой информацией бесплатно:-) Это не что иное, как магия Kubernetes!
Сначала используйте команду ниже, чтобы увидеть конфигурацию контейнера Zlog-Collector:
root# docker ps | grep zlog-collector
a197a31fc989 zebrium/zlog-collector "/usr/local/bin/entr…" 8 days ago Up 8 days k8s_zlog-collector_zlog-collector-k86td_default_e417a451-31a9-4e57-8542-5adafa734bbb_0
root# docker inspect a197a31fc989 | less
...
"HostConfig": {
"Binds": [
...
"/etc/localtime:/etc/localtime:ro",
"/var/lib/kubelet/pods/e417a451-31a9-4e57-8542-5adafa734bbb/volumes/kubernetes.io~secret/zlog-collector-token-9dnd8:/var/run/secrets/kubernetes.io/serviceaccount:ro",
"/var/lib/kubelet/pods/e417a451-31a9-4e57-8542-5adafa734bbb/etc-hosts:/etc/hosts",
"/var/lib/kubelet/pods/e417a451-31a9-4e57-8542-5adafa734bbb/containers/zlog-collector/67f8d326:/dev/termination-log"
],
...
Как вы можете видеть, информация об учете учетных данных устанавливается привязкой на/Вар/рун/SECRETS/KUBERNETES.IO/SERVICEACCOUNT Внутри контейнера Zlog-Collector. Это местоположение является местоположением по умолчанию для клиентской библиотеки Kubernetes, чтобы получить учетные данные. Посмотрим, что в каталоге:
root# ls /var/lib/kubelet/pods/e417a451-31a9-4e57-8542-5adafa734bbb/volumes/kubernetes.io~secret/zlog-collector-token-9dnd8/
ca.crt namespace token
root# cat /var/lib/kubelet/pods/e417a451-31a9-4e57-8542-5adafa734bbb/volumes/kubernetes.io~secret/zlog-collector-token-9dnd8//token
291bnQubmFtZSI6Inpsb2ctYdf429sVjdG9yIiwia3ViZXJduZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9...
Когда учетная запись сервиса связана с контейнером, Kubernetes «Bind-Mount’s» информации о учетных данных в контейнере, чтобы он мог использовать сертификат и токен для вызова API Kubernetes. Это магия Kubernetes!
Если вы хотите увидеть все это на практике, вы можете скачать и установить Zlog-Collector AT https://github.com/zebrium/ze-fluentd-plugin Анкет Вы также можете зарегистрироваться для бесплатно Денический аккаунт, чтобы увидеть, как выглядят все метаданные здесь. И, пожалуйста, следите за обновлением моего следующего блога, который будет охватывать кучу интересных советов и приемов, которые я узнал о Fluentd!
Опубликовано с разрешения автора: Брэди Зуо @ Дени