7 Registro

Puede utilizar Oracle Cloud Infrastructure (OCI) o herramientas externas para configurar el registro persistente para Oracle Blockchain Platform Enterprise Edition.

Descripción general

Oracle Blockchain Platform Enterprise Edition se basa en Kubernetes, donde los logs se almacenan localmente en cada pod. Para evitar que se supriman logs cuando se suprime un pod, debe configurar el registro persistente, donde los logs se almacenan en una ubicación central. Hay dos métodos que puede utilizar para el registro persistente. Puede utilizar una herramienta de registro externa, como Fluentd y Elastic Stack. Como alternativa, si se ejecuta en Oracle Kubernetes Engine, puede utilizar la solución de registro centralizado soportada por Oracle Cloud Infrastructure (OCI).

Registro persistente con OCI

Para almacenar logs de forma centralizada mediante OCI, defina grupos de logs y configure agentes para analizar los logs. Los logs se almacenan en el servicio Object Storage. Antes de configurar el registro persistente con OCI, el despliegue debe cumplir los siguientes requisitos.
  • Grupo dinámico en el compartimento de Kubernetes. Para crear un grupo dinámico, haga clic en Identity & Security en el menú de navegación. En Identidad, haga clic en Dominios y, a continuación, en Crear grupo dinámico. Agregue lo siguiente al grupo dinámico en la sección Reglas de coincidencia, sustituyendo el ID de Oracle Cloud por el compartimento.
    instance.compartment.id = '<compartment_ocid>'
    Por ejemplo:
    instance.compartment.id = 'ocid1.compartment.oc1..aaaaaaaa4ws3242343243244nyb423432rwqsxigt2sia'
  • Política que permite al grupo dinámico interactuar con el servicio de registro. Para crear una política, haga clic en Identidad y seguridad en el menú de navegación. En Identidad, haga clic en Políticas y, a continuación, en Crear política.
    Allow dynamic-group <my-group> to use log-content in compartment <target_compartment_name>
    Por ejemplo:
    Allow dynamic-group okelogging to use log-content in compartment BlockchainTeam
Una vez que haya cumplido los requisitos, complete los siguientes pasos para almacenar logs de forma centralizada mediante OCI.
  1. Haga clic en el icono de menú de la esquina superior izquierda, busque log y, a continuación, seleccione Logs.
  2. Crear un grupo de logs. En Registro, seleccione Grupos de logs y, a continuación, haga clic en Crear grupo de logs.
  3. Cree un log personalizado. En Registro, seleccione Logs y, a continuación, haga clic en Crear log personalizado para abrir el asistente Crear log personalizado. Seleccione el grupo de logs que ha creado anteriormente.
  4. En la segunda página del asistente Crear log personalizado, cree una configuración de agente para el log personalizado, especificando el compartimento de Kubernetes y el grupo dinámico.
  5. En la sección Configurar Entradas de Log de la página Configuración de Agente, configure la entrada de log para que el agente utilice la siguiente ruta de archivo, que es el valor por defecto para los contenedores de aplicación. Seleccione Ruta de log en la lista Tipo de entrada. Introduzca la siguiente ruta de acceso para Rutas de acceso de archivo. Esta ruta incluye todos los logs de contenedor, incluidos los contenedores del sistema y de servicio.
    /var/log/pods/*/*/*.log
  6. Espere hasta que se ingieran los logs. Normalmente, los logs se ingieren en 3-5 minutos.
  7. Seleccione Logs y, a continuación, navegue al log personalizado y haga clic en Explorar log. Puede analizar, analizar y filtrar los logs.
  8. También puede utilizar OCI para almacenar los logs en el servicio Object Storage.
    1. Crear Conector. En Registro, seleccione Conectores y, a continuación, haga clic en Crear conector. Seleccione Registro como Origen y Almacenamiento de objetos como Destino.
    2. Configure el origen y el destino según sea necesario.
    3. En la sección Activar logs, defina Activar log en Activado para el conector que ha creado. Se muestra el panel Crear log, con un valor por defecto para el tiempo de retención de log.
    4. Espere hasta que se ingieran los logs. Normalmente, los logs se ingieren en 3-5 minutos. A continuación, puede ver las operaciones de lectura y escritura en los logs del conector. Los logs se están escribiendo en el servicio Object Storage.

Para obtener más información, consulte Supervisión de clusters de Kubernetes y OKE con OCI Logging Analytics.

Registro persistente con herramientas externas

