7 ロギング

Oracle Cloud Infrastructure (OCI)または外部ツールを使用して、Oracle Blockchain Platform Enterprise Editionの永続ロギングを構成できます。

概要

Oracle Blockchain Platform Enterprise Editionは、ログが各ポッドにローカルに格納されるKubernetesに基づいています。ポッドの削除時にログが削除されないようにするには、ログが中央の場所に格納される永続ロギングを設定する必要があります。永続ロギングには2つの方法があります。FluentdやElastic Stackなどの外部ロギング・ツールを使用できます。または、Oracle Kubernetes Engineで実行している場合は、Oracle Cloud Infrastructure (OCI)でサポートされている一元化されたロギング・ソリューションを使用できます。

OCIによる永続ロギング

OCIを使用してログを一元的に格納するには、ログ・グループを定義し、ログを解析するようにエージェントを構成します。ログは、オブジェクト・ストレージ・サービスに格納されます。OCIで永続ロギングを構成する前に、デプロイメントは次の要件を満たす必要があります。
  • Kubernetesコンパートメント内の動的グループ。動的グループを作成するには、ナビゲーション・メニューで「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ドメイン」「動的グループの作成」の順にクリックします。「一致ルール」セクションで、コンパートメントにOracle Cloud IDを置き換えて、動的グループに次のものを追加します。
    instance.compartment.id = '<compartment_ocid>'
    たとえば次のようにします。
    instance.compartment.id = 'ocid1.compartment.oc1..aaaaaaaa4ws3242343243244nyb423432rwqsxigt2sia'
  • 動的グループがロギング・サービスと対話できるようにするポリシー。ポリシーを作成するには、ナビゲーション・メニューで「アイデンティティとセキュリティ」をクリックします。「アイデンティティ」で、「ポリシー」「ポリシーの作成」の順にクリックします。
    Allow dynamic-group <my-group> to use log-content in compartment <target_compartment_name>
    たとえば次のようにします。
    Allow dynamic-group okelogging to use log-content in compartment BlockchainTeam
前提条件を満たしたら、次のステップを実行して、OCIを使用してログを一元的に格納します。
  1. 左上隅のメニュー・アイコンをクリックし、「ログ」を検索して「ログ」を選択します。
  2. ログ・グループを作成します。「ロギング」で、「ログ・グループ」「ログ・グループの作成」の順に選択します。
  3. カスタム・ログを作成します。「ロギング」で、「ログ」を選択し、「カスタム・ログの作成」をクリックして「カスタム・ログの作成」ウィザードを開きます。以前に作成したログ・グループを選択します。
  4. カスタム・ログの作成ウィザードの2番目のページで、Kubernetesコンパートメントと動的グループを指定して、カスタム・ログのエージェント構成を作成します。
  5. 「エージェント構成」ページの「ログ入力の構成」セクションで、アプリケーション・コンテナのデフォルトである次のファイル・パスを使用するようにエージェントのログ入力を構成します。「入力タイプ」リストから「ログ・パス」を選択します。「ファイル・パス」に次のファイル・パスを入力します。このパスには、システム・コンテナおよびサービス・コンテナを含むすべてのコンテナ・ログが含まれます。
    /var/log/pods/*/*/*.log
  6. ログが取り込まれるまで待ちます。通常、ログは3~5分で取り込まれます。
  7. 「ログ」を選択し、カスタム・ログに移動して「ログの探索」をクリックします。ログを分析、解析およびフィルタできます。
  8. OCIを使用して、ログをObject Storageサービスに格納することもできます。
    1. コネクタの作成「ロギング」で、「コネクタ」を選択し、「コネクタの作成」をクリックします。「ソース」として「ロギング」を選択し、「ターゲット」として「オブジェクト・ストレージ」を選択します。
    2. 必要に応じて、ソースおよびターゲットを構成します。
    3. 「ログの有効化」セクションで、作成したコネクタの「ログの有効化」「有効」に設定します。「ログの作成」パネルが表示され、ログ保持時間のデフォルト値が表示されます。
    4. ログが取り込まれるまで待ちます。通常、ログは3~5分で取り込まれます。その後、コネクタ・ログで読取りおよび書込み操作を確認できます。ログはオブジェクト・ストレージ・サービスに書き込まれています。

詳細は、OCI Logging Analyticsを使用したKubernetesおよびOKEクラスタのモニターを参照してください。

外部ツールを使用した永続ロギング

