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

Jos*_*ock 1 fluent amazon-s3 elasticsearch kubernetes efk

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

Jos*_*ock 5

如果您还没有安装 efk stack,您可以这样做:

helm repo add cryptexlabs https://helm.cryptexlabs.com
helm install my-efk-stack cryptexlabs/efk
Run Code Online (Sandbox Code Playgroud)

或者添加到您的Chart.yaml依赖项

  - name: efk
    version: 7.8.0
    repository: https://helm.cryptexlabs.com
    condition: efk.enabled
Run Code Online (Sandbox Code Playgroud)

接下来创建一个配置映射,其中也将包含您的 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>
Run Code Online (Sandbox Code Playgroud)

(可选)使用您的 AWS 访问密钥和 ID 创建密钥,请参阅下文了解更多信息。不要忘记不透明的秘密必须是 Base64 编码的

apiVersion: v1
kind: Secret
metadata:
  name: s3-log-archive-secret
type: Opaque
data:
  AWS_ACCESS_KEY_ID: xxx
  AWS_SECRET_ACCESS_KEY: xxx
Run Code Online (Sandbox Code Playgroud)

如果您想知道为什么我没有为 aws 访问密钥和 id 使用环境变量,那是因为它不起作用:https://github.com/ Fluent/fluence-plugin-s3/issues/340 。如果您使用 kube-2-iam 或 kiam 那么这并不重要。请参阅 fluidd s3 插件的文档,将其配置为承担角色而不是使用凭据。

这些值将允许您使用配置映射运行 s3 插件。需要注意的一些重要事项:

  • 我使用“软”的 antiAffinity,因为我运行单实例金属集群。
  • S3_LOGS_BUCKET_PREFIX 为空,因为我为每个环境使用单独的存储桶,但您可以为环境共享一个存储桶并将前缀设置为环境名称
  • 您需要一个 docker 镜像,该镜像扩展了 Fluent/ Fluentd-kubernetes-daemonset:v1-debian-elasticsearch 镜像并安装了 s3 插件。
  • 如果您跳过了为访问密钥和 ID 创建密钥的步骤,那么您可以删除将envFrom密钥导入为环境变量的步骤。
apiVersion: v1
kind: Secret
metadata:
  name: s3-log-archive-secret
type: Opaque
data:
  AWS_ACCESS_KEY_ID: xxx
  AWS_SECRET_ACCESS_KEY: xxx
Run Code Online (Sandbox Code Playgroud)

如果你想制作自己的 docker 镜像,你可以这样做:

FROM fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch

RUN fluent-gem install \
 fluent-plugin-s3
Run Code Online (Sandbox Code Playgroud)

接下来,您可能想要为 s3 数据设置保留期。您可以在一段时间后将其删除,也可以根据您的要求将其移至 Glacier。

最后,由于我们在 S3 中保留了更长期的日志,因此我们可以安全地将使用 ElasticSearch Curator 发送到 elasticsearch 的数据的保留期设置为更小的值,例如 30 天。

您可以像这样安装 currator:

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
Run Code Online (Sandbox Code Playgroud)

或者添加到您的Chart.yaml依赖项:

FROM fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch

RUN fluent-gem install \
 fluent-plugin-s3
Run Code Online (Sandbox Code Playgroud)

values.yaml

helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm install curator stable/elasticsearch-curator
Run Code Online (Sandbox Code Playgroud)