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

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

Исходя из вышеописанных сценариев, платформа предлагает решение для архивирования логов, позволяющее пользователям переносить логи во внешнее 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Размер одного архивного файла в МБ. При превышении этого значения логи автоматически сжимаются и архивируются согласно настройке 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:
          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Размер одного архивного файла в МБ. При превышении этого значения логи автоматически сжимаются и архивируются согласно настройке compression.
    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
          # Размер одного архивного файла в МБ. При превышении этого значения логи автоматически сжимаются и архивируются согласно настройке 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, вы сможете просматривать непрерывно архивируемые логи в бакете.