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

    • 本文由 发表于 2021-01-06
    • 转载请务必保留本文链接:https://linuxeye.com/477.html
    k8s基于etcd的CoreDNS动态域名解析 k8s

    k8s基于etcd的CoreDNS动态域名解析

    本文基于已经搭建好的k8s集群,集群搭建参考:《Kubernetes集群搭建》 下载coredns yaml部署脚本 注意:如果已经部署coredns可忽略 wget https://github.c...
    Kubernetes集群搭建 k8s

    Kubernetes集群搭建

    环境说明 操作系统:CentOS7.4 64bit 软件版本:kubernetes-v1.9.9、etcd-v3.3.8、flannel-v0.10.0 下载地址: https://dl.k8s.io...
    匿名

    发表评论

    匿名网友