Envoy 访问日志
Istio 最简单的日志记录方式是 Envoy 的访问日志。Envoy 代理将访问信息打印到其标准输出。然后,可以使用 kubectl logs
命令打印 Envoy 容器的标准输出。
开始之前
按照 安装指南 中的说明设置 Istio。
部署 curl 示例应用程序,用作发送请求的测试源。如果您启用了 自动 Sidecar 注射,请运行以下命令来部署示例应用程序
$ kubectl apply -f @samples/curl/curl.yaml@
否则,在使用以下命令部署
curl
应用程序之前,手动注入 Sidecar$ 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@
否则,您必须在部署
httpbin
应用程序之前手动注入 Sidecar$ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@)
启用 Envoy 的访问日志
Istio 提供了几种启用访问日志的方法。建议使用遥测 API
使用遥测 API
遥测 API 可用于启用或禁用访问日志
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: mesh-default
namespace: istio-system
spec:
accessLogging:
- providers:
- name: envoy
以上示例使用默认的 envoy
访问日志提供程序,并且我们除了默认设置之外没有配置任何其他内容。
类似的配置也可以应用于单个命名空间或单个工作负载,以更细粒度地控制日志记录。
有关使用遥测 API 的更多信息,请参阅 遥测 API 概述。
使用网格配置
如果您使用 IstioOperator
CR 安装 Istio,请将以下字段添加到您的配置中
spec:
meshConfig:
accessLogFile: /dev/stdout
否则,将等效设置添加到原始 istioctl install
命令中,例如
$ istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogFile=/dev/stdout
您还可以通过将 accessLogEncoding
设置为 JSON
或 TEXT
来在 JSON 和文本之间进行选择。
您可能还想通过编辑 accessLogFormat
来自定义访问日志的 格式。
有关所有这三个设置的更多信息,请参阅 全局网格选项
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
请注意,与请求对应的消息分别出现在源和目标(分别为 curl
和 httpbin
)的 Istio 代理的日志中。您可以在日志中看到 HTTP 动词 (GET
)、HTTP 路径 (/status/418
)、响应代码 (418
) 和其他 与请求相关的信息。
清理
$ kubectl delete -f @samples/curl/curl.yaml@
$ kubectl delete -f @samples/httpbin/httpbin.yaml@
禁用 Envoy 的访问日志
在 Istio 安装配置中删除 meshConfig.accessLogFile
设置或将其设置为 ""
。
$ istioctl install --set profile=default
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete