Получение журналов доступа Envoy с помощью Istio на GKE

Я бы хотел, чтобы журналы доступа Envoy Istio (то есть журналы, в которых записывается каждый HTTP-запрос) отображались где-то внутри журнала Stackdriver. Я пробовал следовать инструкциям в https://istio.io/docs/tasks/telemetry/logs/access-log/. Однако настройка по умолчанию accessLogFile для Istio на GKE кажется пустой, и если я попытаюсь изменить ее с помощью kubectl edit configmap -n istio-system istio, она будет сброшена системой через несколько минут.

Есть ли способ поместить Istio в журналы доступа GKE в Stackdriver?




Ответы (2)


Для версии Istio, управляемой Google (включенной установкой флажка в вашем кластере GKE), в версиях 1.13 и выше журналы доступа по умолчанию отключены с использованием configmap accessLogFile: "". В версиях 1.12 и более ранних журналы доступа включены по умолчанию, поэтому в configmap есть accessLogFile: "/dev/stdout".

Как вы отметили, вы не можете изменить его, так как согласование сотрет изменение.

Я зарегистрировал обращение в службу поддержки Google, чтобы найти лучший подход, и они предложили вместо этого использовать журналы Mixer. Чтобы получить к ним доступ, вам необходимо включить Stackdriver в вашем кластере GKE (либо устаревший, либо новый мониторинг Kubernetes Engine). Затем вы можете использовать фильтр logName="projects/[PROJECT-NAME]/logs/server-accesslog-stackdriver.logentry.istio-system".

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

logName="projects/[PROJECT-NAME]/logs/server-accesslog-stackdriver.logentry.istio-system"
labels.destination_app="[YOUR-SERVICE]"
labels.source_app="[YOUR-OTHER-SERVICE]"

Чтобы увидеть запросы, исходящие извне GKE и проходящие через шлюз Istio Ingress:

logName="projects/[YOUR-PROJECT]/logs/server-accesslog-stackdriver.logentry.istio-system"
labels.destination_app="[YOUR-SERVICE]"
labels.source_app="istio-ingressgateway"

Однако эти журналы не на 100% эквивалентны журналам доступа к прокси-серверу и могут не помочь в устранении неполадок во всех сценариях. В Google открыт запрос функции для поддержки настройки карты конфигурации Istio, включая параметр accessLogFile: https://issuetracker.google.com/issues/126527530

Я предлагаю всем, кто интересуется этой функцией, проголосовать за нее, добавив звездочку.

Надеюсь, это поможет!

person Davep    schedule 19.08.2019
comment
Спасибо за ответ! Я только что проверил, и похоже, что журналы доступа к Mixer включают только запросы, отправленные в службу Mixer (то есть с URL /istio.mixer.v1.Mixer/Report). Таким образом, они бесполезны, чтобы узнать, к каким службам в моем кластере был осуществлен доступ. - person MrMage; 19.08.2019
comment
Ты прав. Журналы микшера не кажутся особенно полезными для устранения неполадок запросов, проходящих через прокси-сервер envoy. Я повторно открыл свое дело в Google и обновлю свой ответ, если они предоставят что-нибудь полезное. - person Davep; 21.08.2019
comment
В моем случае в журналах Mixer были запросы к моим сервисам, но они были несколько скрыты во всем шуме. Я добавил к своему ответу объяснение некоторых более конкретных вопросов, которые должны помочь вам найти ваши запросы. - person Davep; 28.08.2019
comment
К сожалению, в моем случае журналы Mixer очень неполные. Я прокомментировал и пометил упомянутую вами проблему, спасибо! - person MrMage; 29.08.2019
comment
Синтаксис logName, похоже, изменился: logName="projects/[PROJECT-NAME]/logs/server-accesslog-stackdriver.instance.istio-system" Обратите внимание на instance вместо logentry - person Saverio Proto; 19.06.2020

В GKE все stdout и stderr собираются и отправляется в лог-ротацию узла для последующего анализа и экспорта в Stackdriver через Fluentd.

Журналы доступа доступны с помощью команды kubectl logs, что означает, что они находятся в узле и анализируются и экспортируются с помощью агента Fluentd.

Я воспроизвел это и смог найти журналы доступа с помощью следующего расширенного фильтра Stackdriver (изменить в соответствии с вашими собственными ресурсами):