FluentdおよびElastic Stackを使用して、ログを一元的に格納できます。次のステップは、Fluentd v1.16.2およびElasticsearch 7.9.1でテストされています。これらのステップを完了するときは、これらのバージョン以降を使用します。
  1. fluentdというKubernetesネームスペースを作成します。
  2. 次のコマンドを使用して、ロールベースのアクセス制御リソースを作成します。
    kubectl create -f fluentd-rbac.yaml -n fluentd
    コマンドで次のfluentd-rbac.yamlファイルを使用します。
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: fluentd
      namespace: fluentd
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: fluentd
      namespace: fluentd
    rules:
    - apiGroups:
      - ""
      resources:
      - pods
      - namespaces
      verbs:
      - get
      - list
      - watch
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      name: fluentd
    roleRef:
      kind: ClusterRole
      name: fluentd
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      name: fluentd
      namespace: fluentd
  3. 次のコマンドを使用して、FluentdまたはElastic StackのConfigMapオブジェクトを作成します。
    kubectl create -f fluentd-configmap_removefilter_ascii.yaml -n fluentd
    コマンドで次のfluentd-configmap_removefilter_ascii.yamlファイルを使用します。
    次のファイルで、数字記号(#)を削除して、次の行の1つのみをコメント解除します。
    • /tmp/obp.logパスのファイルに書き込む場合は、@include file-fluent.confのコメントを解除します。
    • Elasticsearchに書き込む場合は、@include elastic-fluent.confのコメントを解除します。
    次のファイルは、/tmp/obp.logパスへの書込みの例を示しています。
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: fluentd-config
      namespace: fluentd
    data:
      fluent.conf: |-
        ################################################################
        # This source gets all logs from local docker host
        #@include pods-kind-fluent.conf
        #@include pods-fluent.conf
        @include pods-nofilter.conf
        @include file-fluent.conf
        #@include elastic-fluent.conf
      pods-nofilter.conf: |-
        <source>
          @type tail
          path /var/log/containers/*.log
          format //^(?<time>.+) (?<stream>stdout|stderr) (?<logtag>.)? (?<log>.*)$/ /
          pos_file /var/log/fluentd-containers.log.pos
          tag kubernetes.*
          read_from_head true
        </source>
        <filter kubernetes.**>
         @type kubernetes_metadata
        </filter>
      file-fluent.conf: |-
         <match kubernetes.var.log.containers.**fluentd**.log>
          @type null
         </match>
         <match kubernetes.var.log.containers.**kube-system**.log>
           @type null
         </match>
         <match kubernetes.**>
           @type file
           path /tmp/obp.log
         </match>
      elastic-fluent.conf: |-
        <match kubernetes.var.log.containers.**fluentd**.log>
          @type null
        </match>
        <match kubernetes.var.log.containers.**kube-system**.log>
          @type null
        </match>
        <match kubernetes.**>
          @type elasticsearch
          host "#{ENV['FLUENT_ELASTICSEARCH_HOST'] || 'elasticsearch.elastic-kibana'}"
          port "#{ENV['FLUENT_ELASTICSEARCH_PORT'] || '9200'}"
          index_name fluentd-k8s-3
          type_name fluentd
          include_timestamp true
        </match>
  4. 次のコマンドを使用して、FluentdのDaemonSetオブジェクトを作成します。このコマンドは、各ノードにFluentdポッドを作成します。
    kubectl create -f fluentd.yaml -n fluentd
    次のfluentd.yamlファイルをコマンドとともに使用します。
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentd
      namespace: fluentd
      labels:
        k8s-app: fluentd-logging
        version: v1
    spec:
      selector:
        matchLabels:
          k8s-app: fluentd-logging
          version: v1
      template:
        metadata:
          labels:
            k8s-app: fluentd-logging
            version: v1
        spec:
          serviceAccount: fluentd
          serviceAccountName: fluentd
          tolerations:
          - key: node-role.kubernetes.io/master
            effect: NoSchedule
          - key: node-role.kubernetes.io/control-plane
            effect: NoSchedule 
          containers:
          - name: fluentd1
            imagePullPolicy: "Always"
            image: fluent/fluentd-kubernetes-daemonset:v1.16.2-debian-elasticsearch7-1.1
            env:
              - name:  FLUENT_ELASTICSEARCH_HOST
                value: "elasticsearch.elastic-kibana"
              - name:  FLUENT_ELASTICSEARCH_PORT
                value: "9200"
            resources:
              limits:
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
            volumeMounts:
            - name: fluentd-config
              mountPath: /fluentd/etc
            - name: logs
              mountPath: /tmp
            - name: varlog
              mountPath: /var/log
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
          terminationGracePeriodSeconds: 30
          volumes:
          - name: fluentd-config
            configMap:
              name: fluentd-config
          - name: varlog
            hostPath:
              path: /var/log
          - name: varlibdockercontainers
            hostPath:
              path: /var/lib/docker/containers
          - name: logs
            hostPath:
              path: /tmp
    Oracle Blockchain Platformログは、FluentdポッドまたはKubernetesノードの/tmpディレクトリにあります。
  5. Elastic Stackにログを送信するには、elastic-kibanaというKubernetesネームスペースを作成します。
  6. 次のコマンドを使用して、Elastic Stackのデプロイメントを作成し、それをサービスとして公開します。
    kubectl create -f elastic.yaml -n elastic-kibana
    次のelastic.yamlファイルをコマンドとともに使用します。
    apiVersion: v1
    kind: Namespace
    metadata:
      name: elastic-kibana
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: elasticsearch
      namespace: elastic-kibana
      labels:
        app: elasticsearch
    spec:
      selector:
        matchLabels:
          app: elasticsearch
      replicas: 1
      template:
        metadata:
          labels:
            app: elasticsearch
        spec:
          initContainers:
          - name: vm-max-fix
            image: busybox
            command: ["sysctl", "-w", "vm.max_map_count=262144"]
            securityContext:
              privileged: true
          containers:
          - name: elasticsearch
            image: elasticsearch:7.9.1
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9200
            env:
            - name: node.name
              value: "elasticsearch"
            - name: cluster.initial_master_nodes
              value: "elasticsearch"
            - name: bootstrap.memory_lock
              value: "false"
            - name: ES_JAVA_OPTS
              value: "-Xms512m -Xmx512m"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: elasticsearch
      namespace: elastic-kibana
      labels:
        app: elasticsearch
    spec:
      type: ClusterIP
      selector:
        app: elasticsearch
      ports:
        - protocol: TCP
          name: http
          port: 9200
          targetPort: 9200
  7. その後、次のコマンドを使用して、Elasticsearch索引のログ・データを調べることができます。
    curl -X GET "localhost:9200/_cat/indices/fluentd-k8s-*?v=true&s=index&pretty"
    curl -X GET "localhost:9200/fluentd-k8s-3/_search?pretty=true"
  8. Fluentdを使用して、各ノードのローカル・ブロック・ボリュームにログを格納することもできます。
    1. ノードごとにブロック・ボリュームを作成し、ボリュームをアタッチして、/u01というディレクトリを作成します。
    2. ext4ファイル・システムのアタッチされたブロック・ボリュームをフォーマットします。
    3. デバイス・パスに/u01ディレクトリをマウントします。
    4. 次のスニペットに示すように、ログ・ボリュームが/tmpではなく/u01になるように、Fluentdデプロイメント・ファイル(fluentd.yaml)を変更します。
      - name: logs
              hostPath:
                path: /u01
    5. 次のコマンドを実行して、Fluentdデプロイメントを適用します。
      kubectl apply -f fluentd.yaml -n fluentd
    6. これで、ログは各ノードの/u01ディレクトリに表示されます。

オペレータ・ポッドのログ・レベルの設定

hlf-operatorおよびobp-operatorポッドのログ・レベルを設定できます。ログ・レベルを設定するステップは、Oracle Blockchain Platformがインストールされているかどうかによって異なります。Oracle Blockchain Platform Enterprise Editionがまだインストールされていない場合は、次のステップを実行します。

  1. 対応するdeployment.yamlファイルを編集用に開きます。hlf-operatorポッドのファイルは、次の場所にあります。
    distribution_package_location/distribution-package/operators/helmcharts/hlf-operator/templates/deployment.yaml
    obp-operatorポッドのファイルは、次の場所にあります。
    distribution_package_location/distribution-package/operators/helmcharts/obp-operator/templates/deployment.yaml
  2. ファイルに次の行を追加します。コメントに示すように、ログ・レベルをdebuginfoまたはerrorに設定できます。次の例では、ログ・レベルがinfoに設定されます。
    --zap-log-level=info # debug, info, error
ファイルの編集後、ファイルのそのセクションは次のようになります。
containers:
    - args:
    - --enable-leader-election
    - --zap-log-level=info # debug, info, error

Oracle Blockchain Platformがすでにインストールされている場合は、次のステップを実行します。

  • 次のコマンドを使用して、hlf-operatorおよびobp-operatorポッドのデプロイメント定義を編集します。ポッド・テンプレート仕様で、managerコンテナのログ・レベルを構成する引数を追加または更新します。
    kubectl edit deployment -n obp-cp obp-operator
    kubectl edit deployment -n obp-cp hlf-operator-controller-manager
コンテナ引数を更新すると、デプロイメント定義は次のようになります。
containers:
    - args:
    - --enable-leader-election
    - --zap-log-level=info # debug, info, error