#Как архивировать логи в стороннее хранилище
В настоящее время логи, генерируемые платформой, сохраняются в компоненте хранения логов; однако период их хранения относительно короткий. Для предприятий с высокими требованиями к соответствию нормативам логи обычно требуют более длительного срока хранения для удовлетворения аудиторских требований. Кроме того, экономический аспект хранения также является одним из ключевых факторов для предприятий.
Исходя из вышеописанных сценариев, платформа предлагает решение для архивирования логов, позволяющее пользователям переносить логи во внешнее NFS или объектное хранилище.
#Содержание
Перенос во внешнее NFSПредварительные требованияСоздание ресурсов синхронизации логовПеренос во внешнее S3-хранилищеПредварительные требованияСоздание ресурсов синхронизации логов#Перенос во внешнее 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}' |
#Создание ресурсов синхронизации логов
-
Нажмите 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; создать бакет, в котором будут храниться логи. |
| 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}' |
#Создание ресурсов синхронизации логов
-
Нажмите 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Имя бакета. 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 # Заполнить подготовленным именем бакета 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, вы сможете просматривать непрерывно архивируемые логи в бакете.