
# Pod日志采集
本章节将介绍在Pod内进行日志采集，允许用户通过配置容器内自定义路径下的日志文件来采集日志，并通过自定义策略处理，上报到用户kafka日志中心。
#### 资源限制
建议您为Fluent Bit预留50MB的内存。
#### 约束与限制
- 当前不支持容器中软链路径的日志采集。
- 当前不支持容器标准输出采集上报到kafka。
- 当前不支持日志轮转，如果需要对日志文件进行大小的控制，请自行处理。
- 单条日志长度限制为250KB，如果超过则会丢弃。
- 不支持指定系统、设备、cgroup、tmpfs、localdir等挂载目录的日志采集，会直接忽略。
- 容器中长度超过190的日志文件无法被采集。容器中长度在180\~190范围的日志文件仅支持采集第一个文件。
- 当容器被停止时，如果出现因网络延迟、资源占用多等原因导致的采集延时，可能会丢失容器停止前的部分日志。 
  
 
#### 基础配置
​Fluent Bit是一个开源的多平台日志处理器工具，Fluent Bit配置由SERVICE，INPUT，FILTER，PARSER，OUTPUT等模块组成，目前我们只允许定义OUTPUT模块，在OUTPUT中定义日志内容的目的端。
您可以使用下面的ConfigMap将Fluent Bit流程日志发送到kafka。
**约束与限制**
- output.conf配置内容需要小于1MB。
- 缩进格式需要\[OUTPUT\]为最外层无缩进，下面配置项为固定4空格缩进。
**基础配置**
在您的主配置文件中需要配置以下部分：
```
kind: ConfigMap
apiVersion: v1
metadata:
  name: cci-logging-conf
  labels:
     logconf.k8s.io/discovery: "true"
data:     
    output.conf: |        
        [OUTPUT]          
            Name       kafka      
            Match      *          
            Brokers    192.168.1.3:9092    
            Topics     test
```
表1参数说明 
| 参数                       | 参数含义                          | 必选/可选 | 约束                                                           |
|:---|:---|:---|:---|
| logconf.k8s.io/discovery | 标识Configmap为fluent-bit日志配置文件。 | 必选    | 必选值：true                                                     |
| Name                     | 插件名称。                         | 必选    | 必选值：kafka 当前只支持kafka插件。         |
| Match                    | 与传入记录的标签匹配。"\*"作为通配符。         | 可选    | 如果配置的话，必须是"\*"。                                              |
| Brokers                  | broker（kafka）地址。可以同时配置多个。     | 必选    | 例如：192.168.1.3:9092,192.168.1.4:9092,192.168.1.5:9092        |
| Topics                   | 日志主题。                         | 可选    | 默认值为fluent-bit 传入的topic必须已经存在。 |
   
通过在Pod上配置volume，并配置annotation来指定sandbox volume和对应的日志output配置文件。
```
kind: Deployment
apiVersion: apps/v1
metadata:
  name: kafka-dey
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafka
  template:
    metadata:
      labels:
        app: kafka
      annotations:
        logpath.k8s.io/container-0: /var/log/*.log;/var/paas/sys/log/virtual-kubelet.log
        logconf.k8s.io/fluent-bit-configmap-reference: cci-logging-conf
    spec:
      containers:
        - name: container-0
          image: 'nginx:alpine'  
          resources:
            limits:
              cpu: 1000m
              memory: 2048Mi
            requests:
              cpu: 1000m
              memory: 2048Mi
      imagePullSecrets:
        - name: default-secret
```
表2参数说明 
| Annotation                                    | 功能                                                                   | 约束                                                                                                                                                                                   |
|:---|:---|:---|
| logpath.k8s.io/$containerName                 | 通过Pod容器环境变量配置采集文件 $containerName为容器名变量。 | 支持配置多条路径，每个路径配置都要是以"/"开头的绝对路径，各路径配置以";"分隔。 只支持完整日志文件路径或者使用带"\*"通配符的文件名。如果配置带"\*"通配符的文件名，则文件所在目录需要在容器启动时就存在。 文件名的最大长度为190。 |
| logconf.k8s.io/fluent-bit-configmap-reference | 指定fluent-bit日志采集配置的configmap名称                                       | 配置的configmap必须已经存在，并且符合配置fluent-bit中描述的要求。                                                                                                                                           |
   
