download fluentd images
https://hub.docker.com/r/fluent/fluentd-kubernetes-daemonset/
docker pull 192.168.19.111/baseimages/fluentd-kubernetes-daemonset:v0.12-alpine-elasticsearch
Since the image has no kafka plugin to modify the image, the dockerfile file is as follows
FROM 192.168.19.111/baseimages/fluentd-kubernetes-daemonset:v0.12-alpine-elasticsearch
RUN gem install fluent-plugin-kafka
COPY fluent.conf /fluentd/etc/fluent.conf
ENTRYPOINT ["fluentd","-c","/fluentd/etc/fluent.conf","-p","/fluentd/plugins"]
The last generated image: 192.168.19.111/baseimages/fluentd:201803101322
Create the yaml file of fluentd:
Since fluentd wants to grab the relevant information of the image from kube-apiserver, the sa
sa file must be configured:
apiVersion: v1
kind: ServiceAccount
metadata:
name: fluentd-es
namespace: kube-system
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
Create the ClusterRole file:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: fluentd-es
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
rules:
- apiGroups:
- ""
resources:
- "namespaces"
- "pods"
verbs:
- "get"
- "watch"
- "list"
Create a ClusterRoleBinding role binding file
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: fluentd-es
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: "true"
addonmanager.kubernetes.io/mode: Reconcile
subjects:
- kind: ServiceAccount
name: fluentd-es
namespace: kube-system
apiGroup: ""
roleRef:
kind: ClusterRole
name: fluentd-es
apiGroup: ""
Create cm profile
kind: ConfigMap
apiVersion: v1
metadata:
name: fluentd-config
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: Reconcile
data:
fluent.conf: |-
<source>
@type tail
path /var/log/containers/*.log
pos_file /var/log/fluentd-containers.log.pos
time_format %Y-%m-%dT%H:%M:%S.%NZ
tag kubernetes.*
format json
</source>
<filter kubernetes.**>
@type kubernetes_metadata
</filter>
<match **>
@type kafka_buffered
brokers 192.168.7.204:9092,192.168.7.204:9093,192.168.7.204:9094
output_data_type json
default_topic test-panjunbai
compression_codec gzip
required_acks 1
</match>
Create ds file (since /var/log/containers can be processed by fluentd and kube-apiserver connection, the software destination file path of /var/log/containers must be mounted)
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
name: fluentd-ds
namespace: kube-system
labels:
k8s-app: fluentd
kubernetes.io/cluster-service: "true"
spec:
selector:
matchLabels:
k8s-app: fluentd
template:
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
k8s-app: fluentd
kubernetes.io/cluster-service: "true"
spec:
serviceAccountName: fluentd-es
containers:
- name: fluentd-ds
image: 192.168.19.111/baseimages/fluentd:201803101322
resources:
limits:
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- mountPath: /var/log
name: varlog
- mountPath: /fluentd/etc
name: fluentd-cm
- name: tz-config
mountPath: /etc/localtime
- name: real-dir
mountPath: /opt/docker/containers
terminationGracePeriodSeconds: 30
volumes:
- name: real-dir
hostPath:
path: /opt/docker/containers
- name: varlog
hostPath:
path: /var/log
- configMap:
defaultMode: 420
items:
- key: fluent.conf
path: fluent.conf
name: fluentd-config
name: fluentd-cm
- name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
https://docs.fluentd.org/v0.12/articles/kubernetes-fluentd
https://github.com/fluent/fluent-plugin-kafka
https://github.com/fabric8io/fluent-plugin-kubernetes_metadata_filter
https://kubernetes.io/docs/concepts/cluster-administration/logging/