Telemetry API を使用したアクセスログの設定
Telemetry API は、Istio ではかなり以前からファーストクラスの API として存在しています。以前は、ユーザーは Istio 構成の `MeshConfig` セクションでテレメトリを設定する必要がありました。
始める前に
インストールガイドの手順に従って Istio をセットアップします。
リクエストを送信するためのテストソースとして使用する curl サンプルアプリをデプロイします。自動サイドカーインジェクションが有効になっている場合は、次のコマンドを実行してサンプルアプリをデプロイします
$ kubectl apply -f @samples/curl/curl.yaml@
それ以外の場合は、次のコマンドを使用して `curl` アプリケーションをデプロイする前に、サイドカーを手動で挿入します
$ 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` サービスをデプロイします
$ kubectl apply -f @samples/httpbin/httpbin.yaml@
それ以外の場合は、`httpbin` アプリケーションをデプロイする前に、サイドカーを手動で挿入する必要があります
$ 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
Telemetry API を使い始める
アクセスロギングを有効にする
$ 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` アクセスログプロバイダーを使用しており、デフォルト設定以外に何も構成していません。
特定のワークロードのアクセスログを無効にする
以下の設定で、
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
ワークロードモードでアクセスログをフィルタリングする
以下の設定で、
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
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
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
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プロトコルを使用してアクセスログを送信することをサポートしています。
クリーンアップ
すべてのTelemetry APIを削除する
$ kubectl delete telemetry --all -A
loki
を削除する$ kubectl delete -f @samples/addons/loki.yaml@ -n istio-system $ kubectl delete -f @samples/open-telemetry/loki/otel.yaml@ -n istio-system
クラスタからIstioをアンインストールする
$ istioctl uninstall --purge --skip-confirmation