Envoyアクセスログ

最も単純なIstioロギングはEnvoyのアクセスロギングです。Envoyプロキシはアクセス情報を標準出力に出力します。Envoyコンテナの標準出力は、kubectl logsコマンドで表示できます。

始める前に

  • インストールガイドの手順に従って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環境変数に設定します。

    $ 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@)
    

Envoyのアクセスロギングの有効化

Istioはアクセスログを有効にするためのいくつかの方法を提供しています。テレメトリーAPIの使用をお勧めします。

テレメトリーAPIの使用

テレメトリAPIを使用して、アクセスログへのアクセスを有効または無効にできます。

apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
  name: mesh-default
  namespace: istio-system
spec:
  accessLogging:
    - providers:
      - name: envoy

上記の例では、デフォルトのenvoyアクセスログプロバイダを使用しており、デフォルト設定以外何も設定していません。

同様の設定を、個々の名前空間または個々のワークロードにも適用して、きめ細かいレベルでロギングを制御できます。

テレメトリAPIの使用方法の詳細については、テレメトリAPIの概要を参照してください。

メッシュ構成の使用

IstioOperator CRを使用してIstioをインストールした場合は、次のフィールドを構成に追加してください。

spec:
  meshConfig:
    accessLogFile: /dev/stdout

それ以外の場合は、元のistioctl installコマンドに同等の設定を追加します。例:

$ istioctl install <flags-you-used-to-install-Istio> --set meshConfig.accessLogFile=/dev/stdout

accessLogEncodingJSONまたはTEXTに設定することで、JSONとテキストのいずれかを選択することもできます。

accessLogFormatを編集して、アクセスログの形式をカスタマイズすることもできます。

これら3つの設定の詳細については、グローバルメッシュオプションを参照してください。

  • meshConfig.accessLogFile
  • meshConfig.accessLogEncoding
  • meshConfig.accessLogFormat

デフォルトのアクセスログフォーマット

accessLogFormatが指定されていない場合、Istioは次のデフォルトのアクセスログ形式を使用します。

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

次の表は、curlからhttpbinに送信されたリクエストに対してデフォルトのアクセスログ形式を使用した例を示しています。

ログオペレーターcurlのアクセスログhttpbinのアクセスログ
[%START_TIME%][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. curlからhttpbinへのリクエストを送信します。

    $ kubectl exec "$SOURCE_POD" -c curl -- curl -sS -v httpbin:8000/status/418
    ...
    < HTTP/1.1 418 Unknown
    ...
    < server: envoy
    ...
    I'm a teapot!
    ...
    
  2. curlのログを確認します。

    $ kubectl logs -l app=curl -c istio-proxy
    [2020-11-25T21:26:18.409Z] "GET /status/418 HTTP/1.1" 418 - via_upstream - "-" 0 135 4 4 "-" "curl/7.73.0-DEV" "84961386-6d84-929d-98bd-c5aee93b5c88" "httpbin:8000" "10.44.1.27:80" outbound|8000||httpbin.foo.svc.cluster.local 10.44.1.23:37652 10.0.45.184:8000 10.44.1.23:46520 - default
    
  3. httpbinのログを確認します。

    $ kubectl logs -l app=httpbin -c istio-proxy
    [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
    

リクエストに対応するメッセージは、それぞれ送信元と宛先のIstioプロキシであるcurlhttpbinの両方のログに表示されます。ログには、HTTP動詞(GET)、HTTPパス(/status/418)、応答コード(418)、およびその他のリクエスト関連情報が表示されます。

クリーンアップ

curlhttpbinのサービスをシャットダウンします。

ZipZip
$ kubectl delete -f @samples/curl/curl.yaml@
$ kubectl delete -f @samples/httpbin/httpbin.yaml@

Envoyのアクセスロギングの無効化

Istioインストール設定で、meshConfig.accessLogFile設定を削除するか、""に設定します。

$ istioctl install --set profile=default
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete
この情報は役に立ちましたか?
改善のための提案はありますか?

ご意見ありがとうございます!