#### 高级配置
Secret是一种加密存储的资源对象，您可以将认证信息、证书、私钥等保存在密钥中，从而解决了密码、token、密钥等敏感数据的配置问题。
```
apiVersion: v1
kind: Secret
metadata:
  name: cci-sfs-kafka-tls
type: Opaque
data:
   ca.crt: ...
   server.crt: ...
   server.key: ...
```
用户可以通过配置SSL参数，进行加密的安全连接，证书文件等相关的文件引用通过sandbox volume的特性来支持。
```
kind: ConfigMap
apiVersion: v1 
metadata:  
  name: cci-logging-conf-tls 
  labels:    
     logconf.k8s.io/discovery: true
data: 
    output.conf: |
        [OUTPUT]       
            Name        kafka       
            Match       *       
            Brokers     192.168.1.3:9092   
            Topics      test 
            rdkafka.security.protocol ssl    
            rdkafka.ssl.certificate.location ${sandbox_volume_kafkatls}/client.crt     
            rdkafka.ssl.key.location ${sandbox_volume_kafkatls}/client.key 
            rdkafka.ssl.ca.location ${sandbox_volume_kafkatls}/ca.crt
            rdkafka.enable.ssl.certificate.verification true     
            rdkafka.request.required.acks 1
```
表3参数说明 
| 参数                                          | 参数含义          | 必选/可选        | 可选值                                                       |
|:---|:---|:---|:---|
| rdkafka.security.protocol                   | 用于与代理通信的协议。   | 开启SSL认证必选    | ssl                                                       |
| rdkafka.ssl.certificate.location            | SSL公钥路径       | 开启SSL认证必选    | ${sandbox_volume_**${VOLUME_NAME}** }/**some.cert**       |
| rdkafka.ssl.key.location                    | SSL私钥路径       | 开启SSL认证必选    | ${sandbox_volume_**${VOLUME_NAME}** }/**some.key**        |
| rdkafka.ssl.ca.location                     | CA 证书的文件或目录路径 | 开启对服务端证书认证必选 | ${sandbox_volume_**${VOLUME_NAME}** }/**some-bundle.crt** |
| rdkafka.enable.ssl.certificate.verification | 是否开始对服务端证书认证  | 可选           | 可选true, false。默认为true。                                    |
   
通过在Pod上配置volume，并配置annotation来指定sandbox volume和对应的日志output配置文件。
```
kind: Deployment
apiVersion: apps/v1
metadata:
  name: kafka-tls
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafka
  template:
    metadata:
      labels:
        app: kafka
      annotations:
        logpath.k8s.io/container-0: /var/log/*.log;/var/paas/sys/log/virtual-kubelet.log
        logconf.k8s.io/fluent-bit-configmap-reference: cci-logging-conf       
        sandbox-volume.openvessel.io/volume-names: kafkatls
    spec: 
      volumes: 
        - name: kafkatls
          secret:
            secretName: cci-sfs-kafka-tls
      containers:
        - name: container-0
          image: 'nginx:alpine'  
          resources:
            limits:
              cpu: 1000m
              memory: 2048Mi
            requests:
              cpu: 1000m
              memory: 2048Mi
          volumeMounts:
            - name: kafkatls
              mountPath: /tmp/sfs
      imagePullSecrets:
        - name: default-secret
```
有关kafka的更多配置项内容，可参考 <https://github.com/edenhill/librdkafka/blob/master/CONFIGURATION.md>。
