使用ELK Stack收集Kubernetes平台中日志与可视化

  • K8S系统的组件日志
  • K8S Cluster里面部署的应用程序日志

日志系统:

ELK安装
  1. 安装jdk
  2. [root@localhost ~]# yum install java-1.8.-openjdk
  3. [root@localhost ~]# java -version
  4. openjdk version "1.8.0_212"
  5. OpenJDK Runtime Environment (build 1.8.0_212-b04)
  6. OpenJDK -Bit Server VM (build 25.212-b04, mixed mode)
  7.  
  8. 安装elk组件
  9. [root@localhost ~]# yum install elasticsearch logstash kibana
  10. 启动es
  11. [root@localhost ~]# systemctl start elasticsearch
  12.  
  13. 启动kibana
  14. [root@localhost ~]# vim /etc/kibana/kibana.yml
  15. server.host: "0.0.0.0"
  16. elasticsearch.hosts: ["http://localhost:9200"]
  17. [root@localhost ~]# systemctl start kibana
  18.  
  19. 启动logstash
  20. [root@localhost ~]# cat /etc/logstash/conf.d/logstash-to-es.conf
  21. input {
      beats {
        port => 5044
      }
    }
  22.  
  23. filter {
    }
  24.  
  25. output {
        if [app] == "www" {
        if [type] == "nginx-access" {
             elasticsearch {
            hosts => ["http://127.0.0.1:9200"]
            index => "nginx-access-%{+YYYY.MM.dd}"
                 }
        }
        else if [type] == "nginx-error" {
            elasticsearch {
                    hosts => ["http://127.0.0.1:9200"]
                    index => "nginx-error-%{+YYYY.MM.dd}"
                 }
        }
            else if [type] == "tomcat-catalina" {
                elasticsearch {
                    hosts => ["http://127.0.0.1:9200"]
                    index => "tomcat-catalina-%{+YYYY.MM.dd}"
                 }
            }
        }
            else if [app] == "k8s" {
            if [type] == "module" {
            elasticsearch {
                hosts => ["http://127.0.0.1:9200"]
                index => "k8s-log-%{+YYYY.MM.dd}"
            }
            }
            }
        stdout { codec => rubydebug }
    }
  26. [root@localhost ~]# /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash-to-es.conf

启动收集日志的容器(filebeat)

  1. [root@localhost elk]# cat k8s-logs.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: k8s-logs-filebeat-config
  6. namespace: kube-system
  7.  
  8. data:
  9. filebeat.yml: |-
  10. filebeat.prospectors:
  11. - type: log
  12. paths:
  13. - /messages
  14. fields:
  15. app: k8s
  16. type: module
  17. fields_under_root: true
  18.  
  19. output.logstash:
  20. hosts: ['192.168.0.225:5044']
  21.  
  22. ---
  23.  
  24. apiVersion: apps/v1
  25. kind: DaemonSet
  26. metadata:
  27. name: k8s-logs
  28. namespace: kube-system
  29. spec:
  30. selector:
  31. matchLabels:
  32. project: k8s
  33. app: filebeat
  34. template:
  35. metadata:
  36. labels:
  37. project: k8s
  38. app: filebeat
  39. spec:
  40. containers:
  41. - name: filebeat
  42. image: docker.elastic.co/beats/filebeat:6.4.
  43. args: [
  44. "-c", "/etc/filebeat.yml",
  45. "-e",
  46. ]
  47. resources:
  48. requests:
  49. cpu: 100m
  50. memory: 100Mi
  51. limits:
  52. cpu: 500m
  53. memory: 500Mi
  54. securityContext:
  55. runAsUser:
  56. volumeMounts:
  57. - name: filebeat-config
  58. mountPath: /etc/filebeat.yml
  59. subPath: filebeat.yml
  60. - name: k8s-logs
  61. mountPath: /messages
  62. volumes:
  63. - name: k8s-logs
  64. hostPath:
  65. path: /var/log/messages
  66. type: File
  67. - name: filebeat-config
  68. configMap:
  69. name: k8s-logs-filebeat-config
  70.  
  71. [root@localhost elk]# kubectl apply -f k8s-logs.yaml
  72. configmap/k8s-logs-filebeat-config created
  73. [root@localhost elk]# kubectl get pod -n kube-system
  74. NAME READY STATUS RESTARTS AGE
  75. alertmanager-6b5bbd5bd4-lgjn8 / Running 7d4h
  76. coredns-5b8c57999b-z9jh8 / Running 28d
  77. grafana- / Running 10d
  78. k8s-logs-b6f4v / Running 6m30s
  79. k8s-logs-lz5pn / Running 6m30s
  80. k8s-logs-pj8kj / Running 6m30s
  81. kube-state-metrics-f86fd9f4f-j4rdc / Running 7d7h
  82. kubernetes-dashboard-644c96f9c6-bvw8w / Running 28d
  83. prometheus- / Running 7d3h

