使用 Telemetry API 配置访问日志

Telemetry API 如今在 Istio 中作为核心 API 已经有一段时间了。 之前用户必须在 Istio 的 MeshConfig 中配置 Telemetry。

开始之前

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

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

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

    Zip

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

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

    Zip

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

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

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

    1. $ export SOURCE_POD=$(kubectl get pod -l app=curl -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@)

安装

在本例中,我们将发送日志到 Grafana Loki,确保它已被安装。

ZipZipZip

  1. $ istioctl install -f @samples/open-telemetry/loki/iop.yaml@ --skip-confirmation
  2. $ kubectl apply -f @samples/addons/loki.yaml@ -n istio-system
  3. $ kubectl apply -f @samples/open-telemetry/loki/otel.yaml@ -n istio-system

Telemetry API 入门

  1. 启用访问日志记录

    1. $ cat <<EOF | kubectl apply -n istio-system -f -
    2. apiVersion: telemetry.istio.io/v1
    3. kind: Telemetry
    4. metadata:
    5. name: mesh-logging-default
    6. spec:
    7. accessLogging:
    8. - providers:
    9. - name: otel
    10. EOF

    这个示例使用内置的 envoy 访问日志提供程序,我们除了默认设置外没有进行任何其他配置。

  2. 禁用特定工作负载的访问日志

    您可以使用以下配置禁用 curl 服务的访问日志:

    1. $ cat <<EOF | kubectl apply -n default -f -
    2. apiVersion: telemetry.istio.io/v1
    3. kind: Telemetry
    4. metadata:
    5. name: disable-curl-logging
    6. namespace: default
    7. spec:
    8. selector:
    9. matchLabels:
    10. app: curl
    11. accessLogging:
    12. - providers:
    13. - name: otel
    14. disabled: true
    15. EOF
  3. 通过工作负载模式过滤访问日志

    您可以使用以下配置禁用 httpbin 服务的入站访问日志:

    1. $ cat <<EOF | kubectl apply -n default -f -
    2. apiVersion: telemetry.istio.io/v1
    3. kind: Telemetry
    4. metadata:
    5. name: disable-httpbin-logging
    6. spec:
    7. selector:
    8. matchLabels:
    9. app: httpbin
    10. accessLogging:
    11. - providers:
    12. - name: otel
    13. match:
    14. mode: SERVER
    15. disabled: true
    16. EOF
  4. 通过 CEL 表达式过滤访问日志

    只有响应码大于等于 500 时,以下配置才显示访问日志:

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

    当连接失败时没有 response.code 属性。 在这种情况下,您应该使用 CEL 表达式 !has(response.code) || response.code >= 500

  5. 通过 CEL 表达式设置默认的过滤访问日志

    只有响应码大于等于 400 或请求转到 BlackHoleCluster 或 PassthroughCluster 时, 以下配置才显示访问日志(注意 xds.cluster_name 仅可用于 Istio 1.16.2 及更高版本):

    1. $ cat <<EOF | kubectl apply -f -
    2. apiVersion: telemetry.istio.io/v1alpha1
    3. kind: Telemetry
    4. metadata:
    5. name: default-exception-logging
    6. namespace: istio-system
    7. spec:
    8. accessLogging:
    9. - providers:
    10. - name: otel
    11. filter:
    12. expression: "response.code >= 400 || xds.cluster_name == 'BlackHoleCluster' || xds.cluster_name == 'PassthroughCluster' "
    13. EOF
  6. 使用 CEL 表达式过滤健康检查访问日志

    仅当日志不是由 Amazon Route 53 健康检查服务所生成时,以下配置才显示访问日志。 注意:request.useragent 专用于 HTTP 流量,因此为了避免破坏 TCP 流量, 我们需要检查该字段是否存在。有关更多信息,请参阅 CEL 类型检查

    1. $ cat <<EOF | kubectl apply -f -
    2. apiVersion: telemetry.istio.io/v1alpha1
    3. kind: Telemetry
    4. metadata:
    5. name: filter-health-check-logging
    6. spec:
    7. accessLogging:
    8. - providers:
    9. - name: otel
    10. filter:
    11. expression: "!has(request.useragent) || !(request.useragent.startsWith("Amazon-Route53-Health-Check-Service"))"
    12. EOF

    有关更多信息,请参阅使用赋值表达式

使用 OpenTelemetry 提供程序

Istio 支持使用 OpenTelemetry 协议发送访问日志, 如此处所述。

清理

  1. 移除所有 Telemetry API:

    1. $ kubectl delete telemetry --all -A
  2. 移除 loki

    ZipZip

    1. $ kubectl delete -f @samples/addons/loki.yaml@ -n istio-system
    2. $ kubectl delete -f @samples/open-telemetry/loki/otel.yaml@ -n istio-system
  3. 从集群中卸载 Istio:

    1. $ istioctl uninstall --purge --skip-confirmation