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