OpenTelemetry

您可以配置 Envoy 代理以 OpenTelemetry 格式 导出访问日志。 在本例中,这些代理将发送访问日志到被配置为将日志打印到标准输出的 OpenTelemetry 收集器。 然后您可以通过 kubectl logs 命令访问 OpenTelemetry 收集器的标准输出。

开始之前

  • 按照安装指南中的说明安装 Istio。

    如果您安装 demo安装配置, 则将启用 Egress Gateway 和访问日志。

  • sleep 示例应用程序部署为发送请求的测试源。 如果您启用了自动 Sidecar 注入, 运行以下命令部署示例应用程序:

    Zip

    1. $ kubectl apply -f @samples/sleep/sleep.yaml@

    否则,在使用以下命令部署 sleep 应用程序之前,手动注入 Sidecar:

    Zip

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

    您可以使用任何安装了 curl 的 Pod 作为测试源。

  • 为了发送请求,您需要创建 SOURCE_POD 环境变量来存储源 Pod 的名称:

    1. $ export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})
  • 启动 Httpbin 样例程序。

    如果您启用了 Sidecar 自动注入,通过以下命令部署 httpbin 服务:

    Zip

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

    否则,您必须在部署 httpbin 应用程序前进行手动注入,部署命令如下:

    Zip

    1. $ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@)
  • 启动 otel-collector 示例。

    Zip

    1. $ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n istio-system

启用 Envoy 的访问日志记录

要启用访问日志记录,可以使用 Telemetry API

编辑 MeshConfig 添加名为 otel 的 OpenTelemetry 提供程序。 这会涉及添加以下扩展提供程序代码段:

  1. extensionProviders:
  2. - name: otel
  3. envoyOtelAls:
  4. service: opentelemetry-collector.istio-system.svc.cluster.local
  5. port: 4317

最终的配置应看起来如下所示:

  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: istio
  5. namespace: istio-system
  6. data:
  7. mesh: |-
  8. accessLogFile: /dev/stdout
  9. defaultConfig:
  10. discoveryAddress: istiod.istio-system.svc:15012
  11. proxyMetadata: {}
  12. tracing:
  13. zipkin:
  14. address: zipkin.istio-system:9411
  15. enablePrometheusMerge: true
  16. extensionProviders:
  17. - name: otel
  18. envoyOtelAls:
  19. service: opentelemetry-collector.istio-system.svc.cluster.local
  20. port: 4317
  21. rootNamespace: istio-system
  22. trustDomain: cluster.local
  23. meshNetworks: 'networks: {}'

接下来,添加 Telemetry 资源告诉 Istio 将访问日志发送到 OpenTelemetry 收集器。

  1. $ cat <<EOF | kubectl apply -n default -f -
  2. apiVersion: telemetry.istio.io/v1alpha1
  3. kind: Telemetry
  4. metadata:
  5. name: sleep-logging
  6. spec:
  7. selector:
  8. matchLabels:
  9. app: sleep
  10. accessLogging:
  11. - providers:
  12. - name: otel
  13. EOF

以上示例使用 otel 访问日志提供程序,除了默认设置外我们无需执行任何其他配置。

类似的配置也可以应用到个别命名空间上,或应用到个别工作负载上,从而以精细粒度级别控制日志记录。

有关使用 Telemetry API 的更多信息,请参阅 Telemetry API 概述

使用网格配置

如果您使用了 IstioOperator CR 来安装 Istio,请将以下字段添加到您的配置:

  1. spec:
  2. meshConfig:
  3. accessLogFile: /dev/stdout
  4. extensionProviders:
  5. - name: otel
  6. envoyOtelAls:
  7. service: opentelemetry-collector.istio-system.svc.cluster.local
  8. port: 4317
  9. defaultProviders:
  10. accessLogging:
  11. - envoy
  12. - otel

否则将等效的设置添加到您的原始 istioctl install 命令,例如:

  1. $ istioctl install -f <your-istio-operator-config-file>

默认访问日志格式

如果 accessLogFormat 未被指定,Istio 将使用以下默认的访问日志格式:

  1. [%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %RESPONSE_CODE_DETAILS% %CONNECTION_TERMINATION_DETAILS%
  2. \"%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)%\"
  3. \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\" %UPSTREAM_CLUSTER% %UPSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_LOCAL_ADDRESS% %DOWNSTREAM_REMOTE_ADDRESS% %REQUESTED_SERVER_NAME% %ROUTE_NAME%\n

下表显示的示例针对从 sleep 发送到 httpbin 的请求使用默认的访问日志格式:

日志运算符sleep 中的访问日志httpbin 中的访问日志
[%STARTTIME%][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. 将请求从 sleep 发送到 httpbin

    1. $ kubectl exec "$SOURCE_POD" -c sleep -- curl -sS -v httpbin:8000/status/418
    2. ...
    3. < HTTP/1.1 418 Unknown
    4. < server: envoy
    5. ...
    6. -=[ teapot ]=-
    7. _...._
    8. .' _ _ `.
    9. | ."` ^ `". _,
    10. \_;`"---"`|//
    11. | ;/
    12. \_ _/
    13. `"""`
  2. 检查 otel-collector 的日志:

    1. $ kubectl logs -l app=opentelemetry-collector -n istio-system
    2. [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

请注意,与请求对应的消息分别出现在来源和目的地(即 sleephttpbin)的 Istio 代理日志中。 您可以在此日志中看到 HTTP 动作(GET)、HTTP 路径(/status/418)、响应码(418) 和其他请求相关的信息

清理

关闭 sleephttpbin 服务:

ZipZipZip

  1. $ kubectl delete telemetry sleep-logging
  2. $ kubectl delete -f @samples/sleep/sleep.yaml@
  3. $ kubectl delete -f @samples/httpbin/httpbin.yaml@
  4. $ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n istio-system

禁用 Envoy 的访问日志记录

在您的 Istio 安装配置中移除 meshConfig.extensionProvidersmeshConfig.defaultProviders 设置或设置为 ""

如下例所示,将 default 替换为安装 Istio 时所用的配置文件名称。

  1. $ istioctl install --set profile=default
  2. Istio core installed
  3. Istiod installed
  4. Ingress gateways installed
  5. Installation complete