访问kibana,添加index

容器中的日志怎么收集

方式

优点

缺点

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

每个Node仅需部署一个日志收集程序,资源消耗少,对应用无侵入

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

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

低耦合

每个Pod启动一个日志收集代理,增加资源消耗,并增加运维维护成本

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

无需额外收集工具

浸入应用,增加应用复杂度

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

nginx日志收集

  1. [root@localhost elk]# cat filebeat-nginx-configmap.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: filebeat-nginx-config
  6. namespace: test
  7.  
  8. data:
  9. filebeat.yml: |-
  10. filebeat.prospectors:
  11. - type: log
  12. paths:
  13. - /usr/local/nginx/logs/access.log
  14. # tags: ["access"]
  15. fields:
  16. app: www
  17. type: nginx-access
  18. fields_under_root: true
  19.  
  20. - type: log
  21. paths:
  22. - /usr/local/nginx/logs/error.log
  23. # tags: ["error"]
  24. fields:
  25. app: www
  26. type: nginx-error
  27. fields_under_root: true
  28.  
  29. output.logstash:
  30. hosts: ['192.168.0.225:5044']
  31. [root@localhost elk]# kubectl apply -f filebeat-nginx-configmap.yaml
  32. configmap/filebeat-nginx-config unchanged
  33.  
  34. [root@localhost elk]# cat nginx-deployment.yaml
  35. apiVersion: apps/v1beta1
  36. kind: Deployment
  37. metadata:
  38. name: php-demo
  39. namespace: test
  40. spec:
  41. replicas:
  42. selector:
  43. matchLabels:
  44. project: www
  45. app: php-demo
  46. template:
  47. metadata:
  48. labels:
  49. project: www
  50. app: php-demo
  51. spec:
  52. imagePullSecrets:
  53. - name: registry-pull-secret
  54. containers:
  55. - name: nginx
  56. image: 192.168.0.223/project/nginx:v1
  57. imagePullPolicy: Always
  58. ports:
  59. - containerPort:
  60. name: web
  61. protocol: TCP
  62. resources:
  63. requests:
  64. cpu: 0.5
  65. memory: 256Mi
  66. limits:
  67. cpu:
  68. memory: 1Gi
  69. resources:
  70. requests:
  71. cpu: 0.5
  72. memory: 256Mi
  73. limits:
  74. cpu:
  75. memory: 1Gi
  76. livenessProbe:
  77. httpGet:
  78. path: /status.php
  79. port:
  80. initialDelaySeconds:
  81. timeoutSeconds:
  82. volumeMounts:
  83. - name: nginx-logs
  84. mountPath: /usr/local/nginx/logs
  85.  
  86. - name: filebeat
  87. image: docker.elastic.co/beats/filebeat:6.4.
  88. args: [
  89. "-c", "/etc/filebeat.yml",
  90. "-e",
  91. ]
  92. resources:
  93. limits:
  94. memory: 500Mi
  95. requests:
  96. cpu: 100m
  97. memory: 100Mi
  98. securityContext:
  99. runAsUser:
  100. volumeMounts:
  101. - name: filebeat-config
  102. mountPath: /etc/filebeat.yml
  103. subPath: filebeat.yml
  104. - name: nginx-logs
  105. mountPath: /usr/local/nginx/logs
  106.  
  107. volumes:
  108. - name: nginx-logs
  109. emptyDir: {}
  110. - name: filebeat-config
  111. configMap:
  112. name: filebeat-nginx-config
  113. [root@localhost elk]# kubectl apply -f nginx-deployment.yaml
  114. deployment.apps/php-demo configured