resource.type="container"
resource.labels.cluster_name="gke-cluster"
resource.labels.namespace_id="application-namespace"
resource.labels.project_id="project-id"
resource.labels.zone:"gcp-zone1-a"
resource.labels.container_name="istio-proxy"
resource.labels.pod_id:"sleep-"

Важные строки - это resource.labels.container_name="istio-proxy" для запроса контейнера istio-proxy и просмотра каждой реплики интересующего модуля с помощью resource.labels.pod_id:"sleep-".

Что касается configMap, поскольку GKE является управляемой реализацией Kubernetes, вы не должны изменять многие конфигурации, включая Fluentd. Цикл согласования автоматически сбрасывает все попытки изменения этих ресурсов.

Если вам это действительно нужно, вы можете развернуть собственную неуправляемую версию Свободно владеет GKE.

person yyyyahir    schedule 18.07.2019
comment
Вы используете официальный Istio в дистрибутиве GKE или версию OSS? В версии GKE istio-proxy журналы содержат только несколько редких отладочных сообщений, но не журналы доступа. - person MrMage; 19.07.2019
comment
Я пробовал оба и смог увидеть входящие 418 запросов GET (в sleep и httpbin). Может быть, у вас есть какие-то исключения Stackdriver? - person yyyyahir; 19.07.2019
comment
Я только что запустил kubectl журналы в своем istio-proxy контейнере, и даже он не показал никаких журналов. Что показывает ваша ConfigMap для accessLogFile при использовании Istio на GKE? - person MrMage; 22.07.2019
comment
После его замены с помощью шаблона Helm отображается следующая строка: # Set accessLogFile to empty string to disable access log. accessLogFile: "/dev/stdout". Отсутствие журналов от kubectl logs показывает, что это проблема уровня Istio, а не Stackdriver. Мне кажется, что это не ведение журнала, возможно, повторно примените шаблон Helm. - person yyyyahir; 22.07.2019
comment
Я спросил про Istio на GKE, где не могу заменить шаблон Helm. Вы действительно получаете журналы доступа с Istio на GKE и как там выглядит ConfigMap? - person MrMage; 22.07.2019
comment
Я заменял его, но запустил новый кластер и заметил, что строка по умолчанию находится в пространстве имен istio-system. Это GKE 1.12.8-gke.10 с Istio в разрешающем режиме. - person yyyyahir; 22.07.2019
comment
Просто попробуйте еще раз, и это сработало. В основном только 1. обозначил пространство имен, чтобы разрешить внедрение sidecar, 2. https://istio.io/docs/tasks/telemetry/logs/access-log/#before-you-begin, 4. https://istio.io/docs/tasks/telemetry/logs/access-log/#test-the-access-log и 5. проверил журналы Stackdriver, используя расширенный фильтр, упомянутый в моем ответе. - person yyyyahir; 22.07.2019
comment
Спасибо, но что говорит ConfigMap при установке Istio на GKE? - person MrMage; 22.07.2019
comment
Похоже на это для данных mesh. - person yyyyahir; 22.07.2019
comment
просто напомню, что, как и MrMage, наша установка istio на GKE имеет файл accessLogFile: и проблема в том, что при его исправлении он перезаписывается в течение нескольких минут. Ищу способ изменить его, который прилипает (поскольку это не установка на шлем, мы ничего не можем там сделать) - person juhanic; 23.07.2019
comment
Я только что повторил попытку с теми же положительными результатами. Я запустил кластер с помощью gcloud beta container clusters create istio3 --zone us-central1-a --num-nodes=5 --addons Istio --istio-config auth=MTLS_PERMISSIVE --async. Версия Istio обозначена как 1.0.6. Если это не сработает, я предлагаю вам обратиться в службу поддержки GCP. - person yyyyahir; 23.07.2019
comment
В Istio 1.1 по умолчанию журналы доступа отключены, а Google не разрешает изменять конфигурацию. Вот почему это работает для людей, использующих старую версию Istio 1.0, а не для людей, использующих новые кластеры с Istio 1.1. На этом этапе мы планируем отказаться от управляемого Istio, поскольку они кажутся невероятно медленными (текущая версия - 1.4). - person ramblingpolak; 19.11.2019