ロギング

Verrazzanoのログの収集および表示の詳細

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イメージには、次のプラグインが付属しています:

Verrazzano Fluentd Dockerイメージには、2つのローカル・デフォルト・プラグインkubernetes_parserkubernetes_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ダッシュボード

ログ・ローテーション

定期的なジョブを使用して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"
                }
              }
            }
          ]
        }
      }
    }
    '