OpenTelemetry
Envoyプロキシは、アクセスログをOpenTelemetryフォーマットでエクスポートするように構成できます。この例では、プロキシはアクセスログをOpenTelemetryコレクターに送信し、コレクターは標準出力にログを出力するように構成されています。OpenTelemetryコレクターの標準出力は、kubectl logs
コマンドでアクセスできます。
始める前に
インストールガイドの手順に従ってIstioを設定します。
リクエスト送信のテストソースとして使用するために、curlサンプルアプリをデプロイします。自動サイドカーインジェクションを有効にしている場合は、次のコマンドを実行してサンプルアプリをデプロイします。
$ kubectl apply -f @samples/curl/curl.yaml@
それ以外の場合は、次のコマンドを使用してサイドカーを手動でインジェクトしてから、
curl
アプリケーションをデプロイします。$ 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
サービスをデプロイします。$ kubectl apply -f @samples/httpbin/httpbin.yaml@
それ以外の場合は、
httpbin
アプリケーションをデプロイする前に、サイドカーを手動で注入する必要があります。$ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@)
OpenTelemetry Collector のための名前空間を作成します。
$ kubectl create namespace observability
OpenTelemetry Collector をデプロイします。出発点として、このサンプル構成を使用できます:
otel.yaml
$ kubectl apply -f @samples/open-telemetry/otel.yaml@ -n observability
Envoyのアクセスログの有効化
アクセスログを有効にするには、テレメトリAPI を使用します。
MeshConfig
を編集して、otel
という名前の OpenTelemetry プロバイダーを追加します。これには、拡張プロバイダーのスタンザを追加する必要があります。
extensionProviders:
- name: otel
envoyOtelAls:
service: opentelemetry-collector.observability.svc.cluster.local
port: 4317
最終的な構成は次のようになります。
apiVersion: v1
kind: ConfigMap
metadata:
name: istio
namespace: istio-system
data:
mesh: |-
accessLogFile: /dev/stdout
defaultConfig:
discoveryAddress: istiod.istio-system.svc:15012
proxyMetadata: {}
tracing:
zipkin:
address: zipkin.istio-system:9411
enablePrometheusMerge: true
extensionProviders:
- name: otel
envoyOtelAls:
service: opentelemetry-collector.observability.svc.cluster.local
port: 4317
rootNamespace: istio-system
trustDomain: cluster.local
meshNetworks: 'networks: {}'
次に、アクセスログを OpenTelemetry Collector に送信するように Istio に指示する Telemetry リソースを追加します。
$ cat <<EOF | kubectl apply -n default -f -
apiVersion: telemetry.istio.io/v1
kind: Telemetry
metadata:
name: curl-logging
spec:
selector:
matchLabels:
app: curl
accessLogging:
- providers:
- name: otel
EOF
上記の例では、otel
アクセスログプロバイダーを使用しており、デフォルト設定以外の設定は何も行っていません。
同様の構成を個々の名前空間や個々のワークロードに適用して、きめ細かいレベルでログを制御することもできます。
テレメトリAPI の使用方法の詳細については、テレメトリAPIの概要を参照してください。
メッシュ設定の使用
IstioOperator
CR を使用して Istio をインストールした場合、構成に次のフィールドを追加します。
spec:
meshConfig:
accessLogFile: /dev/stdout
extensionProviders:
- name: otel
envoyOtelAls:
service: opentelemetry-collector.observability.svc.cluster.local
port: 4317
defaultProviders:
accessLogging:
- envoy
- otel
それ以外の場合は、元の istioctl install
コマンドに同等の設定を追加します。例:
$ istioctl install -f <your-istio-operator-config-file>
デフォルトのアクセスログフォーマット
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% | 418 | 418 |
%RESPONSE_FLAGS% | - | - |
%RESPONSE_CODE_DETAILS% | via_upstream | via_upstream |
%CONNECTION_TERMINATION_DETAILS% | - | - |
\"%UPSTREAM_TRANSPORT_FAILURE_REASON%\" | "-" | "-" |
%BYTES_RECEIVED% | 0 | 0 |
%BYTES_SENT% | 135 | 135 |
%DURATION% | 4 | 3 |
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% | 4 | 1 |
\"%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.local | inbound|8000|| |
%UPSTREAM_LOCAL_ADDRESS% | 10.44.1.23:37652 | 127.0.0.1:41854 |
%DOWNSTREAM_LOCAL_ADDRESS% | 10.0.45.184:8000 | 10.44.1.27:80 |
%DOWNSTREAM_REMOTE_ADDRESS% | 10.44.1.23:46520 | 10.44.1.23:37652 |
%REQUESTED_SERVER_NAME% | - | outbound_.8000_._.httpbin.foo.svc.cluster.local |
%ROUTE_NAME% | default | default |
アクセスログのテスト
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! ...
otel-collector
のログを確認します。$ kubectl logs -l app=opentelemetry-collector -n observability [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 プロキシである curl
と httpbin
の両方のログに表示されます。ログには、HTTP 動詞 (GET
)、HTTP パス (/status/418
)、応答コード (418
)、およびその他のリクエスト関連の情報が表示されます。
クリーンアップ
curl と httpbin サービスをシャットダウンします。
$ kubectl delete telemetry curl-logging
$ kubectl delete -f @samples/curl/curl.yaml@
$ kubectl delete -f @samples/httpbin/httpbin.yaml@
$ kubectl delete -f @samples/open-telemetry/otel.yaml@ -n istio-system
$ kubectl delete namespace observability
Envoyのアクセスログの無効化
Istio インストール構成で、meshConfig.extensionProviders
と meshConfig.defaultProviders
の設定を削除するか、""
に設定します。
$ istioctl install --set profile=default
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete