• Русский
  • Как архивировать логи во внешнее хранилище

    В настоящее время логи, генерируемые платформой, сохраняются в компоненте хранения логов; однако период их хранения относительно короткий. Для предприятий с высокими требованиями к соответствию нормативам логи обычно требуют более длительного срока хранения для удовлетворения аудиторских требований. Кроме того, экономический аспект хранения также является одним из ключевых факторов для предприятий.

    Исходя из вышеописанных сценариев, платформа предлагает решение для архивирования логов, позволяющее пользователям переносить логи во внешнее NFS или объектное хранилище.

    INFO

    В этом документе описано решение по экспорту или архивированию логов, которое переносит логи из платформы во внешнее хранилище.

    Если вы хотите, чтобы ClickHouse использовал S3 в качестве нативного хранилища логов или холодного хранилища данных, смотрите How to Use S3 Storage with ClickHouse и Installation.

    Перенос во внешнее NFS

    Предварительные требования

    РесурсОписание
    NFSЗаранее настройте сервис NFS и определите путь NFS для монтирования.
    KafkaЗаранее получите адрес сервиса Kafka.
    Адрес образаНеобходимо использовать CLI-инструмент в кластере global для выполнения следующих команд и получения адресов образов:
    - Получить адрес образа alpine: kubectl get daemonset nevermore -n cpaas-system -o jsonpath='{.spec.template.spec.initContainers[0].image}'
    - Получить адрес образа razor: kubectl get deployment razor -n cpaas-system -o jsonpath='{.spec.template.spec.containers[0].image}'

    Создание ресурсов синхронизации логов

    1. В левом навигационном меню выберите Cluster Management > Clusters.

    2. Нажмите кнопку действий справа от кластера, в который будут переноситься логи, и выберите CLI Tool.

    3. Измените YAML согласно описанию параметров ниже; после изменений вставьте код в открывшуюся командную строку CLI Tool и нажмите Enter для выполнения.

      Тип ресурсаПуть поляОписание
      ConfigMapdata.export.yml.output.compressionСжатие текста логов; поддерживаются опции none (без сжатия), zlib, gzip.
      ConfigMapdata.export.yml.output.file_typeТип экспортируемого файла лога; поддерживаются txt, csv, json.
      ConfigMapdata.export.yml.output.max_sizeРазмер одного архивного файла в МБ. Если превышается, логи автоматически сжимаются и архивируются согласно настройке compression.
      ConfigMapdata.export.yml.scopesОбласть переноса логов; поддерживаются системные логи, логи приложений, логи Kubernetes, продуктовые логи.
      Deploymentspec.template.spec.containers[0].command[7]Адрес сервиса Kafka.
      Deploymentspec.template.spec.volumes[3].hostPath.pathПуть NFS для монтирования.
      Deploymentspec.template.spec.initContainers[0].imageАдрес образа alpine.
      Deploymentspec.template.spec.containers[0].imageАдрес образа razor.
      cat << "EOF" |kubectl apply -f -
      apiVersion: v1
      data:
        export.yml: |
          scopes: # Область переноса логов; по умолчанию собираются только логи приложений
            system: false  # Системные логи
            workload: true # Логи приложений
            kubernetes: false # Логи Kubernetes
            platform: false # Продуктовые логи
          output:
            type: local
            path: /cpaas/data/logarchive
            layout: TimePrefixed
            # Размер одного архивного файла в МБ. Если превышается, логи автоматически сжимаются и архивируются согласно настройке compression.
            max_size: 200
            compression: zlib    # Опционально: none (без сжатия) / zlib / gzip
            file_type: txt   # Опционально: txt csv json
      kind: ConfigMap
      metadata:
        name: log-exporter-config
        namespace: cpaas-system
      
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          service_name: log-exporter
        name: log-exporter
        namespace: cpaas-system
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 5
        selector:
          matchLabels:
            service_name: log-exporter
        strategy:
          rollingUpdate:
            maxSurge: 0
            maxUnavailable: 1
          type: RollingUpdate
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: lanaya
              cpaas.io/product: Platform-Center
              service_name: log-exporter
              version: v1
            namespace: cpaas-system
          spec:
            automountServiceAccountToken: true
            affinity:
              podAffinity: {}
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      labelSelector:
                        matchExpressions:
                          - key: service_name
                            operator: In
                            values:
                              - log-exporter
                      topologyKey: kubernetes.io/hostname
                    weight: 50
            initContainers:
              - args:
                  - -ecx
                  - |
                    chown -R 697:697 /cpaas/data/logarchive
                command:
                  - /bin/sh
                image: registry.example.cn:60080/ops/alpine:3.16 # Адрес образа alpine
                imagePullPolicy: IfNotPresent
                name: chown
                resources:
                  limits:
                    cpu: 100m
                    memory: 200Mi
                  requests:
                    cpu: 10m
                    memory: 50Mi
                securityContext:
                  runAsUser: 0
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
                volumeMounts:
                  - mountPath: /cpaas/data/logarchive
                    name: data
            containers:
              - command:
                - /razor
                - consumer
                - --v=1
                - --kafka-group-log=log-nfs
                - --kafka-auth-enabled=true
                - --kafka-tls-enabled=true
                - --kafka-endpoint=192.168.143.120:9092  # Заполните в соответствии с вашей средой
                - --database-type=file
                - --export-config=/etc/log-export/export.yml
                image: registry.example.cn:60080/ait/razor:v3.16.0-beta.3.g3df8e987  # Образ razor
                imagePullPolicy: Always
                livenessProbe:
                  failureThreshold: 5
                  httpGet:
                    path: /metrics
                    port: 8080
                    scheme: HTTP
                  initialDelaySeconds: 20
                  periodSeconds: 10
                  successThreshold: 1
                  timeoutSeconds: 3
                name: log-export
                ports:
                  - containerPort: 80
                    protocol: TCP
                readinessProbe:
                  failureThreshold: 5
                  httpGet:
                    path: /metrics
                    port: 8080
                    scheme: HTTP
                  initialDelaySeconds: 20
                  periodSeconds: 10
                  successThreshold: 1
                  timeoutSeconds: 3
                resources:
                  limits:
                    cpu: "2"
                    memory: 4Gi
                  requests:
                    cpu: 440m
                    memory: 1280Mi
                securityContext:
                  runAsGroup: 697
                  runAsUser: 697
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
                volumeMounts:
                  - mountPath: /etc/secrets/kafka
                    name: kafka-basic-auth
                    readOnly: true
                  - mountPath: /etc/log-export
                    name: config
                    readOnly: true
                  - mountPath: /cpaas/data/logarchive
                    name: data
            dnsPolicy: ClusterFirst
            nodeSelector:
              kubernetes.io/os: linux
            restartPolicy: Always
            schedulerName: default-scheduler
            securityContext:
              fsGroup: 697
            serviceAccount: lanaya
            serviceAccountName: lanaya
            terminationGracePeriodSeconds: 10
            tolerations:
              - effect: NoSchedule
                key: node-role.kubernetes.io/master
                operator: Exists
              - effect: NoSchedule
                key: node-role.kubernetes.io/control-plane
                operator: Exists
              - effect: NoSchedule
                key: node-role.kubernetes.io/cpaas-system
                operator: Exists
            volumes:
              - name: kafka-basic-auth
                secret:
                  defaultMode: 420
                  secretName: kafka-basic-auth
              - name: elasticsearch-basic-auth
                secret:
                  defaultMode: 420
                  secretName: elasticsearch-basic-auth
              - configMap:
                  defaultMode: 420
                  name: log-exporter-config
                name: config
              - hostPath:
                  path: /cpaas/data/logarchive    # Путь NFS для монтирования
                  type: DirectoryOrCreate
                name: data
      EOF
    4. После того как статус контейнера изменится на Running, вы сможете просматривать непрерывно архивируемые логи в пути NFS; структура каталогов файлов логов следующая:

      /cpaas/data/logarchive/$date/$project/$namespace-$cluster/logfile

    Перенос во внешнее S3-хранилище

    Предварительные требования

    РесурсОписание
    S3 StorageЗаранее подготовьте адрес сервиса S3, получите значения access_key_id и secret_access_key; создайте bucket для хранения логов.
    KafkaЗаранее получите адрес сервиса Kafka.
    Адрес образаНеобходимо использовать CLI-инструмент в кластере global для выполнения следующих команд и получения адресов образов:
    - Получить адрес образа alpine: kubectl get daemonset nevermore -n cpaas-system -o jsonpath='{.spec.template.spec.initContainers[0].image}'
    - Получить адрес образа razor: kubectl get deployment razor -n cpaas-system -o jsonpath='{.spec.template.spec.containers[0].image}'

    Создание ресурсов синхронизации логов

    1. В левом навигационном меню выберите Cluster Management > Clusters.

    2. Нажмите кнопку действий справа от кластера, в который будут переноситься логи, и выберите CLI Tool.

    3. Измените YAML согласно описанию параметров ниже; после изменений вставьте код в открывшуюся командную строку CLI Tool и нажмите Enter для выполнения.

      Тип ресурсаПуть поляОписание
      Secretdata.access_key_idBase64-кодированное значение полученного access_key_id.
      Secretdata.secret_access_keyBase64-кодированное значение полученного secret_access_key.
      ConfigMapdata.export.yml.output.compressionСжатие текста логов; поддерживаются опции none (без сжатия), zlib, gzip.
      ConfigMapdata.export.yml.output.file_typeТип экспортируемого файла лога; поддерживаются txt, csv, json.
      ConfigMapdata.export.yml.output.max_sizeРазмер одного архивного файла в МБ. Если превышается, логи автоматически сжимаются и архивируются согласно настройке compression.
      ConfigMapdata.export.yml.scopesОбласть переноса логов; поддерживаются системные логи, логи приложений, логи Kubernetes, продуктовые логи.
      ConfigMapdata.export.yml.output.s3.bucket_nameИмя bucket.
      ConfigMapdata.export.yml.output.s3.endpointАдрес сервиса S3.
      ConfigMapdata.export.yml.output.s3.regionРегион сервиса S3.
      Deploymentspec.template.spec.containers[0].command[7]Адрес сервиса Kafka.
      Deploymentspec.template.spec.volumes[3].hostPath.pathЛокальный путь для монтирования, используется для временного хранения логов. Лог-файлы автоматически удаляются после синхронизации в S3.
      Deploymentspec.template.spec.initContainers[0].imageАдрес образа alpine.
      Deploymentspec.template.spec.containers[0].imageАдрес образа razor.
      cat << "EOF" |kubectl apply -f -
      apiVersion: v1
      type: Opaque
      data:
        # Должны содержаться следующие два ключа
        access_key_id: bWluaW9hZG1pbg==  # Base64-кодированное значение полученного access_key_id
        secret_access_key: bWluaW9hZG1pbg==  # Base64-кодированное значение полученного secret_access_key
      kind: Secret
      metadata:
        name: log-export-s3-secret
        namespace: cpaas-system
      
      ---
      apiVersion: v1
      data:
        export.yml: |
          scopes: # Область переноса логов; по умолчанию собираются только логи приложений
            system: false  # Системные логи
            workload: true # Логи приложений
            kubernetes: false # Логи Kubernetes
            platform: false # Продуктовые логи
          output:
            type: s3
            path: /cpaas/data/logarchive
      
            s3:
              s3forcepathstyle: true
              bucket_name: baucket_name_s3           # Заполните подготовленным именем bucket
              endpoint: http://192.168.179.86:9000   # Заполните подготовленным адресом сервиса S3
              region: "dummy"                        # Информация о регионе
              access_secret: log-export-s3-secret
              insecure: true
      
            layout: TimePrefixed
            # Размер одного архивного файла в МБ. Если превышается, логи автоматически сжимаются и архивируются согласно настройке compression.
            max_size: 200
            compression: zlib                        # Опционально: none (без сжатия) / zlib / gzip
            file_type: txt                           # Опционально: txt, csv, json
      kind: ConfigMap
      metadata:
        name: log-exporter-config
        namespace: cpaas-system
      
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        labels:
          service_name: log-exporter
        name: log-exporter
        namespace: cpaas-system
      spec:
        progressDeadlineSeconds: 600
        replicas: 1
        revisionHistoryLimit: 5
        selector:
          matchLabels:
            service_name: log-exporter
        strategy:
          rollingUpdate:
            maxSurge: 0
            maxUnavailable: 1
          type: RollingUpdate
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: lanaya
              cpaas.io/product: Platform-Center
              service_name: log-exporter
              version: v1
            namespace: cpaas-system
          spec:
            affinity:
              podAffinity: {}
              podAntiAffinity:
                preferredDuringSchedulingIgnoredDuringExecution:
                  - podAffinityTerm:
                      labelSelector:
                        matchExpressions:
                          - key: service_name
                            operator: In
                            values:
                              - log-exporter
                      topologyKey: kubernetes.io/hostname
                    weight: 50
            initContainers:
              - args:
                  - -ecx
                  - |
                    chown -R 697:697 /cpaas/data/logarchive
                command:
                  - /bin/sh
                image: registry.example.cn:60080/ops/alpine:3.16 # Адрес образа alpine
                imagePullPolicy: IfNotPresent
                name: chown
                resources:
                  limits:
                    cpu: 100m
                    memory: 200Mi
                  requests:
                    cpu: 10m
                    memory: 50Mi
                securityContext:
                  runAsUser: 0
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
                volumeMounts:
                  - mountPath: /cpaas/data/logarchive
                    name: data
            containers:
              - command:
                  - /razor
                  - consumer
                  - --v=1
                  - --kafka-group-log=log-s3
                  - --kafka-auth-enabled=true
                  - --kafka-tls-enabled=true
                  - --kafka-endpoint=192.168.179.86:9092  # Заполните адресом Kafka в соответствии с вашей средой
                  - --database-type=file
                  - --export-config=/etc/log-export/export.yml
                image: registry.example.cn:60080/ait/razor:v3.16.0-beta.3.g3df8e987  # Образ razor
                imagePullPolicy: Always
                livenessProbe:
                  failureThreshold: 5
                  httpGet:
                    path: /metrics
                    port: 8080
                    scheme: HTTP
                  initialDelaySeconds: 20
                  periodSeconds: 10
                  successThreshold: 1
                  timeoutSeconds: 3
                name: log-export
                ports:
                  - containerPort: 80
                    protocol: TCP
                readinessProbe:
                  failureThreshold: 5
                  httpGet:
                    path: /metrics
                    port: 8080
                    scheme: HTTP
                  initialDelaySeconds: 20
                  periodSeconds: 10
                  successThreshold: 1
                  timeoutSeconds: 3
                resources:
                  limits:
                    cpu: "2"
                    memory: 4Gi
                  requests:
                    cpu: 440m
                    memory: 1280Mi
                securityContext:
                  runAsGroup: 697
                  runAsUser: 697
                terminationMessagePath: /dev/termination-log
                terminationMessagePolicy: File
                volumeMounts:
                  - mountPath: /etc/secrets/kafka
                    name: kafka-basic-auth
                    readOnly: true
                  - mountPath: /etc/log-export
                    name: config
                    readOnly: true
                  - mountPath: /cpaas/data/logarchive
                    name: data
            dnsPolicy: ClusterFirst
            nodeSelector:
              kubernetes.io/os: linux
            restartPolicy: Always
            schedulerName: default-scheduler
            securityContext:
              fsGroup: 697
            serviceAccount: lanaya
            serviceAccountName: lanaya
            terminationGracePeriodSeconds: 10
            tolerations:
              - effect: NoSchedule
                key: node-role.kubernetes.io/master
                operator: Exists
              - effect: NoSchedule
                key: node-role.kubernetes.io/control-plane
                operator: Exists
              - effect: NoSchedule
                key: node-role.kubernetes.io/cpaas-system
                operator: Exists
            volumes:
              - name: kafka-basic-auth
                secret:
                  defaultMode: 420
                  secretName: kafka-basic-auth
              - name: elasticsearch-basic-auth
                secret:
                  defaultMode: 420
                  secretName: elasticsearch-basic-auth
              - configMap:
                  defaultMode: 420
                  name: log-exporter-config
                name: config
              - hostPath:
                  path: /cpaas/data/logarchive    # Локальный временный путь для хранения логов
                  type: DirectoryOrCreate
                name: data
      EOF
    4. После того как статус контейнера изменится на Running, вы сможете просматривать непрерывно архивируемые логи в bucket.