Как настроить долгосрочное хранение журналов для стека EFK с помощью S3? - PullRequest
0 голосов
/ 09 июля 2020

Как лучше всего настроить долгосрочное хранение журналов в S3 для кластера kubernetes с установленными ElasticSearch, FluentD и Kibana?

1 Ответ

2 голосов
/ 09 июля 2020

Если вы еще не установили стек 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
...