ロギング
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 pluginsフォルダを参照してください。
Fluentd DaemonSet
Verrazzanoは、verrazzano-system
ネームスペース内のノードごとに1つのFluentdレプリカを実行するFluentd DaemonSetをデプロイします。各インスタンスは、ノードの/var/log/containers
ディレクトリからログを取得し、それをターゲットのOpenSearch索引に書き込みます。索引名は、レコードに関連付けられているネームスペースに基づき、verrazzano-namespace-<record namespace>
という形式が使用されます。
たとえば、/var/log/containers
に書き込まれたvmi-system-kibana
ログは、Fluentdによって取得され、OpenSearchに書き込まれます。VMIはverrazzano-system
ネームスペースで実行されるため、使用される索引はverrazzano-namespace-verrazzano-system
という名前になります。
システム・ログとアプリケーション・ログの両方に同じアプローチが使用されます。
OpenSearch
Verrazzanoは、Fluentdによって処理されるログの格納および検索エンジンとしてOpenSearchデプロイメントを作成します。Fluentdによって書き込まれたレコードは、OpenSearch REST APIを使用して問い合せることができます。
たとえば、curl
を使用して、すべてのOpenSearch索引を取得できます。まず、verrazzano
ユーザーのパスワードおよび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/_cat/indices
特定の索引のすべてのレコードを表示するには、次のようにします:
$ INDEX=verrazzano-namespace-todo-list
$ curl -ik \
--user verrazzano:$PASS https://$HOST/$INDEX/_doc/_search?q=message:*
Verrazzanoは、インストール・プロファイルをサポートしています。本番プロファイル(prod
)はデフォルト・プロファイルで、3ノードのOpenSearchおよびVerrazzano Monitoring Instance (VMI)用の永続ストレージを提供します。開発プロファイル(dev
)は、単一ノードのOpenSearchを提供し、VMI用の永続ストレージを提供しません。managed-cluster
プロファイルでは、OpenSearchもOpenSearchダッシュボードもローカル・クラスタにインストールされません。すべてのログは、管理クラスタのOpenSearchインスタンスに転送されます。
ログをデフォルトのVMI OpenSearchではなく外部OpenSearchに送信する場合は、Verrazzanoカスタム・リソースのFluentdコンポーネント構成にelasticsearchURL
およびelasticsearchSecret
を指定します。
次に、OpenSearchエンドポイントhttps://external-es.default.172.18.0.231.nip.io
にログを送信するVerrazzanoカスタム・リソースの例を示します。
apiVersion: install.verrazzano.io/v1alpha1
kind: Verrazzano
metadata:
name: default
spec:
components:
fluentd:
elasticsearchURL: https://external-es.default.172.18.0.231.nip.io
elasticsearchSecret: external-es-secret
OpenSearchダッシュボード
OpenSearchダッシュボードは、OpenSearchクラスタで索引付けされたコンテンツのビジュアライゼーション・ダッシュボードです。Verrazzanoは、OpenSearchで収集されたログ・データを問い合せて視覚化するためのユーザー・インタフェースを提供するOpenSearchダッシュボード・デプロイメントを作成します。
OpenSearchダッシュボード・コンソールにアクセスするには、「Verrazzanoへのアクセス」を参照してください。
OpenSearchダッシュボードを使用してOpenSearch索引のレコードを表示するには、索引パターンを作成して、目的の索引でレコードをフィルタします。
たとえば、todo-list
ネームスペースにデプロイされたWebLogicアプリケーションのログ・レコードを表示するには、verrazzano-namespace-todo-*
という索引パターンを作成します。
ログ・ローテーション
定期的なジョブを使用してOpenSearchのログ・ローテーションを構成し、古いレコードのパージまたはスナップショット取得を行うことをお薦めします。次の例は、Kubernetes CronJobを使用して実装されたログ・ローテーションの基本的な実装を示しています。ログ・ローテーションの例をクラスタにインストールするには、スニペットをファイルに保存し、次の変更を行います:
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"
}
}
}
]
}
}
}
'