<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>fluentbit | 伪架构师</title>
    <link>/tags/fluentbit/</link>
      <atom:link href="/tags/fluentbit/index.xml" rel="self" type="application/rss+xml" />
    <description>fluentbit</description>
    <generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh</language><lastBuildDate>Mon, 10 Jul 2017 08:51:52 +0800</lastBuildDate>
    <image>
      <url>/img/logo-wide.png</url>
      <title>fluentbit</title>
      <link>/tags/fluentbit/</link>
    </image>
    
    <item>
      <title>在 Kubernetes 中使用 Fluent Bit 进行日志采集</title>
      <link>/post/fluentbit-in-k8s/</link>
      <pubDate>Mon, 10 Jul 2017 08:51:52 +0800</pubDate>
      <guid>/post/fluentbit-in-k8s/</guid>
      <description>&lt;p&gt;Fluent Bit 和 Fluentd 一样，是 Treasure Data 资助的采集工具，二者对比如下：&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Fluentd&lt;/th&gt;
&lt;th&gt;FluentBit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;

&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;范围&lt;/td&gt;
&lt;td&gt;服务器&lt;/td&gt;
&lt;td&gt;嵌入设备和 IoT 设备&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;约 20 MB&lt;/td&gt;
&lt;td&gt;约 150 KB&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;语言&lt;/td&gt;
&lt;td&gt;C 和 Ruby&lt;/td&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;性能&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;td&gt;高&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;依赖&lt;/td&gt;
&lt;td&gt;以 Ruby Gem 构建，依赖一系列的 Gem&lt;/td&gt;
&lt;td&gt;零依赖，可能有些插件会有依赖。&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;插件&lt;/td&gt;
&lt;td&gt;超过三百个&lt;/td&gt;
&lt;td&gt;目前15个左右&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td&gt;授权&lt;/td&gt;
&lt;td&gt;Apache License v2.0&lt;/td&gt;
&lt;td&gt;Apache License v2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;从上表可以看出，Fluentd 具有众多插件，随之而来的是很好的弹性。而 Fluent Bit 则更适用于嵌入设备等资源受限的场景。另外二者并非互斥关系，Fluent Bit 提供了输出插件，可以把数据发给 Fluentd，因此他们可以在系统中作为独立服务互相协作。&lt;/p&gt;

&lt;p&gt;Fluent Bit 也提供了 Kubernetes Filter 插件，用于将采集到的日志结合对 Kubernetes API 的查询，为日志加入 Kubernetes 的相关数据，例如 Pod 信息、容器信息、命名空间以及标签和注解等内容。&lt;/p&gt;

&lt;p&gt;仅就此来说，Fluent Bit 是可以替代 Kubernetes 缺省推荐的 Fluentd 进行日志采集工作的，经过笔者测试，可以直接使用他替代原有的 Fluentd，使用 DaemonSet 运行，结合 Elastic Search 进行日志归集工作。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;详情参见：&lt;a href=&#34;http://fluentbit.io/documentation/0.11/filter/kubernetes.html&#34; target=&#34;_blank&#34;&gt;http://fluentbit.io/documentation/0.11/filter/kubernetes.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;简单的使用如下命令就可以运行：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    kubectl create -f https://raw.githubusercontent.com/fluent/fluent-bit-kubernetes-daemonset/master/fluent-bit-daemonset-elasticsearch.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;这一 YAML 文件中的镜像版本为 0.11，具体版本更新可以到 Docker Hub 进行查询，其中包含的缺省 elasticsearch 地址为 elasticsearch-logging，端口为 9200，如上配置如果不符，可以下载文件自行修改运行。&lt;/p&gt;

&lt;p&gt;另外目前 RBAC 的访问控制模式已经成为缺省，在启用了 RBAC 模式的集群中，该 Pod 的运行是无法成功的，具体表现是日志中出现无法获取 Pod 元数据的信息，这是因为缺省情况下，这一 YAML 中使用的是 &lt;code&gt;kube-system&lt;/code&gt; 中的 &lt;code&gt;default&lt;/code&gt;  Service Account，这一服务账号并不具备获取 Pod 信息的授权，要成功运行，就必须按照 RBAC 的规矩，让 Fluent Bit 的 Service Account 能够获取 Pod 信息，可以用如下方式来解决：&lt;/p&gt;

&lt;p&gt;首先为 Fluent bit 创建专门的 Service Account：&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    kubectl create sa logging -n kube-system
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;然后为日志收集器创建角色，让该角色可以读取 Pod 信息。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: pod-reader
rules:
- apiGroups: [&amp;quot;&amp;quot;]
  resources: [&amp;quot;pods&amp;quot;]
  verbs: [&amp;quot;get&amp;quot;, &amp;quot;watch&amp;quot;, &amp;quot;list&amp;quot;]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;接下来创建 ClusterRoleBinding，把新建的角色和 Service Account 绑定在一起：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: read-pods-global
subjects:
- kind: ServiceAccount
  name: logging
  namespace: kube-system
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;最后在 Fluent Bit 的 yaml 中加入 Service Account 的指派：&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-yaml&#34;&gt;# 省略若干
spec:
  template:
    metadata:
      labels:
        k8s-app: fluent-bit-logging
        version: v1
        kubernetes.io/cluster-service: &amp;quot;true&amp;quot;
    spec:
      serviceAccountName: logging
# 省略若干
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;经过这一番折腾之后，Fluent Bit 就可以在开启 RBAC 的 1.&lt;sup&gt;6&lt;/sup&gt;&amp;frasl;&lt;sub&gt;1&lt;/sub&gt;.7 集群上运行了。打开相应的 Kibana 页面，会看到和标配 Fluentd 一致的日志搜集结果。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;好吧，今天讲的其实是 RBAC。&lt;/p&gt;
&lt;/blockquote&gt;
</description>
    </item>
    
  </channel>
</rss>
