更新时间:2024-11-01 GMT+08:00

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