10.3. LokiStack ログストアの設定
ロギングサブシステムのドキュメントでは、LokiStack はロギングサブシステムでサポートされている Loki と Web プロキシーと OpenShift Container Platform 認証統合の組み合わせを指します。LokiStack のプロキシーは、OpenShift Container Platform 認証を使用してマルチテナンシーを適用します。Loki では、ログストアを個別のコンポーネントまたは外部ストアと呼んでいます。
10.3.1. cluster-admin ユーザーロールの新規グループの作成
cluster-admin
ユーザーとして複数の namespace のアプリケーションログをクエリーすると、クラスター内のすべての namespace の文字数の合計が 5120 を超え、Parse error: input size too long (XXXX > 5120)
エラーが発生します。LokiStack のログへのアクセスをより適切に制御するには、cluster-admin
ユーザーを cluster-admin
グループのメンバーにします。cluster-admin
グループが存在しない場合は、作成して必要なユーザーを追加します。
次の手順を使用して、cluster-admin
権限のあるユーザー用に、新しいグループを作成します。
手順
以下のコマンドを入力して新規グループを作成します。
$ oc adm groups new cluster-admin
以下のコマンドを実行して、必要なユーザーを
cluster-admin
グループに追加します。$ oc adm groups add-users cluster-admin <username>
以下のコマンドを実行して
cluster-admin
ユーザーロールをグループに追加します。$ oc adm policy add-cluster-role-to-group cluster-admin cluster-admin
10.3.2. Loki でストリームベースの保持の有効化
Logging バージョン 5.6 以降では、ログストリームに基づいて保持ポリシーを設定できます。これらのルールは、グローバル、テナントごと、またはその両方で設定できます。両方で設定すると、グローバルルールの前にテナントルールが適用されます。
ストリームベースの保持を有効にするには、
LokiStack
カスタムリソース (CR) を作成します。グローバルなストリームベースの保持の例
apiVersion: loki.grafana.com/v1 kind: LokiStack metadata: name: logging-loki namespace: openshift-logging spec: limits: global: 1 retention: 2 days: 20 streams: - days: 4 priority: 1 selector: '{kubernetes_namespace_name=~"test.+"}' 3 - days: 1 priority: 1 selector: '{log_type="infrastructure"}' managementState: Managed replicationFactor: 1 size: 1x.small storage: schemas: - effectiveDate: "2020-10-11" version: v11 secret: name: logging-loki-s3 type: aws storageClassName: standard tenants: mode: openshift-logging
- 1
- すべてのログストリームの保持ポリシーを設定します。注記: このフィールドは、オブジェクトストレージに保存されたログの保持期間には影響しません。
- 2
- このブロックが CR に追加されると、クラスターで保持が有効になります。
- 3
- ログストリームの定義に使用される LogQL クエリー が含まれています。
テナントごとのストリームベースの保持の例
apiVersion: loki.grafana.com/v1 kind: LokiStack metadata: name: logging-loki namespace: openshift-logging spec: limits: global: retention: days: 20 tenants: 1 application: retention: days: 1 streams: - days: 4 selector: '{kubernetes_namespace_name=~"test.+"}' 2 infrastructure: retention: days: 5 streams: - days: 1 selector: '{kubernetes_namespace_name=~"openshift-cluster.+"}' managementState: Managed replicationFactor: 1 size: 1x.small storage: schemas: - effectiveDate: "2020-10-11" version: v11 secret: name: logging-loki-s3 type: aws storageClassName: standard tenants: mode: openshift-logging
- 1
- テナントごとの保持ポリシーを設定します。有効なテナントタイプは、
application
、audit
、およびinfrastructure
です。 - 2
- ログストリームの定義に使用される LogQL クエリー が含まれています。
LokiStack
CR を適用します。$ oc apply -f <filename>.yaml
これは、保存されたログの保持を管理するためのものではありません。保存されたログのグローバルな保持期間 (最大 30 日間までサポート) は、オブジェクトストレージで設定します。
10.3.3. Loki レート制限エラーのトラブルシューティング
Log Forwarder API がレート制限を超える大きなメッセージブロックを Loki に転送すると、Loki により、レート制限 (429
) エラーが生成されます。
これらのエラーは、通常の動作中に発生する可能性があります。たとえば、すでにいくつかのログがあるクラスターにロギングを追加する場合、ロギングが既存のログエントリーをすべて取り込もうとするとレート制限エラーが発生する可能性があります。この場合、新しいログの追加速度が合計レート制限よりも低い場合、履歴データは最終的に取り込まれ、ユーザーの介入を必要とせずにレート制限エラーが解決されます。
レート制限エラーが引き続き発生する場合は、LokiStack
カスタムリソース (CR) を変更することで問題を解決できます。
LokiStack
CR は、Grafana がホストする Loki では利用できません。このトピックは、Grafana がホストする Loki サーバーには適用されません。
条件
- Log Forwarder API は、ログを Loki に転送するように設定されている。
システムは、次のような 2MB を超えるメッセージのブロックを Loki に送信する。以下に例を示します。
"values":[["1630410392689800468","{\"kind\":\"Event\",\"apiVersion\":\ \"received_at\":\"2021-08-31T11:46:32.800278+00:00\",\"version\":\"1.7.4 1.6.0\"}},\"@timestamp\":\"2021-08-31T11:46:32.799692+00:00\",\"viaq_index_name\":\"audit-write\",\"viaq_msg_id\":\"MzFjYjJkZjItNjY0MC00YWU4LWIwMTEtNGNmM2E5ZmViMGU4\",\"log_type\":\"audit\"}"]]}]}
oc logs -n openshift-logging -l component=collector
と入力すると、クラスター内のコレクターログに、次のいずれかのエラーメッセージを含む行が表示されます。429 Too Many Requests Ingestion rate limit exceeded
Vector エラーメッセージの例
2023-08-25T16:08:49.301780Z WARN sink{component_kind="sink" component_id=default_loki_infra component_type=loki component_name=default_loki_infra}: vector::sinks::util::retries: Retrying after error. error=Server responded with an error: 429 Too Many Requests internal_log_rate_limit=true
Fluentd エラーメッセージの例
2023-08-30 14:52:15 +0000 [warn]: [default_loki_infra] failed to flush the buffer. retry_times=2 next_retry_time=2023-08-30 14:52:19 +0000 chunk="604251225bf5378ed1567231a1c03b8b" error_class=Fluent::Plugin::LokiOutput::LogPostError error="429 Too Many Requests Ingestion rate limit exceeded for user infrastructure (limit: 4194304 bytes/sec) while attempting to ingest '4082' lines totaling '7820025' bytes, reduce log volume or contact your Loki administrator to see if the limit can be increased\n"
このエラーは受信側にも表示されます。たとえば、LokiStack 取り込み Pod で以下を行います。
Loki 取り込みエラーメッセージの例
level=warn ts=2023-08-30T14:57:34.155592243Z caller=grpc_logging.go:43 duration=1.434942ms method=/logproto.Pusher/Push err="rpc error: code = Code(429) desc = entry with timestamp 2023-08-30 14:57:32.012778399 +0000 UTC ignored, reason: 'Per stream rate limit exceeded (limit: 3MB/sec) while attempting to ingest for stream
手順
LokiStack
CR のingestionBurstSize
およびingestionRate
フィールドを更新します。apiVersion: loki.grafana.com/v1 kind: LokiStack metadata: name: logging-loki namespace: openshift-logging spec: limits: global: ingestion: ingestionBurstSize: 16 1 ingestionRate: 8 2 # ...
- 1
ingestionBurstSize
フィールドは、ディストリビューターレプリカごとに最大ローカルレート制限サンプルサイズを MB 単位で定義します。この値はハードリミットです。この値を、少なくとも 1 つのプッシュリクエストで想定される最大ログサイズに設定します。ingestionBurstSize
値より大きい単一リクエストは使用できません。- 2
ingestionRate
フィールドは、1 秒あたりに取り込まれるサンプルの最大量 (MB 単位) に対するソフト制限です。ログのレートが制限を超えているにもかかわらず、コレクターがログの送信を再試行すると、レート制限エラーが発生します。合計平均が制限よりも少ない場合に限り、システムは回復し、ユーザーの介入なしでエラーが解決されます。