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

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

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

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

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

    РесурсОписание
    NFSЗаранее настроить сервис NFS и определить путь NFS для монтирования.
    KafkaЗаранее получить адрес сервиса Kafka.
    Image AddressНеобходимо использовать 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; создать бакет, в котором будут храниться логи.
    KafkaЗаранее получить адрес сервиса Kafka.
    Image AddressНеобходимо использовать 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, вы сможете просматривать непрерывно архивируемые логи в бакете.