Как архивировать логи в стороннее хранилище
В настоящее время логи, генерируемые платформой, сохраняются в компоненте хранения логов; однако период их хранения относительно короткий. Для предприятий с высокими требованиями к соответствию нормативам логи обычно требуют более длительного срока хранения для удовлетворения аудиторских требований. Кроме того, экономический аспект хранения также является одним из ключевых факторов для предприятий.
Исходя из вышеописанных сценариев, платформа предлагает решение для архивирования логов, позволяющее пользователям переносить логи во внешнее 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 | Размер одного архивного файла в МБ. При превышении этого значения логи автоматически сжимаются и архивируются согласно настройке 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:
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_id | Base64-кодированное значение полученного access_key_id. |
Secret | data.secret_access_key | Base64-кодированное значение полученного 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, вы сможете просматривать непрерывно архивируемые логи в бакете.