Если вы еще не установили стек efk, вы можете сделать это следующим образом:
helm repo add cryptexlabs https://helm.cryptexlabs.com
helm install my-efk-stack cryptexlabs/efk
Или добавьте в свои Chart.yaml
зависимости
- name: efk
version: 7.8.0
repository: https://helm.cryptexlabs.com
condition: efk.enabled
Затем создайте конфигурационную карту, которая также будет содержать ваши AWS секреты
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-extra-config
data:
s3.conf: |-
<match **>
@type copy
copy_mode deep
<store>
@type s3
aws_key_id xxx
aws_sec_key xxx
s3_bucket "#{ENV['AWS_S3_BUCKET']}"
s3_region "#{ENV['AWS_REGION']}"
path "#{ENV['S3_LOGS_BUCKET_PREFIX']}"
buffer_path /var/log/fluent/s3
s3_object_key_format %{path}%{time_slice}/cluster-log-%{index}.%{file_extension}
time_slice_format %Y%m%d-%H
time_slice_wait 10m
flush_interval 60s
buffer_chunk_limit 256m
</store>
</match>
При желании создайте секрет с вашим ключом доступа AWS и идентификатором, подробнее см. ниже. Не забывайте, что непрозрачные секреты должны быть закодированы в base64
apiVersion: v1
kind: Secret
metadata:
name: s3-log-archive-secret
type: Opaque
data:
AWS_ACCESS_KEY_ID: xxx
AWS_SECRET_ACCESS_KEY: xxx
Если вам интересно, почему я не использовал переменную среды для ключа доступа и идентификатора aws, то это потому, что это не так. т работы: https://github.com/fluent/fluent-plugin-s3/issues/340. Если вы используете kube-2-iam или kiam, это не имеет значения. См. Документацию по подключению fluentd s3, чтобы настроить его на роль вместо использования учетных данных.
Эти значения позволят вам запустить подключаемый модуль s3 с картой конфигурации. Некоторые важные моменты, на которые следует обратить внимание:
- Я использую antiAffinity как «soft», потому что я запускаю металлический кластер с одним экземпляром.
- S3_LOGS_BUCKET_PREFIX пусто, потому что я использую отдельную корзину для каждой среды, но вы можете поделиться корзиной для сред и установить префикс в качестве имени среды
- Вам нужен образ docker, который расширяет образ fluent / fluentd-kubernetes-daemonset: v1-debian-elasticsearch и имеет плагин s3
- Если вы пропустили шаг по созданию секрета для ключа доступа и идентификатора, вы можете удалить
envFrom
, который импортирует секрет как переменные среды.
efk:
enabled: true
elasticsearch:
antiAffinity: "soft"
fluentd:
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch-master"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
- name: AWS_REGION
value: us-east-1
- name: AWS_S3_BUCKET
value: your_buck_name_goes_here
- name: S3_LOGS_BUCKET_PREFIX
value: ""
envFrom:
- secretRef:
name: s3-log-archive-secret
extraVolumeMounts:
- name: extra-config
mountPath: /fluentd/etc/conf.d
extraVolumes:
- name: extra-config
configMap:
name: fluentd-extra-config
items:
- key: s3.conf
path: s3.conf
image:
repository: docker.io/cryptexlabs/fluentd
tag: k8s-daemonset-elasticsearch-s3
Если вы хотите создать свой собственный docker образ, вы можете сделать это следующим образом:
FROM fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
RUN fluent-gem install \
fluent-plugin-s3
Следующее, что вы, вероятно, захотите установить период хранения для данных s3. Либо вы хотите удалить его по прошествии определенного периода времени, либо переместить его в Glacier в зависимости от ваших требований.
Наконец, поскольку у нас есть более длительное хранение наших журналов в S3, мы можем безопасно установить период хранения чего-либо меньше 30 дней для данных, которые отправляются в elasticsearch с помощью ElasticSearch Curator.
Вы можете установить currator следующим образом:
helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm install curator stable/elasticsearch-curator
Или добавить в свои Chart.yaml
зависимости:
- name: elasticsearch-curator
version: 2.1.5
repository: https://kubernetes-charts.storage.googleapis.com
values.yaml
:
elasticsearch-curator:
configMaps:
action_file_yml: |-
1: &delete
action: delete_indices
description: "Delete selected indices"
options:
ignore_empty_list: True
continue_if_exception: True
timeout_override: 300
filters:
- filtertype: pattern
kind: prefix
value: 'logstash-'
- filtertype: age
source: name
direction: older
timestring: '%Y-%m-%d'
unit: days
unit_count: 30