ロギング
Verrazzanoロギング・スタックは、Fluentd、OpenSearchおよびOpenSearchダッシュボードのコンポーネントで構成されます。
- Fluentd: Kubernetesクラスタからログを収集、処理およびフォーマットするログ・アグリゲータ。
- OpenSearch: Kubernetesログを格納するためのスケーラブルな検索および分析エンジン。
- OpenSearchダッシュボード: 収集されたログを問い合せて視覚化するためのユーザー・インタフェースを提供するビジュアライゼーション・レイヤー。
次の図に示すように、Kubernetesで実行されているコンテナによってstdoutに書き込まれたログは、そのノードで実行されているkubeletサービスによって取得され、/var/log/containers
に書き込まれます。
Fluentdサイドカー
複数のログ・ストリームがあるコンポーネント、またはstdoutにログを出力できないコンポーネントについては、Verrazzanoはログ・ストリームを解析および変換するFluentdサイドカーをデプロイします。結果のログは、サイドカー・コンテナのstdoutに送信され、kubeletサービスによって/var/log/containers
に書き込まれます。
たとえば、WebLogicデプロイメントでは、AdminServer.log
が使用されて変換され、Fluentdサイドカーによってstdoutに書き込まれます。これらのログは、fluentd-stdout-sidecar
という名前のコンテナでkubectl
を使用して表示できます。
$ kubectl logs tododomain-adminserver \
-n todo-list \
-c fluentd-stdout-sidecar
Verrazzano Fluentd Dockerイメージには、次のプラグインが付属しています:
- fluent-plugin-concat
- fluent-plugin-dedot_filter
- fluent-plugin-detect-exceptions
- fluent-plugin-elasticsearch
- fluent-plugin-grok-parser
- fluent-plugin-json-in-json-2
- fluent-plugin-kubernetes_metadata_filter
- fluent-plugin-multi-format-parser
- fluent-plugin-parser-cri
- fluent-plugin-prometheus
- fluent-plugin-record-modifier
- fluent-plugin-rewrite-tag-filter
- fluent-plugin-systemd
- fluent-plugin-oci-logging
Verrazzano Fluentd Dockerイメージには、2つのローカル・デフォルト・プラグインkubernetes_parser
とkubernetes_multiline_parser
もあります。これらのプラグインは、Kubernetes管理ログ・ファイルの解析に役立ちます。
次の例では、これらのプラグインのユースケースを示します:
# ---- fluentd.conf ----
# kubernetes parser
<source>
@type tail
path ./kubelet.log
read_from_head yes
tag kubelet
<parse>
@type multiline_kubernetes
</parse>
</source>
# kubernetes multi-line parser
<source>
@type tail
path ./kubelet.log
read_from_head yes
tag kubelet
<parse>
@type multiline_kubernetes
</parse>
</source>
# ---- EOF ----
Fluentd DaemonSet
Verrazzanoは、verrazzano-system
ネームスペース内のノードごとに1つのFluentdレプリカを実行するFluentd DaemonSetをデプロイします。各インスタンスは、ノードの/var/log/containers
ディレクトリからログを取得し、それをターゲットのOpenSearchデータ・ストリームに書き込みます。Verrazzanoシステム・アプリケーションは、特別な処理を受け取り、ログをverrazzano-system
データ・ストリームに書き込みます。Verrazzanoアプリケーション・ログは、アプリケーションのネームスペースに基づいてデータ・ストリームにエクスポートされます(verrazzano-application-<application namespace>
の形式)。
たとえば、/var/log/containers
に書き込まれたvmi-system-kibana
ログは、Fluentdによって取得され、OpenSearchに書き込まれます。vmi-system-kibana
はVerrazzanoシステム・アプリケーションであるため、ログはverrazzano-system
データ・ストリームにエクスポートされます。システム以外のアプリケーションの場合、それがmyapp
ネームスペースにあれば、ログはverrazzano-application-myapp
データ・ストリームにエクスポートされます。
OpenSearch
Verrazzanoは、Fluentdによって処理されるログの格納および検索エンジンとしてOpenSearchクラスタを作成します。Fluentdによって書き込まれたレコードは、OpenSearch REST APIを使用して問い合せることができます。
たとえば、curl
を使用して、すべてのOpenSearchデータ・ストリームを取得できます。まず、verrazzano
ユーザーのパスワードおよびVerrazzano Monitoring Instance (VMI) OpenSearchのホストを取得する必要があります。
$ PASS=$(kubectl get secret \
--namespace verrazzano-system verrazzano \
-o jsonpath={.data.password} | base64 \
--decode; echo)
$ HOST=$(kubectl get ingress \
-n verrazzano-system vmi-system-es-ingest \
-o jsonpath={.spec.rules[0].host})
$ curl -ik \
--user verrazzano:$PASS https://$HOST/_data_stream
特定のデータ・ストリームのすべてのレコードを表示するには、次のようにします:
$ DATA_STREAM=verrazzano-application-todo-list
$ curl -ik \
--user verrazzano:$PASS https://$HOST/$DATA_STREAM/_search?q=message:*
Verrazzanoは、インストール・プロファイルをサポートしています。デフォルトである本番プロファイル(prod
)は、3ノードのOpenSearchおよびVMI用の永続ストレージを提供します。開発プロファイル(dev
)は、単一ノードのOpenSearchを提供し、VMI用の永続ストレージを提供しません。managed-cluster
プロファイルでは、OpenSearchもOpenSearchダッシュボードもローカル・クラスタにインストールされません。すべてのログは、管理クラスタのOpenSearchインスタンスに転送されます。
ログをデフォルトのVMI OpenSearchではなく外部OpenSearchに送信する場合は、Verrazzanoカスタム・リソースのFluentdコンポーネント構成にopensearchURL
およびopensearchSecret
を指定します。
次に、OpenSearchエンドポイントhttps://external-es.default.172.18.0.231.nip.io
にログを送信するVerrazzanoカスタム・リソースの例を示します。
apiVersion: install.verrazzano.io/v1beta1
kind: Verrazzano
metadata:
name: default
spec:
components:
fluentd:
opensearchURL: https://external-es.default.172.18.0.231.nip.io
opensearchSecret: external-es-secret
OpenSearchダッシュボード
OpenSearchダッシュボードは、OpenSearchクラスタで索引付けされたコンテンツのビジュアライゼーション・ダッシュボードです。Verrazzanoは、OpenSearchで収集されたログ・データを問い合せて視覚化するためのユーザー・インタフェースを提供するOpenSearchダッシュボード・デプロイメントを作成します。
OpenSearchダッシュボードにアクセスするには、「Verrazzanoへのアクセス」を参照してください。
OpenSearchダッシュボードを使用してOpenSearch索引またはデータ・ストリームのレコードを表示するには、索引パターンを作成して、目的のデータ・ストリームまたは索引でレコードをフィルタします。
たとえば、todo-list
ネームスペースにデプロイされたWebLogicアプリケーションのログ・レコードを表示するには、verrazzano-application-todo-*
という索引パターンを作成します。
ログ・ローテーション
索引状態管理(ISM)または定期的なジョブを使用してOpenSearchのログ・ローテーションを構成し、古いレコードのパージまたはスナップショット取得を行うことをお薦めします。OpenSearch ISMの構成の詳細は、ISM設定のページを参照してください。
次の例は、Kubernetes CronJobを使用して実装された、ジョブに基づくログ・ローテーション(ISMを使用しない)の基本的な実装を示しています。ログ・ローテーションの例をクラスタにインストールするには、スニペットをファイルに保存し、次の変更を行います:
OPENSEARCH_HOST
の値を特定のOpenSearch HTTPSエンドポイントに置き換えます。- デフォルトでは、CronJobは過去7日間のデータを削除します。これをカスタマイズするには、ConfigMapの問合せを変更します。
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: log-rotate
namespace: verrazzano-system
labels:
app: log-rotate
spec:
# Rotate logs every day at midnight
schedule: "0 0 * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: log-rotate
annotations:
sidecar.istio.io/inject: "false"
spec:
containers:
- name: log-rotate
args:
- /bin/sh
- -c
- /opt/script/rotate
env:
- name: "OPENSEARCH_HOST"
value: "https://elasticsearch.vmi.system.default.172.18.0.151.nip.io"
- name: OPENSEARCH_USER
valueFrom:
secretKeyRef:
key: username
name: verrazzano
optional: true
- name: OPENSEARCH_PASSWORD
valueFrom:
secretKeyRef:
key: password
name: verrazzano
optional: true
image: ghcr.io/oracle/oraclelinux:7-slim
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /opt/script
name: log-rotate
restartPolicy: OnFailure
volumes:
- configMap:
defaultMode: 0777
name: log-rotate
name: log-rotate
---
apiVersion: v1
kind: ConfigMap
metadata:
name: log-rotate
namespace: verrazzano-system
labels:
app: log-rotate
data:
rotate: |
#!/bin/bash
curl -v --silent -k -u "$OPENSEARCH_USER:$OPENSEARCH_PASSWORD" -X POST "$OPENSEARCH_HOST/verrazzano-*/_delete_by_query" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"filter": [
{
"range": {
"@timestamp": {
"lt": "now-7d"
}
}
}
]
}
}
}
'