Puede almacenar logs de forma centralizada mediante Fluentd y Elastic Stack. Los siguientes pasos se han probado con Fluentd v1.16.2 y Elasticsearch 7.9.1. Utilice estas versiones o versiones posteriores cuando complete estos pasos.
  1. Cree un espacio de nombres de Kubernetes denominado fluentd.
  2. Utilice el siguiente comando para crear un recurso de control de acceso basado en roles.
    kubectl create -f fluentd-rbac.yaml -n fluentd
    Utilice el siguiente archivo fluentd-rbac.yaml con el comando.
    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. Utilice el siguiente comando para crear un objeto ConfigMap para Fluentd o Elastic Stack.
    kubectl create -f fluentd-configmap_removefilter_ascii.yaml -n fluentd
    Utilice el siguiente archivo fluentd-configmap_removefilter_ascii.yaml con el comando.
    En el siguiente archivo, elimine el signo de número (#) para quitar el comentario de solo una de las siguientes líneas.
    • Elimine el comentario de @include file-fluent.conf si está escribiendo en un archivo en la ruta de acceso /tmp/obp.log.
    • Elimine el comentario de @include elastic-fluent.conf si está escribiendo en Elasticsearch.
    El siguiente archivo muestra un ejemplo de escritura en la ruta de acceso /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. Utilice el siguiente comando para crear un objeto DaemonSet para Fluentd. Este comando crea un pod Fluentd en cada nodo.
    kubectl create -f fluentd.yaml -n fluentd
    Utilice el siguiente archivo fluentd.yaml con el comando.
    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
    Los logs de Oracle Blockchain Platform están disponibles en el directorio /tmp del pod Fluentd o en el nodo de Kubernetes.
  5. Para enviar los logs a Elastic Stack, cree un espacio de nombres de Kubernetes denominado elastic-kibana.
  6. Utilice el siguiente comando para crear un despliegue para Elastic Stack y exponerlo como un servicio.
    kubectl create -f elastic.yaml -n elastic-kibana
    Utilice el siguiente archivo elastic.yaml con el comando.
    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. A continuación, puede utilizar los siguientes comandos para examinar los datos de log en el índice de 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. También puede utilizar Fluentd para almacenar el log en el volumen en bloque local en cada nodo.
    1. Cree un volumen en bloque para cada nodo, asocie el volumen y cree un directorio denominado /u01.
    2. Formatear el volumen en bloque asociado para el sistema de archivos ext4.
    3. Monte el directorio /u01 en la ruta del dispositivo.
    4. Cambie el archivo de despliegue de Fluentd (fluentd.yaml) para que el volumen de logs sea /u01, no /tmp, como se muestra en el siguiente fragmento.
      - name: logs
              hostPath:
                path: /u01
    5. Ejecute el siguiente comando para aplicar el despliegue de Fluentd.
      kubectl apply -f fluentd.yaml -n fluentd
    6. Los logs ahora están visibles en el directorio /u01 de cada nodo.

Definición del nivel de log para pods de operador

Puede definir el nivel de log para los pods hlf-operator y obp-operator. Los pasos para definir el nivel de log son diferentes en función de si Oracle Blockchain Platform está instalado. Si Oracle Blockchain Platform Enterprise Edition aún no está instalado, realice los siguientes pasos.

  1. Abra el archivo deployment.yaml correspondiente para editar. El archivo para el pod hlf-operator se encuentra en la siguiente ubicación:
    distribution_package_location/distribution-package/operators/helmcharts/hlf-operator/templates/deployment.yaml
    El archivo para el pod obp-operator se encuentra en la siguiente ubicación:
    distribution_package_location/distribution-package/operators/helmcharts/obp-operator/templates/deployment.yaml
  2. Agregue la siguiente línea al archivo. Como se muestra en el comentario, puede definir el nivel de log en debug, info o error. En el siguiente ejemplo, el nivel de log se define en info.
    --zap-log-level=info # debug, info, error
Después de editar el archivo, esa sección del archivo puede tener un aspecto similar al siguiente texto:
containers:
    - args:
    - --enable-leader-election
    - --zap-log-level=info # debug, info, error

Si Oracle Blockchain Platform ya está instalado, complete el siguiente paso.

  • Utilice los siguientes comandos para editar las definiciones de despliegue para los pods hlf-operator y obp-operator. Agregue o actualice el argumento que configura el nivel de log para el contenedor manager en la especificación de plantilla de pod.
    kubectl edit deployment -n obp-cp obp-operator
    kubectl edit deployment -n obp-cp hlf-operator-controller-manager
Después de actualizar los argumentos de contenedor, la definición de despliegue puede tener un aspecto similar al siguiente texto:
containers:
    - args:
    - --enable-leader-election
    - --zap-log-level=info # debug, info, error