7 로깅

Oracle Cloud Infrastructure(OCI) 또는 외부 도구를 사용하여 Oracle Blockchain Platform Enterprise Edition에 대한 영구 로깅을 구성할 수 있습니다.

개요

Oracle Blockchain Platform Enterprise Edition은 로그가 각 포드에 로컬로 저장되는 Kubernetes를 기반으로 합니다. Pod가 삭제될 때 로그가 삭제되지 않도록 하려면 로그가 중앙 위치에 저장되는 영구 로깅을 설정해야 합니다. 지속 로깅에는 두 가지 방법을 사용할 수 있습니다. Fluentd 및 Elastic Stack과 같은 외부 로깅 도구를 사용할 수 있습니다. 또는 Oracle Kubernetes Engine에서 실행 중인 경우 OCI(Oracle Cloud Infrastructure)에서 지원하는 중앙 집중식 로깅 솔루션을 사용할 수 있습니다.

OCI를 사용한 영구 로깅

OCI를 사용하여 로그를 중앙에 저장하려면 로그 그룹을 정의하고 로그를 구문 분석하도록 에이전트를 구성합니다. 로그는 오브젝트 스토리지 서비스에 저장됩니다. OCI로 영구 로깅을 구성하기 전에 배치가 다음 요구사항을 충족해야 합니다.
  • Kubernetes 컴파트먼트의 동적 그룹입니다. 동적 그룹을 생성하려면 탐색 메뉴에서 ID 및 보안을 누릅니다. ID에서 도메인, 동적 그룹 생성 순으로 누릅니다. 컴파트먼트에 대해 Oracle Cloud ID를 대체하여 일치 규칙 섹션에서 동적 그룹에 다음을 추가합니다.
    instance.compartment.id = '<compartment_ocid>'
    예:
    instance.compartment.id = 'ocid1.compartment.oc1..aaaaaaaa4ws3242343243244nyb423432rwqsxigt2sia'
  • 동적 그룹이 로깅 서비스와 상호 작용할 수 있도록 허용하는 정책입니다. 정책을 생성하려면 탐색 메뉴에서 ID 및 보안을 누릅니다. ID에서 정책, 정책 생성 순으로 누릅니다.
    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. 왼쪽 위에 있는 메뉴 아이콘을 누르고 log를 검색한 다음 Logs를 선택합니다.
  2. 로그 그룹 생성. 로깅에서 로그 그룹을 선택한 다음 로그 그룹 생성을 누릅니다.
  3. 사용자정의 로그를 생성합니다. 로깅에서 로그를 선택한 다음 사용자정의 로그 생성을 눌러 사용자정의 로그 생성 마법사를 엽니다. 이전에 생성한 로그 그룹을 선택합니다.
  4. 사용자정의 로그 생성 마법사의 두번째 페이지에서 Kubernetes 컴파트먼트 및 동적 그룹을 지정하여 사용자정의 로그에 대한 에이전트 구성을 생성합니다.
  5. 에이전트 구성 페이지의 로그 입력 구성 섹션에서 애플리케이션 컨테이너의 기본값인 다음 파일 경로를 사용하도록 에이전트에 대한 로그 입력을 구성합니다. 입력 유형 목록에서 로그 경로를 선택합니다. 파일 경로에 대해 다음 파일 경로를 입력합니다. 이 경로에는 시스템 및 서비스 컨테이너를 포함한 모든 컨테이너 로그가 포함됩니다.
    /var/log/pods/*/*/*.log
  6. 로그가 수집될 때까지 기다립니다. 일반적으로 로그는 3-5분 내에 수집됩니다.
  7. 로그를 선택한 다음 사용자정의 로그로 이동하고 로그 탐색을 누릅니다. 로그를 분석, 구문 분석 및 필터링할 수 있습니다.
  8. OCI를 사용하여 오브젝트 스토리지 서비스에 로그를 저장할 수도 있습니다.
    1. 커넥터 생성. 로깅에서 커넥터를 선택한 다음 커넥터 생성을 누릅니다. 소스로깅을 선택하고 오브젝트 스토리지대상으로 선택합니다.
    2. 필요에 따라 소스 및 대상을 구성합니다.
    3. 로그 사용 섹션에서 생성한 커넥터에 대해 로그 사용사용으로 설정합니다. Create Log 패널이 로그 보존 시간에 대한 기본값과 함께 표시됩니다.
    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 파일을 명령과 함께 사용합니다.
    다음 파일에서 숫자 기호(#)를 제거하여 다음 행 중 하나만 주석 처리 해제합니다.
    • /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 Pod 또는 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 디렉토리에 표시됩니다.

운영자 Pod에 대한 로그 레벨 설정

hlf-operatorobp-operator 포드의 로그 레벨을 설정할 수 있습니다. 로그 레벨 설정 단계는 Oracle Blockchain Platform 설치 여부에 따라 다릅니다. Oracle Blockchain Platform Enterprise Edition이 아직 설치되지 않은 경우 다음 단계를 완료합니다.

  1. 편집을 위해 해당 deployment.yaml 파일을 엽니다. hlf-operator Pod에 대한 파일은 다음 위치에 있습니다.
    distribution_package_location/distribution-package/operators/helmcharts/hlf-operator/templates/deployment.yaml
    obp-operator Pod에 대한 파일은 다음 위치에 있습니다.
    distribution_package_location/distribution-package/operators/helmcharts/obp-operator/templates/deployment.yaml
  2. 파일에 다음 라인을 추가합니다. 설명에 표시된 대로 로그 레벨을 debug, info 또는 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-operatorobp-operator 포드에 대한 배치 정의를 편집할 수 있습니다. Pod 템플리트 사양에서 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