Telemetry API を使用したアクセスログの設定

Telemetry API は、Istio ではかなり以前からファーストクラスの API として存在しています。以前は、ユーザーは Istio 構成の `MeshConfig` セクションでテレメトリを設定する必要がありました。

始める前に

  • インストールガイドの手順に従って Istio をセットアップします。

  • リクエストを送信するためのテストソースとして使用する curl サンプルアプリをデプロイします。自動サイドカーインジェクションが有効になっている場合は、次のコマンドを実行してサンプルアプリをデプロイします

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

    それ以外の場合は、次のコマンドを使用して `curl` アプリケーションをデプロイする前に、サイドカーを手動で挿入します

    Zip
    $ 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 サンプルを開始します。

    自動サイドカーインジェクションを有効にしている場合は、`httpbin` サービスをデプロイします

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

    それ以外の場合は、`httpbin` アプリケーションをデプロイする前に、サイドカーを手動で挿入する必要があります

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

インストール

この例では、ログを Grafana Loki に送信するため、インストールされていることを確認してください

ZipZipZip
$ 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

Telemetry 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. すべてのTelemetry APIを削除する

    $ kubectl delete telemetry --all -A
    
  2. loki を削除する

    ZipZip
    $ 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
    
この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!