Логи доступу 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.accessLogFilemeshConfig.accessLogEncodingmeshConfig.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_RAW% %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_RAW% | 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