Логи доступу Envoy

Найпростіший тип логування в Istio — це логи доступу Envoy. Проксі Envoy виводять інформацію про доступ на свій стандартний вихід. Стандартний вихід контейнерів Envoy можна вивести за допомогою команди kubectl logs.

Перш ніж розпочати

  • Налаштуйте Istio, дотримуючися інструкцій у посібнику з встановлення.

  • Розгорніть демонстраційний застосунок curl для використання як джерело тестових запитів. Якщо у вас увімкнено автоматичне додавання sidecar, виконайте наступну команду для розгортання демонстраційного застосунку:

    Zip
    $ kubectl apply -f @samples/curl/curl.yaml@

    Інакше, вручну додайте sidecar перед розгортанням застосунку curl за допомогою наступної команди:

    Zip
    $ kubectl apply -f <(istioctl kube-inject -f @samples/curl/curl.yaml@)
  • Встановіть змінну середовища SOURCE_POD на імʼя вашого podʼа:

    $ export SOURCE_POD=$(kubectl get pod -l app=curl -o jsonpath={.items..metadata.name})
  • Запустіть зразок httpbin.

    Якщо ви увімкнули автоматичну інʼєкцію sidecar, розгорніть сервіс httpbin:

    Zip
    $ kubectl apply -f @samples/httpbin/httpbin.yaml@

    В іншому випадку вам потрібно вручну додати sidecar перед розгортанням застосунку httpbin:

    Zip
    $ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@)

Увімкнення логів доступу Envoy

Istio пропонує декілька способів увімкнення логів доступу. Рекомендується використовувати Telemetry API.

Використання Telemetry API

Telemetry API можна використовувати для увімкнення або вимкнення логів доступу:

apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: mesh-default
  namespace: istio-system
spec:
  accessLogging:
    - providers:
      - name: envoy

У прикладі вище використовується стандартний провайдер логів доступу envoy, і ми не налаштовуємо нічого, окрім стандартних параметрів.

Подібну конфігурацію можна також застосувати на рівні окремого простору імен або конкретного навантаження для детальнішого контролю логування.

Більше інформації про використання Telemetry API дивіться в огляді Telemetry API.

Використання конфігурації Mesh

Якщо ви використовували конфігурацію IstioOperator для встановлення Istio, додайте наступне поле до вашої конфігурації:

spec:
  meshConfig:
    accessLogFile: /dev/stdout

В іншому випадку, додайте еквівалентне налаштування до вашої початкової команди istioctl install, наприклад:

$ istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogFile=/dev/stdout

Ви також можете вибрати між JSON і текстом, встановивши accessLogEncoding на JSON або TEXT.

Ви також можете налаштувати формат логів доступу, редагуючи accessLogFormat.

Дивіться глобальні параметри mesh для отримання додаткової інформації про ці три налаштування:

  • meshConfig.accessLogFile
  • meshConfig.accessLogEncoding
  • meshConfig.accessLogFormat

Формат логів доступу за замовчуванням

Якщо не вказано accessLogFormat, Istio використовуватиме наступний стандартний формат логів доступу:

[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %RESPONSE_CODE_DETAILS% %CONNECTION_TERMINATION_DETAILS%
\"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" %BYTES_RECEIVED% %BYTES_SENT% %DURATION% %RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\"
\"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME% %ROUTE_NAME%\n

У таблиці нижче наведено приклад використання формату стандартних логів доступу для запиту від curl до httpbin:

Оператор логулоги доступу у curlлоги доступу у httpbin
[%START_TIME%][2020-11-25T21:26:18.409Z][2020-11-25T21:26:18.409Z]
\"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\""GET /status/418 HTTP/1.1""GET /status/418 HTTP/1.1"
%RESPONSE_CODE%418418
%RESPONSE_FLAGS%--
%RESPONSE_CODE_DETAILS%via_upstreamvia_upstream
%CONNECTION_TERMINATION_DETAILS%--
\"%UPSTREAM_TRANSPORT_FAILURE_REASON%\""-""-"
%BYTES_RECEIVED%00
%BYTES_SENT%135135
%DURATION%43
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%41
\"%REQ(X-FORWARDED-FOR)%\""-""-"
\"%REQ(USER-AGENT)%\""curl/7.73.0-DEV""curl/7.73.0-DEV"
\"%REQ(X-REQUEST-ID)%\""84961386-6d84-929d-98bd-c5aee93b5c88""84961386-6d84-929d-98bd-c5aee93b5c88"
\"%REQ(:AUTHORITY)%\""httpbin:8000""httpbin:8000"
\"%UPSTREAM_HOST%\""10.44.1.27:80""127.0.0.1:80"
%UPSTREAM_CLUSTER%outbound|8000||httpbin.foo.svc.cluster.localinbound|8000||
%UPSTREAM_LOCAL_ADDRESS%10.44.1.23:37652127.0.0.1:41854
%DOWNSTREAM_LOCAL_ADDRESS%10.0.45.184:800010.44.1.27:80
%DOWNSTREAM_REMOTE_ADDRESS%10.44.1.23:4652010.44.1.23:37652
%REQUESTED_SERVER_NAME%-outbound_.8000_._.httpbin.foo.svc.cluster.local
%ROUTE_NAME%defaultdefault

Тестування логів доступу

  1. Надішліть запит від curl до httpbin:

    $ kubectl exec "$SOURCE_POD" -c curl -- curl -sS -v httpbin:8000/status/418
    ...
    < HTTP/1.1 418 Unknown
    ...
    < server: envoy
    ...
    I'm a teapot!
    ...
  2. Перевірте логи curl:

    $ kubectl logs -l app=curl -c istio-proxy
    [2020-11-25T21:26:18.409Z] "GET /status/418 HTTP/1.1" 418 - via_upstream - "-" 0 135 4 4 "-" "curl/7.73.0-DEV" "84961386-6d84-929d-98bd-c5aee93b5c88" "httpbin:8000" "10.44.1.27:80" outbound|8000||httpbin.foo.svc.cluster.local 10.44.1.23:37652 10.0.45.184:8000 10.44.1.23:46520 - default
  3. Перевірте логи httpbin:

    $ kubectl logs -l app=httpbin -c istio-proxy
    [2020-11-25T21:26:18.409Z] "GET /status/418 HTTP/1.1" 418 - via_upstream - "-" 0 135 3 1 "-" "curl/7.73.0-DEV" "84961386-6d84-929d-98bd-c5aee93b5c88" "httpbin:8000" "127.0.0.1:80" inbound|8000|| 127.0.0.1:41854 10.44.1.27:80 10.44.1.23:37652 outbound_.8000_._.httpbin.foo.svc.cluster.local default

Зверніть увагу, що повідомлення, повʼязані із запитом, зʼявляються в логах Istio-проксі як на джерелі, так і на пункті призначення — відповідно, curl і httpbin. Ви можете побачити в логах HTTP-метод (GET), HTTP-шлях (/status/418), код відповіді (418) та іншу інформацію про запит.

Очищення

Завершіть роботу сервісів curl та httpbin:

ZipZip
$ kubectl delete -f @samples/curl/curl.yaml@
$ kubectl delete -f @samples/httpbin/httpbin.yaml@

Вимкнення логування доступу Envoy

Видаліть або встановіть значення meshConfig.accessLogFile у вашу конфігурацію встановлення Istio на "".

$ istioctl install --set profile=default
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete
Чи була ця інформація корисною?
Чи є у вас пропозиції щодо покращення?

Дякуємо за ваш відгук!