Логи доступу Envoy
Найпростіший тип логування в Istio — це логи доступу Envoy. Проксі Envoy виводять інформацію про доступ на свій стандартний вихід. Стандартний вихід контейнерів Envoy можна вивести за допомогою команди kubectl logs
.
Перш ніж розпочати
Налаштуйте Istio, дотримуючися інструкцій у посібнику з встановлення.
Розгорніть демонстраційний застосунок curl для використання як джерело тестових запитів. Якщо у вас увімкнено автоматичне додавання sidecar, виконайте наступну команду для розгортання демонстраційного застосунку:
$ kubectl apply -f @samples/curl/curl.yaml@
Інакше, вручну додайте sidecar перед розгортанням застосунку
curl
за допомогою наступної команди:$ 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
:$ kubectl apply -f @samples/httpbin/httpbin.yaml@
В іншому випадку вам потрібно вручну додати sidecar перед розгортанням застосунку
httpbin
:$ 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% | 418 | 418 |
%RESPONSE_FLAGS% | - | - |
%RESPONSE_CODE_DETAILS% | via_upstream | via_upstream |
%CONNECTION_TERMINATION_DETAILS% | - | - |
\"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" | "-" | "-" |
%BYTES_RECEIVED% | 0 | 0 |
%BYTES_SENT% | 135 | 135 |
%DURATION% | 4 | 3 |
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% | 4 | 1 |
\"%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.local | inbound|8000|| |
%UPSTREAM_LOCAL_ADDRESS% | 10.44.1.23:37652 | 127.0.0.1:41854 |
%DOWNSTREAM_LOCAL_ADDRESS% | 10.0.45.184:8000 | 10.44.1.27:80 |
%DOWNSTREAM_REMOTE_ADDRESS% | 10.44.1.23:46520 | 10.44.1.23:37652 |
%REQUESTED_SERVER_NAME% | - | outbound_.8000_._.httpbin.foo.svc.cluster.local |
%ROUTE_NAME% | default | default |
Тестування логів доступу
Надішліть запит від
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! ...
Перевірте логи
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
Перевірте логи
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:
$ 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