- OCI LoggingによるIstioのアプリケーションログの集約
- サービス・コネクタを利用したOCI Logging Analyticsとの連携
- OCI Application Performance Monitoringと連携した障害解析
はじめに
Oracle Cloud Infrastructure Logging (OCI Logging) は、様々なログを収集し、保管・検索を実行可能なログの一元管理を実現するマネージド・サービスです。Oracle Container Engine for Kubernetes (OKE) ワーカー・ノードで稼働するアプリケーション・コンテナのログを、カスタム・ログとしてOCI Loggingに集約することができます。また、OCIではクラスタ分析など機械学習を活用した高度なログ分析サービスであるOCI Logging Analyticsも提供されています。
本記事では、IstioのアクセスログをOCI Loggingで収集し、サービス・コネクタで連携したOCI Logging Analyticsで分析出来る環境を構築しました。また、IstioのFault Injectionを行い、前回の記事で構築したOCI APMのエラー検知やOCI Logging Analyticsを利用したログのクラスタ分析を試してみたいと思います。
検証環境
- Kubernetes: 1.22.5
- Istio: 1.13.3
OKEへのIstioのインストールは前々回の記事を参照してください。OCI APMの設定は前回の記事を参照してください。
なお、本記事の検証は管理者ユーザー (Administrators Groupに属したユーザー) で実施しています。Administrators Groupに属したユーザーで実施する場合は、下記のドキュメントに従って必要なポリシーを設定する必要があります。
Oracle Logging Analytics ログ・アナリティクスとそのリソースへのアクセスの有効化
Envoyアクセスログの有効化
IstioのEnvoyアクセスログを有効化する設定を行います。下記のコマンドを実行します。
なお、この後の操作は全てistio-1.13.3ディレクイトリ下で実施しています。
$ istioctl install \
> --set meshConfig.accessLogFile=/dev/stdout \
> --set meshConfig.accessLogEncoding=TEXT
This will install the Istio 1.13.3 default profile with ["Istio core" "Istiod" "Ingress gateways"] components into the cluster. Proceed? (y/N) y
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Installation complete
Making this installation the default for injection and validation.
Thank you for installing Istio 1.13. Please take a few minutes to tell us about your install/upgrade experience! https://forms.gle/pzWZpAvMVBecaQ9h9
bookinfoアプリにアクセスした後に、下記のコマンドを実行することで生成されたアクセスログを確認することが出来ます。
$ kubectl logs -l app=productpage -c istio-proxy
[2022-04-27T03:22:27.547Z] "GET /reviews/0 HTTP/1.1" 200 - via_upstream - "-" 0 295 4 4 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36" "1a37ab7a-9e7d-43f7-a30a-0914d743191c" "reviews:9080" "10.244.0.11:9080" outbound|9080||reviews.default.svc.cluster.local 10.244.0.12:49226 10.96.188.147:9080 10.244.0.12:38134 - default
[2022-04-27T03:22:27.538Z] "GET /productpage HTTP/1.1" 200 - via_upstream - "-" 0 4123 15 14 "10.244.0.1" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36" "1a37ab7a-9e7d-43f7-a30a-0914d743191c" "132.226.11.70" "10.244.0.12:9080" inbound|9080|| 127.0.0.6:56503 10.244.0.12:9080 10.244.0.1:0 outbound_.9080_._.productpage.default.svc.cluster.local default
[2022-04-27T03:22:27.786Z] "GET /details/0 HTTP/1.1" 200 - via_upstream - "-" 0 178 1 1 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36" "6c1d1d28-8d7a-468f-90d0-dfea459bc75d" "details:9080" "10.244.0.8:9080" outbound|9080||details.default.svc.cluster.local 10.244.0.12:39002 10.96.28.253:9080 10.244.0.12:51258 - default
OCI LoggingとOCI Logging Analyticsの設定
動的グループとポリシーの設定
OCIサービスコンソールの左上のメニューアイデンティティとセキュリティより、アイデンティティのコンパートメントを選択し、OCI Loggingでログ収集の対象となるリソースが存在するコンパートメントのOCIDを確認し、メモしておきます。
OCIサービスコンソールの左上のメニューアイデンティティとセキュリティより、アイデンティティの動的グループを選択し、動的グループを作成します。
下記の様に各項目を入力し 作成ボタンを押します。
- 名前: 任意の名前 logging-dynamic-group
- 説明: 任意 logging-dynamic-group
- 一致ルール: instance.compartment.id = 'ログ収集の対象となるリソースが存在するコンパートメントのOCID'
次に作成した動的グループに対してポリシーを作成します。OCIサービスコンソールの左上のメニューアイデンティティとセキュリティより、アイデンティティのポリシーを選択し、ポリシーを作成します。
下記の様に各項目を入力し 作成ボタンを押します。
- 名前: 任意の名前 logging
- 説明: 任意 logging
- コンパートメントの選択: 任意のコンパートメント名 dev
- ポリシー・ビルダー(手動エディタで入力): allow dynamic-group logging-dynamic-group to use log-content in compartment dev
OCI Loggingを利用したEnvoyアクセスログの収集
OKE上で稼働するbookinfoアプリケーションのEnvoyアクセスログを収集するようにOCI Loggingの設定を行っていきます。
OCIサービスコンソールの左上のメニュー監視および管理より、ロギングのログ・グループを選択し、収集されたログの保存先となるログ・グループを作成します。OCI Loggingのログ・グループ管理画面でコンパートメントを選択し、ログ・グループの作成ボタンを押します。
下記の様に各項目を入力し作成ボタンを押します。
- 名前: 任意の名前 Istio_OKE
- 説明: 任意 Istio_OKE
作成したログ・グループ左下のメニューよりログを選択し、カスタム・ログの作成ボタンを押し収集するカスタム・ログの設定を行います。
下記の様に入力し、カスタム・ログの作成ボタンを押します。
- 名前: 任意の名前 OKE_Logs
- コンパートメント: 任意のコンパートメント名 dev
- ロググループ: 先に作成しておいたログ・グループ名 Istio_OKE
続いてエージェント構成の作成ウィザードに遷移するので、新規構成の作成を選択し、下記の様に各項目を入力します。
全て入力したらカスタム・ログの作成ボタンを押します。
- 名前: 任意の名前 worker_node
- 説明: 任意の説明 worker_node
- コンパートメント: 任意のコンパートメント名 dev
- ホスト・グループ グループタイプ: 動的グループ
- ホスト・グループ グループ:: 先に作成しておいた動的グループ名 logging_dynamic-group
- エージェント構成 入力タイプ: ログ・パス
- エージェント構成 名前の入力: 任意の名前 Istio_OKE
- ファイル・パス: /var/log/containers/*
カスタム・ログが追加され、アクティブになってから暫く時間がたつとログ・グループの探索の画面よりログが収集されてくる様子を観察することが出来るようになります。
また、OCI Loggingの検索画面よりログの検索やログの詳細について確認することが出来ます。
サービス・コネクタを利用したOCI LoggingとOCI Logging Analyticsの連携
OCI Loggingが収集してきたログをOCI Logging Analyticsに連携して分析できるようにサービス・コネクタの設定を行います。
はじめに連携先となるOCI Logging Analyticsのログ・グループを作成します。OCIサービスコンソールの左上のメニュー監視および管理より、ログ・アナリティックスの管理を選択し、管理画面よりログ・グループを作成するコンパートメントを選択し、ログ・グループの作成を選択します。
下記の様に各項目を入力し、作成ボタンを押します。
- 名前: 任意の名前 Istio_OKE_Logs
OCI Logging Analyticsのログ・グループが作成されました。
続いて、OCI Loggingのサービス・コネクタを作成します。
OCIサービスコンソールの左上のメニュー監視および管理より、ロギングのサービス・コネクタを選択し、管理画面よりサービス・コネクタを作成するコンパートメントを選択し、サービス・コネクタの作成を選択します。
サービス・コネクタの作成ウィザードに遷移するので、下記の様に各項目を入力します。
- コネクタ名: 任意の名前 Istio_OKE_Connector
- 説明: 任意の説明 Istio_OKE_Connector
- リソース・コンパートメント: 任意のコンパートメント名 dev
- サービス・コネクタの構成 ソース: ロギング
- サービス・コネクタの構成 ターゲット: ログ・アナリティクス
- ソースの構成 コンパートメント名: OCI Loggingのログ・グループのコンパートメント dev
- ソースの構成 ログ・グループ: 事前に構成済のOCI Loggingのログ・グループ名 Istio_OKE
- ソースの構成 ログ: 事前に構成済のOCI Loggingのカスタム・ログ名 OKE_Logs
- ソースの構成 コンパートメント名: OCI Log Analyticsのログ・グループのコンパートメント dev
- ソースの構成 ログ・グループ: 事前に構成済のOCI Log Analyticsのログ・グループ名 Istio_OKE_Logs
ウィザード画面下部にポリシー作成のメッセージが表示されるので作成を押します。最後にウィザード左下の作成を押してサービス・コネクタの構成は完了です。
OCI Log Analyticsのログ・グループにログが転送されているか確認してみたいと思います。OCIサービスコンソールの左上のメニュー監視および管理より、ログ・アナリティックスのログ・エクスプローラーを選択します。
606レコードのログがOCI Log Analyticsから確認できます。ログを時系列で確認したりより見やすくするにはビジュアライゼーションから表示形式を変更できます。例えば、下記を選択すると時系列のヒストグラムとログの詳細を確認することが出来ます。
他にも分析のクラスタを選択すると、クラスタリングされて大量のログデータを類似するグループに自動的に分割することができます。こうすることで大量のログに埋もれてしまったメッセージを確認することが容易になります。
IstioのFault Injection
Istioでは、リクエストタイムアウト、Fault Injection、サーキット・ブレーカを構成することができ、アプリケーションのコードを変更することなく様々な障害をシミュレートしたテストを実施することが出来ます。本記事ではサンプルとして用意されているユーザーjasonからのトラフィックを遅延させFault Injectionルールを適用して、障害の様子をOCI APMやOCI Logging Analyticsで確認したいと思います。適用するFault Injectionは下記で、ユーザーjasonのratingサービスの間のトラフィックに7秒の遅延を発生させます。
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
spec:
hosts:
- ratings
http:
- match:
- headers:
end-user:
exact: jason
fault:
delay:
percentage:
value: 100.0
fixedDelay: 7s
route:
- destination:
host: ratings
subset: v1
- route:
- destination:
host: ratings
subset: v1
istio-1.13.3ディレクイトリ下で下記のコマンドを実行することでFault Injectionが適用されます。
$ kubectl apply -f samples/bookinfo/networking/virtual-service-ratings-test-delay.yaml
virtualservice.networking.istio.io/ratings created
bookinfoアプリケーションにアクセスするとRating機能が使えなくなっています。
OCI APMのトレースでエラーの発生箇所が、スパンの詳細で503エラーが発生していることが確認できます。
さらに、OCI Log Analyticsのクラスタ分析機能を活用して障害に該当するコンテナのエラーログを特定することが出来ました。
最後に
IstioのEnvoyアクセスログを取得し、OCI Loggingで収集、OCI Logging Analyticsで分析することが出来ました。特にOCI Logging Analyticsは大量のログを自動分類してくれるクラスタ分析機能と、グループ分けされたログを時系列のヒストグラムで表示させることが容易にできることがとても便利でした。今回試すことが出来ませんでしたが他のログを集約して一度に分析することで問題箇所の切分けに活用できそうです。
参考情報
Oracle Cloud Infrastructureドキュメント 例: OKEへのIstioサービス メッシュのインストール
Oracle Cloud Infrastructureドキュメント Logging
Oracle Cloud Infrastructureドキュメント Oracle Cloud Logging Analytics
Cloud Native Developers JP - ハンズオンチュートリアル Kubernetesにおけるログの収集