使用遥测 API 配置访问日志

遥测 API 已经成为 Istio 中的一流 API 很长时间了。以前,用户必须在 Istio 配置的 MeshConfig 部分配置遥测。

开始之前

  • 按照 安装指南 中的说明设置 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@)
    

安装

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

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

使用遥测 API 入门

  1. 启用访问日志

    $ cat <<EOF | kubectl apply -n istio-system -f -
    apiVersion: telemetry.istio.io/v1
    kind: Telemetry
    metadata:
      name: mesh-logging-default
    spec:
      accessLogging:
      - providers:
        - name: otel
    EOF
    

    上面的示例使用内置的 envoy 访问日志提供程序,我们没有配置任何内容,除了默认设置之外。

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

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

    $ cat <<EOF | kubectl apply -n default -f -
    apiVersion: telemetry.istio.io/v1
    kind: Telemetry
    metadata:
      name: disable-curl-logging
      namespace: default
    spec:
      selector:
        matchLabels:
          app: curl
      accessLogging:
      - providers:
        - name: otel
        disabled: true
    EOF
    
  3. 使用工作负载模式筛选访问日志

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

    $ cat <<EOF | kubectl apply -n default -f -
    apiVersion: telemetry.istio.io/v1
    kind: Telemetry
    metadata:
      name: disable-httpbin-logging
    spec:
      selector:
        matchLabels:
          app: httpbin
      accessLogging:
      - providers:
        - name: otel
        match:
          mode: SERVER
        disabled: true
    EOF
    
  4. 使用 CEL 表达式筛选访问日志

    以下配置仅在响应代码大于或等于 500 时显示访问日志

    $ cat <<EOF | kubectl apply -n default -f -
    apiVersion: telemetry.istio.io/v1alpha1
    kind: Telemetry
    metadata:
      name: filter-curl-logging
    spec:
      selector:
        matchLabels:
          app: curl
      accessLogging:
      - providers:
        - name: otel
        filter:
          expression: response.code >= 500
    EOF
    
  5. 使用 CEL 表达式设置默认筛选访问日志

    以下配置仅在响应代码大于或等于 400 或请求发送到 BlackHoleCluster 或 PassthroughCluster 时显示访问日志:注意:xds.cluster_name 仅在 Istio 1.16.2 及更高版本中可用

    $ cat <<EOF | kubectl apply -f -
    apiVersion: telemetry.istio.io/v1alpha1
    kind: Telemetry
    metadata:
      name: default-exception-logging
      namespace: istio-system
    spec:
      accessLogging:
      - providers:
        - name: otel
        filter:
          expression: "response.code >= 400 || xds.cluster_name == 'BlackHoleCluster' ||  xds.cluster_name == 'PassthroughCluster' "
    
    EOF
    
  6. 使用 CEL 表达式筛选健康检查访问日志

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

    $ cat <<EOF | kubectl apply -f -
    apiVersion: telemetry.istio.io/v1alpha1
    kind: Telemetry
    metadata:
      name: filter-health-check-logging
    spec:
      accessLogging:
      - providers:
        - name: otel
        filter:
          expression: "!has(request.useragent) || !(request.useragent.startsWith("Amazon-Route53-Health-Check-Service"))"
    EOF
    

    有关更多信息,请参见使用表达式作为值

使用 OpenTelemetry 提供程序

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

清理

  1. 删除所有遥测 API

    $ kubectl delete telemetry --all -A
    
  2. 删除 loki

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

    $ istioctl uninstall --purge --skip-confirmation
    
这些信息对您有帮助吗?
您有什么改进建议吗?

感谢您的反馈!