#Как архивировать логи во внешнее хранилище
В настоящее время логи, генерируемые платформой, сохраняются в компоненте хранения логов; однако период их хранения относительно короткий. Для предприятий с высокими требованиями к соответствию нормативам логи обычно требуют более длительного срока хранения для удовлетворения аудиторских требований. Кроме того, экономический аспект хранения также является одним из ключевых факторов для предприятий.
Исходя из вышеописанных сценариев, платформа предлагает решение для архивирования логов, позволяющее пользователям переносить логи во внешнее NFS или объектное хранилище.
В этом документе описано решение по экспорту или архивированию логов, которое переносит логи из платформы во внешнее хранилище.
Если вы хотите, чтобы ClickHouse использовал S3 в качестве нативного хранилища логов или холодного хранилища данных, смотрите How to Use S3 Storage with ClickHouse и Installation.
#Содержание
Перенос во внешнее NFSПредварительные требованияСоздание ресурсов синхронизации логовПеренос во внешнее S3-хранилищеПредварительные требованияСоздание ресурсов синхронизации логов#Перенос во внешнее 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}' |
#Создание ресурсов синхронизации логов
-
В левом навигационном меню выберите Cluster Management > Clusters.
-
Нажмите кнопку действий справа от кластера, в который будут переноситься логи, и выберите CLI Tool.
-
Измените YAML согласно описанию параметров ниже; после изменений вставьте код в открывшуюся командную строку CLI Tool и нажмите Enter для выполнения.
Тип ресурса Путь поля Описание ConfigMap data.export.yml.output.compressionСжатие текста логов; поддерживаются опции none (без сжатия), zlib, gzip. ConfigMap data.export.yml.output.file_typeТип экспортируемого файла лога; поддерживаются txt, csv, json. ConfigMap data.export.yml.output.max_sizeРазмер одного архивного файла в МБ. Если превышается, логи автоматически сжимаются и архивируются согласно настройке compression. ConfigMap data.export.yml.scopesОбласть переноса логов; поддерживаются системные логи, логи приложений, логи Kubernetes, продуктовые логи. Deployment spec.template.spec.containers[0].command[7]Адрес сервиса Kafka. Deployment spec.template.spec.volumes[3].hostPath.pathПуть NFS для монтирования. Deployment spec.template.spec.initContainers[0].imageАдрес образа alpine. Deployment spec.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 -
После того как статус контейнера изменится на 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}' |
#Создание ресурсов синхронизации логов
-
В левом навигационном меню выберите Cluster Management > Clusters.
-
Нажмите кнопку действий справа от кластера, в который будут переноситься логи, и выберите CLI Tool.
-
Измените YAML согласно описанию параметров ниже; после изменений вставьте код в открывшуюся командную строку CLI Tool и нажмите Enter для выполнения.
Тип ресурса Путь поля Описание Secret data.access_key_idBase64-кодированное значение полученного access_key_id. Secret data.secret_access_keyBase64-кодированное значение полученного secret_access_key. ConfigMap data.export.yml.output.compressionСжатие текста логов; поддерживаются опции none (без сжатия), zlib, gzip. ConfigMap data.export.yml.output.file_typeТип экспортируемого файла лога; поддерживаются txt, csv, json. ConfigMap data.export.yml.output.max_sizeРазмер одного архивного файла в МБ. Если превышается, логи автоматически сжимаются и архивируются согласно настройке compression. ConfigMap data.export.yml.scopesОбласть переноса логов; поддерживаются системные логи, логи приложений, логи Kubernetes, продуктовые логи. ConfigMap data.export.yml.output.s3.bucket_nameИмя bucket. ConfigMap data.export.yml.output.s3.endpointАдрес сервиса S3. ConfigMap data.export.yml.output.s3.regionРегион сервиса S3. Deployment spec.template.spec.containers[0].command[7]Адрес сервиса Kafka. Deployment spec.template.spec.volumes[3].hostPath.pathЛокальный путь для монтирования, используется для временного хранения логов. Лог-файлы автоматически удаляются после синхронизации в S3. Deployment spec.template.spec.initContainers[0].imageАдрес образа alpine. Deployment spec.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 -
После того как статус контейнера изменится на Running, вы сможете просматривать непрерывно архивируемые логи в bucket.