zoukankan      html  css  js  c++  java
  • 第十一章 Kubernetes进阶之日志收集

      参考:https://www.cnblogs.com/Dev0ps/p/10778962.html

      1.收集那些日志

      k8s系统组件日志

      k8s部署应用中的日志

      2.日志方案

      filebeat+ELK

      Log file->filebeat->logstash->elasticsearch->kibana

      3.容器中的日志怎么收集

      方案一:Node上部署一个日志收集程序

      DaemonSet方式部署日志收集程序

      对node节点的/var/log和/var/lib/docker/containers/两个目录下的日志进行采集

      方案二:Pod中附加专用日志收集的容器

      每个运行应用程序的Pod中增加一个日志收集容器,使用emptyDir共享日志目录让日志收集程序读取到

      方案三:应用程序直接推送日志

      超出Kubernetes范围

    方式 优点 缺点
    方案一

    每个Node仅需不是一个日志收集程序

    资源消耗少,对应用无侵入

    应用程序日志需要写到标准错误输出,不支持多行

    日志

    方案二 低耦合

    每个Pod启动一个日志收集代理,增加资源消耗,增加

    运维成本

    方案三 无需额外部署公交 进入应用,增加应用复杂度

      使用方案二在Pod中启动日志收集代理

      在192.168.1.61安装ELK

      安装前需要先配置java环境

    rpm -ivh elasticsearch-6.6.2.rpm kibana-6.6.2-x86_64.rpm logstash-6.6.2.rpm 
    

       elasticsearch配置文件

    # grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
    cluster.name: my-es
    node.name: node-1
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    network.host: 192.168.1.61
    http.port: 9200
    

       kibana配置文件

    # grep '^[a-Z]' /etc/kibana/kibana.yml 
    server.port: 5601
    server.host: "0.0.0.0"
    elasticsearch.hosts: ["http://192.168.1.61:9200"]
    kibana.index: ".kibana"
    

       启动

    systemctl start elasticsearch
    systemctl start kibana
    

       收集k8s日志

      1,添加logstash配置文件

    # cat /etc/logstash/conf.d/logstash-to-es.conf 
    input {
      beats {
         port => 5044
      }
    }
     
     
    filter {
    }
     
    output {
          #标签,在filebeat配置文件定义
           if [app] == "k8s" {
            if [type] == "module" {
               elasticsearch {
                  hosts => ["http://192.168.1.61:9200"]
                  index => "k8s-log-%{+YYYY.MM.dd}"
               }
            }
        }
    }
    

       2,启动logstash

    /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-to-es.conf &
    

     

       3,创建filebeat的yaml文件

    # cat k8s-logs.yaml 
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: k8s-logs-filebeat-config
      namespace: kube-system
      
    data:
      filebeat.yml: |-
        filebeat.prospectors:
          - type: log
            #挂载日志的目录
            paths:
              - /messages
            #定义日志标签
            fields:
              app: k8s
              type: module
            fields_under_root: true
        #设置输出到logstash
        output.logstash:
          hosts: ['192.168.1.61:5044']
     
    ---
     
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: k8s-logs
      namespace: kube-system
    spec:
      selector:
        matchLabels:
          project: k8s
          app: filebeat
      template:
        metadata:
          labels:
            project: k8s
            app: filebeat
        spec:
          containers:
          - name: filebeat
            #官方镜像版本号需要与ELK版本号对应
            image: docker.elastic.co/beats/filebeat:6.6.2
            args: [
              "-c", "/etc/filebeat.yml",
              "-e",
            ]
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
              limits:
                cpu: 500m
                memory: 500Mi
            securityContext:
              runAsUser: 0
            volumeMounts:
            - name: filebeat-config
              mountPath: /etc/filebeat.yml
              subPath: filebeat.yml
            - name: k8s-logs
              mountPath: /messages
          volumes:
          - name: k8s-logs
            #收集日志为node对应的日志目录
            hostPath:
              path: /var/log/messages
              type: File
          - name: filebeat-config
            configMap:
              name: k8s-logs-filebeat-config
    

       4,创建Pod

    # kubectl apply -f k8s-logs.yaml 
    configmap/k8s-logs-filebeat-config created
    daemonset.apps/k8s-logs created
    

       查看,因为部署方式采取的是DaemonSet所以在每个node上都会启动对应Pod来收集日志

    # kubectl get pod -n kube-system -o wide
    NAME                       READY   STATUS    RESTARTS   AGE     IP            NODE           NOMINATED NODE   READINESS GATES
    coredns-65589b968c-5b7xv   1/1     Running   2          3d16h   172.17.45.3   192.168.1.66   <none>           <none>
    k8s-logs-gwrgk             1/1     Running   0          37s     172.17.45.5   192.168.1.66   <none>           <none>
    k8s-logs-s5s9k             1/1     Running   0          37s     172.17.9.5    192.168.1.65   <none>           <none>
    

      ,5,kibana添加索引

       实际收集的是每个node的/var/log/message日志 挂载在容器的/message

       登录Pod对应的容器查看

     kubectl exec -it k8s-logs-gwrgk bash
    
    #查看filebeat版本
    # filebeat -version
    Flag --version has been deprecated, use version subcommand
    filebeat version 6.6.2 (amd64), libbeat 6.6.2
    #filebeat进程
    [root@k8s-logs-gwrgk filebeat]# ps -ef|grep filebeat
    root         1     0 11 02:01 ?        00:01:11 filebeat -c /etc/filebeat.yml -e
    root        47    16  0 02:12 pts/0    00:00:00 grep --color=auto filebeat
    #filebe配置文件对应刚刚yaml配置文件
    [root@k8s-logs-gwrgk filebeat]# cat /etc/filebeat.yml 
    filebeat.prospectors:
      - type: log
        #挂载日志的目录
        paths:
          - /messages
        #定义日志标签
        fields:
          app: k8s
          type: module
        fields_under_root: true
    #设置输出到logstash
    output.logstash:
      hosts: ['192.168.1.61:5044']
    

       收集nginx日志

      1,创建nginx-deployment

      默认日志路径为:/var/log/nginx

    # cat nginx-deployment.yaml 
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: nginx-demo
    #  namespace: test
    spec:
      replicas: 3
      selector:
        matchLabels:
          project: www
          app: www
      template:
        metadata:
          labels:
            project: www
            app: www
        spec:
          imagePullSecrets:
          - name: registry-pull-secret
          containers:
          - name: nginx
            image: nginx:latest
            imagePullPolicy: Always
            ports:
            - containerPort: 80
              name: web
              protocol: TCP
            resources:
              requests:
                cpu: 0.5
                memory: 256Mi
              limits:
                cpu: 1
                memory: 1Gi
            resources:
              requests:
                cpu: 0.5
                memory: 256Mi
              limits:
                cpu: 1
                memory: 1Gi
            livenessProbe:
              httpGet:
                path: /index.html
                port: 80
              initialDelaySeconds: 6
              timeoutSeconds: 20
            volumeMounts:
            - name: nginx-logs
              mountPath: /var/log/nginx/
     
          - name: filebeat
            image: docker.elastic.co/beats/filebeat:6.6.2
            args: [
              "-c", "/etc/filebeat.yml",
              "-e",
            ]
            resources:
              limits:
                memory: 500Mi
              requests:
                cpu: 100m
                memory: 100Mi
            securityContext:
              runAsUser: 0
            volumeMounts:
            - name: filebeat-config
              mountPath: /etc/filebeat.yml
              subPath: filebeat.yml
            - name: nginx-logs
              mountPath: /var/log/nginx/
     
          volumes:
          - name: nginx-logs
            emptyDir: {}
          - name: filebeat-config
            configMap:
              name: filebeat-nginx-config
    

       创建filebeat配置文件收集日志

    # cat filebeat-nginx-configmap.yaml 
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: filebeat-nginx-config
    #  namespace: test
      
    data:
      filebeat.yml: |-
        filebeat.prospectors:
          - type: log
            paths:
              - /var/log/nginx/access.log
            # tags: ["access"]
            fields:
              app: www
              type: nginx-access
            fields_under_root: true
     
          - type: log
            paths:
              - /var/log/nginx/error.log
            # tags: ["error"]
            fields:
              app: www
              type: nginx-error
            #层级放到顶级
            fields_under_root: true
     
        output.logstash:
          hosts: ['192.168.1.61:5044']
    

       应用

    kubectl apply -f nginx-deployment.yaml 
    kubectl apply -f filebeat-nginx-configmap.yaml 
    

       修改logstash配置文件

    # cat /etc/logstash/conf.d/logstash-to-es.conf
    input {
      beats {
         port => 5044
      }
    }
     
     
    filter {
    }
    
    output {
        if [app] == "www" {
            if [type] == "nginx-access" {
               elasticsearch {
                  hosts => ["http://192.168.1.61:9200"]
                  index => "nginx-access-%{+YYYY.MM.dd}"
               }
            }
            else if [type] == "nginx-error" {
               elasticsearch {
                  hosts => ["http://192.168.1.61:9200"]
                  index => "nginx-error-%{+YYYY.MM.dd}"
               }
            }
        } 
            else if [app] == "k8s" {
              if [type] == "module" {
               elasticsearch {
                  hosts => ["http://192.168.1.61:9200"]
                  index => "k8s-log-%{+YYYY.MM.dd}"
               }
            }
        }
    #  stdout { codec=> rubydebug }
    }
    

       启动logstash

     /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-to-es.conf &
    

       kibana添加索引

     

       收集的日志是nginx容器内日志,可以登录容器查看

    kubectl exec -it nginx-demo-6c6b6f7f7-4mnl8 bash
    

       没有访问日志也有健康检查的日志

    tail -f /var/log/nginx/access.log 
    

       收集Tomcat日志

      1,创建tomcat-deployment

      默认日志路径为:/usr/local/tomcat/logs

    # cat tomcat-deployment.yaml 
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: tomcat-java-demo
    #  namespace: test
    spec:
      replicas: 3
      selector:
        matchLabels:
          project: www
          app: www
      template:
        metadata:
          labels:
            project: www
            app: www
        spec:
          imagePullSecrets:
          - name: registry-pull-secret
          containers:
          - name: tomcat
            image: tomcat:latest
            imagePullPolicy: Always
            ports:
            - containerPort: 8080
              name: web
              protocol: TCP
            resources:
              requests:
                cpu: 0.5
                memory: 1Gi
              limits:
                cpu: 1
                memory: 2Gi
            livenessProbe:
              httpGet:
                path: /
                port: 8080
              initialDelaySeconds: 60
              timeoutSeconds: 20
            readinessProbe:
              httpGet:
                path: /
                port: 8080
              initialDelaySeconds: 60
              timeoutSeconds: 20
            volumeMounts:
            - name: tomcat-logs
              mountPath: /usr/local/tomcat/logs
     
          - name: filebeat
            image: docker.elastic.co/beats/filebeat:6.6.2
            args: [
              "-c", "/etc/filebeat.yml",
              "-e",
            ]
            resources:
              limits:
                memory: 500Mi
              requests:
                cpu: 100m
                memory: 100Mi
            securityContext:
              runAsUser: 0
            volumeMounts:
            - name: filebeat-config
              mountPath: /etc/filebeat.yml
              subPath: filebeat.yml
            - name: tomcat-logs
              mountPath: /usr/local/tomcat/logs
          volumes:
          - name: tomcat-logs
            emptyDir: {}
          - name: filebeat-config
            configMap:
              name: filebeat-config
    

       2,创建filebeat文件

    # cat filebeat-tomcat-configmap.yaml 
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: filebeat-config
    #  namespace: test
      
    data:
      filebeat.yml: |-
        filebeat.prospectors:
        - type: log
          paths:
            - /usr/local/tomcat/logs/catalina.*
          # tags: ["tomcat"]
          fields:
            app: www
            type: tomcat-catalina
          fields_under_root: true
          multiline:
            pattern: '^['
            negate: true
            match: after
        output.logstash:
          hosts: ['192.168.1.61:5044']
    

       应用

    kubectl apply -f tomcat-deployment.yaml 
    kubectl apply -f filebeat-tomcat-configmap.yaml 
    

       查看

       3.修改logstash配置文件

    # cat /etc/logstash/conf.d/logstash-to-es.conf
    input {
      beats {
         port => 5044
      }
    }
     
     
    filter {
    }
    
    output {
        if [app] == "www" {
            if [type] == "nginx-access" {
               elasticsearch {
                  hosts => ["http://192.168.1.61:9200"]
                  index => "nginx-access-%{+YYYY.MM.dd}"
               }
            }
            else if [type] == "nginx-error" {
               elasticsearch {
                  hosts => ["http://192.168.1.61:9200"]
                  index => "nginx-error-%{+YYYY.MM.dd}"
               }
            }
            else if [type] == "tomcat-catalina" {
               elasticsearch {
                  hosts => ["http://192.168.1.61:9200"]
                  index => "tomcat-catalina-%{+YYYY.MM.dd}"
               }
            }
        } 
            else if [app] == "k8s" {
              if [type] == "module" {
               elasticsearch {
                  hosts => ["http://192.168.1.61:9200"]
                  index => "k8s-log-%{+YYYY.MM.dd}"
               }
            }
        }
    #  stdout { codec=> rubydebug }
    }
    

       启动logstash

    /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-to-es.conf &
    

       kibana添加index

     

      

  • 相关阅读:
    宏------进阶

    公司用中会用到的iOS开源库和第三方组件(不断更新...)
    iOS 开发者旅途中的指南针
    国际化
    Block
    git简单使用教程
    XCode自带解析SAX解析
    GDataXMLNode解析XML
    Predicate
  • 原文地址:https://www.cnblogs.com/minseo/p/12469176.html
Copyright © 2011-2022 走看看