tomcat日志收集

  1. [root@localhost elk]# cat filebeat-tomcat-configmap.yaml
  2. apiVersion: v1
  3. kind: ConfigMap
  4. metadata:
  5. name: filebeat-config
  6. namespace: test
  7.  
  8. data:
  9. filebeat.yml: |-
  10. filebeat.prospectors:
  11. - type: log
  12. paths:
  13. - /usr/local/tomcat/logs/catalina.*
  14. # tags: ["tomcat"]
  15. fields:
  16. app: www
  17. type: tomcat-catalina
  18. fields_under_root: true
  19. multiline:
  20. pattern: '^\['
  21. negate: true
  22. match: after
  23. output.logstash:
  24. hosts: ['192.168.0.225:5044']
  25. [root@localhost elk]# kubectl apply -f filebeat-tomcat-configmap.yaml
  26. configmap/filebeat-config created
  27.  
  28. [root@localhost elk]# cat tomcat-deployment.yaml
  29. apiVersion: apps/v1beta1
  30. kind: Deployment
  31. metadata:
  32. name: tomcat-java-demo
  33. namespace: test
  34. spec:
  35. replicas:
  36. selector:
  37. matchLabels:
  38. project: www
  39. app: java-demo
  40. template:
  41. metadata:
  42. labels:
  43. project: www
  44. app: java-demo
  45. spec:
  46. imagePullSecrets:
  47. - name: registry-pull-secret
  48. containers:
  49. - name: tomcat
  50. image: 192.168.0.223/project/tomcat-java-demo:latest
  51. imagePullPolicy: Always
  52. ports:
  53. - containerPort:
  54. name: web
  55. protocol: TCP
  56. resources:
  57. requests:
  58. cpu: 0.5
  59. memory: 1Gi
  60. limits:
  61. cpu:
  62. memory: 2Gi
  63. livenessProbe:
  64. httpGet:
  65. path: /
  66. port:
  67. initialDelaySeconds:
  68. timeoutSeconds:
  69. readinessProbe:
  70. httpGet:
  71. path: /
  72. port:
  73. initialDelaySeconds:
  74. timeoutSeconds:
  75. volumeMounts:
  76. - name: tomcat-logs
  77. mountPath: /usr/local/tomcat/logs
  78.  
  79. - name: filebeat
  80. image: docker.elastic.co/beats/filebeat:6.4.
  81. args: [
  82. "-c", "/etc/filebeat.yml",
  83. "-e",
  84. ]
  85. resources:
  86. limits:
  87. memory: 500Mi
  88. requests:
  89. cpu: 100m
  90. memory: 100Mi
  91. securityContext:
  92. runAsUser:
  93. volumeMounts:
  94. - name: filebeat-config
  95. mountPath: /etc/filebeat.yml
  96. subPath: filebeat.yml
  97. - name: tomcat-logs
  98. mountPath: /usr/local/tomcat/logs
  99. volumes:
  100. - name: tomcat-logs
  101. emptyDir: {}
  102. - name: filebeat-config
  103. configMap:
  104. name: filebeat-config
  105. [root@localhost elk]# kubectl apply -f tomcat-deployment.yaml
  106. deployment.apps/tomcat-java-demo created

