elasticsearch - 如何使用 S3 为 EFK 堆栈配置日志的长期保留?

标签 elasticsearch amazon-s3 kubernetes fluent efk

为安装了 ElasticSearch、FluentD 和 Kibana 的 kubernetes 集群配置 S3 中日志的长期保留的最佳方法是什么?

最佳答案

如果您还没有安装 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 secret
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 访问 key 和 ID 创建一个 key ,有关更多信息,请参见下文。不要忘记不透明的 secret 必须是 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 访问 key 和 ID 使用环境变量,那是因为它不起作用:https://github.com/fluent/fluent-plugin-s3/issues/340 .如果您使用的是 kube-2-iam 或 kiam,那么这无关紧要。请参阅 fluentd s3 插件的文档以将其配置为承担角色而不是使用凭据。
这些值将允许您使用配置映射运行 s3 插件。需要注意的一些重要事项:
  • 我使用“软”的 antiAffinity,因为我运行的是单实例金属集群。
  • S3_LOGS_BUCKET_PREFIX 为空,因为我为每个环境使用单独的存储桶,但您可以为环境共享一个存储桶并将前缀设置为环境名称
  • 您需要一个扩展 fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch 镜像并安装了 s3 插件的 docker 镜像。
  • 如果您跳过了为访问 key 和 ID 创建 secret 的步骤,那么您可以删除 envFrom将 secret 作为环境变量导入。

  • 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 中保留了较长时间的日志,我们可以安全地为使用 ElasticSearch Curator 发送到 elasticsearch 的数据设置一个较小的保留期,例如 30 天。
    您可以像这样安装 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
    

    关于elasticsearch - 如何使用 S3 为 EFK 堆栈配置日志的长期保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62822716/

    相关文章:

    javascript - 来自 elasticsearch 的 406( Not Acceptable )错误代码是什么意思?

    Django + Heroku + S3

    amazon-web-services - AWS CloudFront 误解路由规则并将资源重定向回 S3 存储桶对象 URL

    kubernetes - 远程访问 Kubernetes API

    kubernetes - IstIO Ingress Gateway 上 Nginx Ingress Annonations 的等价物

    ElasticSearch URI 搜索空字段

    Elasticsearch 词频和关系

    python - 通过 Elasticsearch 按前缀删除文档

    javascript - 无法使用node.js和 Angular 将图像blob上传到AWS S3

    kubernetes - iptables 模式下的 kube-proxy 无法正常工作