Filebeat收集K8S日志

Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch、Logstash和 Kibana(ELK)技术栈,今天来推荐EFK,即Logstash换成filebeat。

切换到EFK后,发现filebeat正则表达式不是很好实现,比如怎么在Filebeat收集日志按k8s命名空间索引存到Elasticsearch,该教程主要介绍该方法。

Filebeat收集K8S日志

环境准备

Elasticsearch:http://10.0.0.1:9200″, “http://10.0.0.2:9200”, “http://10.0.0.3:9200
docker data-root: /data/docker
需求:将nginx-ingress收集到ES单独索引
所有日志标准输出

filebeat-kubernetes.yaml

 
  1. —  
  2. apiVersion: v1  
  3. kind: ConfigMap  
  4. metadata:  
  5.   name: filebeat-config  
  6.   namespace: kube-system  
  7.   labels:  
  8.     k8s-app: filebeat  
  9. data:  
  10.   filebeat.yml: |-  
  11.     #====================== input =================  
  12.     filebeat.inputs:  
  13.     # nginx-ingress  
  14.     – type: container  
  15.       paths:  
  16.         – /var/log/containers/*_nginx-ingress_*.log  
  17.       tags: [“nginx-ingress”]  
  18.       fields:  
  19.         index: “nginx-ingress”  
  20.       processors:  
  21.         – add_kubernetes_metadata:  
  22.             host: ${NODE_NAME}  
  23.             matchers:  
  24.             – logs_path:  
  25.                 logs_path: “/var/log/containers/”  
  26.         – decode_json_fields:  
  27.             when:  
  28.                regexp:  
  29.                  message: “{*}”  
  30.             fields: [“message”]  
  31.             overwrite_keys: true  
  32.             target: “”  
  33.     # oneinstack-prd  
  34.     – type: container  
  35.       paths:  
  36.         – /var/log/containers/*_oneinstack-prd_*.log  
  37.       tags: [“oneinstack-prd”]  
  38.       fields:  
  39.         index: “oneinstack-prd”  
  40.       processors:  
  41.         – add_kubernetes_metadata:  
  42.             host: ${NODE_NAME}  
  43.             matchers:  
  44.             – logs_path:  
  45.                 logs_path: “/var/log/containers/”  
  46.         – decode_json_fields:  
  47.             when:  
  48.                regexp:  
  49.                  message: “{*}”  
  50.             fields: [“message”]  
  51.             #overwrite_keys: true  
  52.             target: “”  
  53.     #================ output =====================  
  54.     output.elasticsearch:  
  55.       hosts: [“http://10.0.0.1:9200”, “http://10.0.0.2:9200”, “http://10.0.0.3:9200”]   
  56.       indices:  
  57.         – index: “nginx-ingress-%{+yyyy.MM.dd}”  
  58.           when.contains:  
  59.             fields:  
  60.               index: “nginx-ingress”  
  61.         – index: “oneinstack-prd-%{+yyyy.MM.dd}”  
  62.           when.contains:  
  63.             fields:  
  64.               index: “oneinstack-prd”  
  65.   
  66.     #============== Elasticsearch template setting ==========  
  67.     setup.ilm.enabled: false  
  68.     setup.template.name: ‘k8s-logs’  
  69.     setup.template.pattern: ‘k8s-logs-*’  
  70.     processors:  
  71.       – drop_fields:  
  72.           fields: [“agent”,”kubernetes.labels”,”input.type”,”log”,”ecs.version”,”host.name”,”kubernetes.replicaset.name”,”kubernetes.pod.uid”,”kubernetes.pod.uid”,”tags”,”stream”,”kubernetes.container.name”]  
  73. —  
  74. apiVersion: apps/v1  
  75. kind: DaemonSet  
  76. metadata:  
  77.   name: filebeat  
  78.   namespace: kube-system  
  79.   labels:  
  80.     k8s-app: filebeat  
  81. spec:  
  82.   selector:  
  83.     matchLabels:  
  84.       k8s-app: filebeat  
  85.   template:  
  86.     metadata:  
  87.       labels:  
  88.         k8s-app: filebeat  
  89.     spec:  
  90.       serviceAccountName: filebeat  
  91.       terminationGracePeriodSeconds: 30  
  92.       hostNetwork: true  
  93.       dnsPolicy: ClusterFirstWithHostNet  
  94.       tolerations:  
  95.       – effect: NoSchedule  
  96.         operator: Exists  
  97.       containers:  
  98.       – name: filebeat  
  99.         image: elastic/filebeat:7.9.0  
  100.         args: [  
  101.           “-c”, “/etc/filebeat.yml”,  
  102.           “-e”,  
  103.         ]  
  104.         env:  
  105.         – name: NODE_NAME  
  106.           valueFrom:  
  107.             fieldRef:  
  108.               fieldPath: spec.nodeName  
  109.         securityContext:  
  110.           runAsUser: 0  
  111.           # If using Red Hat OpenShift uncomment this:  
  112.           #privileged: true  
  113.         resources:  
  114.           limits:  
  115.             memory: 200Mi  
  116.           requests:  
  117.             cpu: 100m  
  118.             memory: 100Mi  
  119.         volumeMounts:  
  120.         – name: config  
  121.           mountPath: /etc/filebeat.yml  
  122.           readOnly: true  
  123.           subPath: filebeat.yml  
  124.         – name: data  
  125.           mountPath: /usr/share/filebeat/data  
  126.         – name: varlibdockercontainers  
  127.           mountPath: /data/docker/containers  
  128.           readOnly: true  
  129.         – name: varlog  
  130.           mountPath: /var/log  
  131.           readOnly: true  
  132.       volumes:  
  133.       – name: config  
  134.         configMap:  
  135.           defaultMode: 0600  
  136.           name: filebeat-config  
  137.       – name: varlibdockercontainers  
  138.         hostPath:  
  139.           path: /data/docker/containers  
  140.       – name: varlog  
  141.         hostPath:  
  142.           path: /var/log  
  143.       # data folder stores a registry of read status for all files, so we don’t send everything again on a Filebeat pod restart  
  144.       – name: data  
  145.         hostPath:  
  146.           path: /var/lib/filebeat-data  
  147.           type: DirectoryOrCreate  
  148. —  
  149. apiVersion: rbac.authorization.k8s.io/v1  
  150. kind: ClusterRoleBinding  
  151. metadata:  
  152.   name: filebeat  
  153. subjects:  
  154. – kind: ServiceAccount  
  155.   name: filebeat  
  156.   namespace: kube-system  
  157. roleRef:  
  158.   kind: ClusterRole  
  159.   name: filebeat  
  160.   apiGroup: rbac.authorization.k8s.io  
  161. —  
  162. apiVersion: rbac.authorization.k8s.io/v1  
  163. kind: ClusterRole  
  164. metadata:  
  165.   name: filebeat  
  166.   labels:  
  167.     k8s-app: filebeat  
  168. rules:  
  169. – apiGroups: [“”] # “” indicates the core API group  
  170.   resources:  
  171.   – namespaces  
  172.   – pods  
  173.   verbs:  
  174.   – get  
  175.   – watch  
  176.   – list  
  177. —  
  178. apiVersion: v1  
  179. kind: ServiceAccount  
  180. metadata:  
  181.   name: filebeat  
  182.   namespace: kube-system  
  183.   labels:  
  184.     k8s-app: filebeat  
  185. —  

部署filebeat

  1. kubectl apply -f filebeat-kubernetes.yaml -n kube-system  

Wed Jan 6 17:43:07 CST 2021


【AD】美国洛杉矶CN2 VPS/香港CN2 VPS/日本CN2 VPS推荐,延迟低、稳定性高、免费备份_搬瓦工vps

【AD】RackNerd 推出的 KVM VPS 特价优惠,在纽约、西雅图、圣何塞和阿什本每年仅需 12.88 美元!