2017-09-05 107 views
0

我有一個Kubernetes羣集,其中我試圖在節點上聚合容器日誌並將它們發送到MongoDB。不過,我需要能夠根據日誌記錄中的值自行發送日誌記錄到不同的MongoDB服務器。Fluentd根據字段值創建標記

我正在使用fluent-plugin-kubernetes_metadata_filter插件將附加信息從Kubernetes附加到日誌記錄。其中一個領域是kubernetes_namespace_name。是否有可能使用該字段創建一個標籤,我可以使用它匹配mongodb輸出插件。

例如。下面,我只使用一個輸出,但這個想法是有多重,讓流暢的日誌發送給在外地kubernetes_namespace_name基於該值的MongoDB數據庫:

<source> 
    @type tail 
    @label @KUBERNETES 
    path /var/log/containers/*.log 
    pos_file /var/log/es-containers.log.pos 
    time_format %Y-%m-%dT%H:%M:%S 
    tag kubernetes.* 
    format json 
    keep_time_key true 
    read_from_head true 
</source> 

<label @KUBERNETES> 
    <filter kubernetes.**> 
    @type kubernetes_metadata 
    kubernetes_url "#{ENV['K8S_HOST_URL']}" 
    bearer_token_file /var/run/secrets/kubernetes.io/serviceaccount/token 
    ca_file /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 
    include_namespace_id true 
    </filter> 
    <filter kubernetes.**> 
    @type flatten_hash 
    separator _ 
    </filter> 

    # < Tag 'kubernetes.namespace.default' is created here somehow > 

    <match kubernetes.namespace.default> 
    @type mongo 
    host "#{ENV['MONGO_HOST']}" 
    port "#{ENV['MONGO_PORT']}" 
    database "#{ENV['MONGO_DATABASE']}" 
    collection "#{ENV['MONGO_COLLECTION']}" 
    capped 
    capped_size 1024m 
    user "#{ENV['MONGO_USER']}" 
    password "#{ENV['MONGO_PASSWORD']}" 
    time_key time 
    flush_interval 10s 
    </match> 
</label> 

回答

0

,而不是使用的標籤,你可以使用消息內容使用Fluentd的grep過濾器進行過濾。您可以在kubernetes元數據過濾器之後和數據平鋪器之前添加過濾器。這允許您指定密鑰kubernetes_namespace_name,然後根據其中的值進行路由。由於使用標籤可能會產生額外的MongoDB輸出,可以幫助分離流程工作流程。

文檔:https://docs.fluentd.org/v0.12/articles/filter_grep

例子:

<filter kubernetes.**> 
    @type grep 
    <regexp> 
    key kubernetes_namespace_name 
    pattern cool 
    </regexp> 
</filter> 

<YOUR MONGO CONFIG HERE> 
+0

所以你的意思,我需要有1點光源和多個標籤每個都有它自己的流量? – amofasser

+0

正確的配置將會有相當多的依賴性,但這應該會起作用。 –