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

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

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

    Содержание

    Перенос во внешнее 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Размер одного архивного файла в МБ. Если превышается, логи автоматически сжимаются и архивируются согласно настройкам сжатия.
      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
            # Размер одного архивного файла в МБ. Если превышается, логи автоматически сжимаются и архивируются согласно настройкам сжатия.
            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; создайте бакет для хранения логов.
    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Размер одного архивного файла в МБ. Если превышается, логи автоматически сжимаются и архивируются согласно настройкам сжатия.
      ConfigMapdata.export.yml.scopesОбласть переноса логов; в настоящее время поддерживаются: системные логи, логи приложений, логи Kubernetes, продуктовые логи.
      ConfigMapdata.export.yml.output.s3.bucket_nameИмя бакета.
      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           # Заполните подготовленным именем бакета
              endpoint: http://192.168.179.86:9000   # Заполните подготовленным адресом сервиса S3-хранилища
              region: "dummy"                        # Информация о регионе
              access_secret: log-export-s3-secret
              insecure: true
      
            layout: TimePrefixed
            # Размер одного архивного файла в МБ. Если превышается, логи автоматически сжимаются и архивируются согласно настройкам сжатия.
            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, вы сможете просматривать непрерывно архивируемые логи в бакете.