kubernetes-平台日志收集(ELK)的更多相关文章

  1. Kubernetes 常用日志收集方案

    Kubernetes 常用日志收集方案 学习了 Kubernetes 集群中监控系统的搭建,除了对集群的监控报警之外,还有一项运维工作是非常重要的,那就是日志的收集. 介绍 应用程序和系统日志可以帮助 ...

  2. 日志收集ELK+kafka相关博客

    SpringBoot+kafka+ELK分布式日志收集 使用 logstash + kafka + elasticsearch 实现日志监控 Kibana 安装 与 汉化 windows系统安装运行f ...

  3. Kubernetes容器日志收集

    日志采集方式 日志从传统方式演进到容器方式的过程就不详细讲了,可以参考一下这篇文章Docker日志收集最佳实践,由于容器的漂移.自动伸缩等特性,日志收集也就必须使用新的方式来实现,Kubernetes ...

  4. ELK构建MySQL慢日志收集平台详解

    上篇文章<中小团队快速构建SQL自动审核系统>我们完成了SQL的自动审核与执行,不仅提高了效率还受到了同事的肯定,心里美滋滋.但关于慢查询的收集及处理也耗费了我们太多的时间和精力,如何在这 ...

  5. ELK分布式日志收集搭建和使用

    大型系统分布式日志采集系统ELK全框架 SpringBootSecurity1.传统系统日志收集的问题2.Logstash操作工作原理3.分布式日志收集ELK原理4.Elasticsearch+Log ...

  6. Kubernetes实战之部署ELK Stack收集平台日志

    主要内容 1 ELK概念 2 K8S需要收集哪些日志 3 ELK Stack日志方案 4 容器中的日志怎么收集 5 K8S平台中应用日志收集 准备环境 一套正常运行的k8s集群,kubeadm安装部署 ...

  7. ELK+Kafka 企业日志收集平台(一)

    背景: 最近线上上了ELK,但是只用了一台Redis在中间作为消息队列,以减轻前端es集群的压力,Redis的集群解决方案暂时没有接触过,并且Redis作为消息队列并不是它的强项:所以最近将Redis ...

  8. FILEBEAT+ELK日志收集平台搭建流程

    filebeat+elk日志收集平台搭建流程 1.         整体简介: 模式:单机 平台:Linux - centos - 7 ELK:elasticsearch.logstash.kiban ...

  9. ELK Stack 企业级日志收集平台

    ELK Stack介绍 大型项目,多产品线的日志收集 ,分析平台 为什么用ELK? 1.开发人员排查问题,服务器上查看权限 2.项目多,服务器多,日志类型多 ELK 架构介绍 数据源--->lo ...

  10. ELK:日志收集分析平台

    简介 ELK是一个日志收集分析的平台,它能收集海量的日志,并将其根据字段切割.一来方便供开发查看日志,定位问题:二来可以根据日志进行统计分析,通过其强大的呈现能力,挖掘数据的潜在价值,分析重要指标的趋 ...

随机推荐

  1. 数据库路由中间件MyCat - 源代码篇(9)

    此文已由作者张镐薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3. 连接模块 3.5 后端连接 3.5.1 后端连接获取与负载均衡 上一节我们讲了后端连接的基本建立和响应 ...

  2. 蓝桥杯T32(树的直径)

    题目链接:http://lx.lanqiao.cn/problem.page?gpid=T32 题意:中文题诶- 思路:显然给出的地图是一颗树,若能求得树的直径 ans,则答案为:ans*(ans+1 ...

  3. Hyperledger Fabric (1.0)环境部署 chaincode【转】

    三.测试Fabric 其实我们在前面运行./network_setup.sh up的时候系统已经运行了一个Example02的ChainCode测试,部署上去的ChainCodeName是mycc,所 ...

  4. 2015 Noip提高组 Day1

    P2615 神奇的幻方 [题目描述] 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: ...

  5. Tyvj P1520 树的直径

    P1520 树的直径 http://www.tyvj.cn/p/1520 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结 ...

  6. criteria用法

    Criteria Query通过面向对象化的设计,将数据查询条件封装为一个对象.简单来讲,Criteria Query可以看作是传统SQL的对象化表示,如: Java代码   Criteria cri ...

  7. 项目模板eShopOnContainers

    .NET Core多平台项目模板eShopOnContainers编译手记   之前写了一个功能性的文件上传asp.net core的小程序,加上点七七八八的东西,勉强能够应付了,打算学习一下微软的官 ...

  8. 072 Edit Distance 编辑距离

    给出两个单词 word1 和 word2,找出将 word1 转换成 word2 所使用的最少的步骤数 (每个操作记为一步).你可以对一个单词进行以下三种操作:a) 插入一个字符b) 删除一个字符c) ...

  9. C语言-字符操作函数

    1字符数组的初始化: 1.1 char string={'c','h','i','n','a'} 1.2char string={"china"}或者去掉{}即char strin ...

  10. 关于编译错误ambiguous call of overridden pre R14 auto-imported BIF get/1

    今天写代码用到了进程字典,出现了一个编译错误 根据相关提示改成了erlang:put erlang/get以后即编译通过