如何让K8s集群内的Fluentd采集集群外Docker容器日志?
实现集群外Docker容器日志采集的方案
方案1:通过Fluentd Forward协议接收外部日志(推荐)
这种方式利用Fluentd原生的forward输入插件,让集群外的Docker容器直接将日志推送到集群内的Fluentd服务,配置步骤如下:
1. 修改集群内Fluentd的配置
在现有Fluentd的配置文件中添加forward类型的输入源,用于接收外部日志:
<source> @type forward port 24224 bind 0.0.0.0 # 可选:添加认证,避免非法日志接入 <security> self_hostname fluentd-service.default.svc.cluster.local shared_key your_shared_secret </security> </source>
同时,修改Fluentd的Kubernetes Service,暴露该端口给外部(示例用NodePort,也可根据环境用LoadBalancer):
apiVersion: v1 kind: Service metadata: name: fluentd namespace: default spec: type: NodePort ports: - name: forward port: 24224 targetPort: 24224 nodePort: 30024 # 可选:指定固定端口,否则自动分配 selector: app: fluentd
2. 配置集群外的Docker容器
启动容器时指定fluentd日志驱动,将日志发送到集群内Fluentd的NodePort地址:
docker run \ --log-driver=fluentd \ --log-opt fluentd-address=<集群节点IP>:30024 \ --log-opt fluentd-shared-key=your_shared_secret \ --log-opt tag=external.docker.{{.Name}} \ your-container-image
如果需要全局生效(所有容器默认使用该驱动),修改Docker的daemon.json:
{ "log-driver": "fluentd", "log-opts": { "fluentd-address": "<集群节点IP>:30024", "fluentd-shared-key": "your_shared_secret", "tag": "external.docker.{{.Name}}" } }
修改后重启Docker服务即可。
方案2:让Fluentd拉取外部服务器的日志文件
如果无法修改Docker的日志驱动,可以将外部服务器的Docker日志目录共享给集群内的Fluentd Pod,再通过tail插件读取日志:
1. 共享外部服务器的Docker日志目录
在外部服务器上,将默认的Docker日志目录/var/lib/docker/containers通过NFS(或其他文件共享方式)对外开放。
2. 挂载共享目录到Fluentd Pod
修改Fluentd的Deployment配置,添加Volume挂载:
apiVersion: apps/v1 kind: Deployment metadata: name: fluentd namespace: default spec: template: spec: volumes: - name: external-docker-logs nfs: server: <外部服务器IP> path: /var/lib/docker/containers containers: - name: fluentd volumeMounts: - name: external-docker-logs mountPath: /var/lib/docker/external-containers readOnly: true
3. 配置Fluentd读取外部日志
在Fluentd配置中添加tail输入源:
<source> @type tail path /var/lib/docker/external-containers/*/*-json.log pos_file /var/log/fluentd/external-docker-logs.pos tag external.docker.{{path.basename}} <parse> @type json </parse> </source>
注意事项
- 确保集群节点与外部服务器的网络连通性,开放对应端口(方案1开放24224,方案2开放NFS相关端口)
- 方案1的
shared_key建议使用随机生成的密钥,提升安全性 - 可在Fluentd过滤规则中添加专属标签,将外部日志与集群内日志区分开,方便Kibana筛选
内容的提问来源于stack exchange,提问作者maantarng
相关产品推荐
相关产品推荐

