K8S学习笔记之k8s日志收集实战
0x00 简介
本文主要介绍在k8s中收集应用的日志方案,应用运行中日志,一般情况下都需要收集存储到一个集中的日志管理系统中,可以方便对日志进行分析统计,监控,甚至用于机器学习,智能分析应用系统问题,及时修复应用所存在的问题。
在k8s集群中应用一般有如下日志输出方式
- 直接遵循docker官方建议把日志输出到标准输出或者标准错误输出
- 输出日志到容器内指定目录中
- 应用直接发送日志给日志收集系统
本文会综合部署上述日志收集方案。
日志收集组件说明
- elastisearch 存储收集到的日志
- kibana 可视化收集到的日志
- logstash 汇总处理日志发送给elastisearch 存储
- filebeat 读取容器或者应用日志文件处理发送给elastisearch或者logstash,也可用于汇总日志
- fluentd 读取容器或者应用日志文件处理发送给elastisearch,也可用于汇总日志
- fluent-bit 读取容器或者应用日志文件处理发送给elastisearch或者fluentd
0x01 部署
# 本次实验使用了3台虚拟机做k8s集群,每台虚拟机3G内存
部署前的准备
# 拉取文件
git clone https://github.com/mgxian/k8s-log.git
cd k8s-log
git checkout v1 # 创建 logging namespace
kubectl apply -f logging-namespace.yaml
部署elastisearch
# 本次部署虽然使用 StatefulSet 但是没有使用pv进行持久化数据存储
# pod重启之后,数据会丢失,生产环境一定要使用pv持久化存储数据 # 部署
kubectl apply -f elasticsearch.yaml # 查看状态
kubectl get pods,svc -n logging -o wide # 等待所有pod变成running状态
# 访问测试
# 如果测试都有数据返回代表部署成功
kubectl run curl -n logging --image=radial/busyboxplus:curl -i --tty
nslookup elasticsearch-logging
curl 'http://elasticsearch-logging:9200/_cluster/health?pretty'
curl 'http://elasticsearch-logging:9200/_cat/nodes'
exit # 清理测试
kubectl delete deploy curl -n logging
部署kibana
# 部署
kubectl apply -f kibana.yaml # 查看状态
kubectl get pods,svc -n logging -o wide # 访问测试
# 浏览器访问下面输出的地址 看到 kibana 界面代表正常
# 11.11.11.112 为集群中某个 node 节点ip
KIBANA_NODEPORT=$(kubectl get svc -n logging | grep kibana-logging | awk '{print $(NF-1)}' | awk -F[:/] '{print $2}')
echo "http://11.11.11.112:$KIBANA_NODEPORT/"
部署fluentd收集日志
# fluentd 以 daemoset 方式部署
# 在每个节点上启动fluentd容器,收集k8s组件,docker以及容器的日志 # 给每个需要启动fluentd的节点打相关label
# kubectl label node lab1 beta.kubernetes.io/fluentd-ds-ready=true
kubectl label nodes --all beta.kubernetes.io/fluentd-ds-ready=true # 部署
kubectl apply -f fluentd-es-configmap.yaml
kubectl apply -f fluentd-es-ds.yaml # 查看状态
kubectl get pods,svc -n logging -o wide
kibana查看日志
# 创建index fluentd-k8s-*,由于需要拉取镜像启动容器,可能需要等待几分钟才能看到索引和数据
# 查看日志
0x03 应用日志收集测试
应用日志输出到标准输出测试
# 启动测试日志输出
kubectl run echo-test --image=radial/busyboxplus:curl -- sh -c 'count=1;while true;do echo log to stdout $count;sleep 1;count=$(($count+1));done' # 查看状态
kubectl get pods -o wide # 命令行查看日志
ECHO_TEST_POD=$(kubectl get pods | grep echo-test | awk '{print $1}')
kubectl logs -f $ECHO_TEST_POD # 刷新 kibana 查看是否有新日志进入
应用日志输出到容器指定目录(filebeat收集)
# 部署
kubectl apply -f log-contanier-file-filebeat.yaml # 查看
kubectl get pods -o wide
# 添加index filebeat-k8s-* 查看日志
应用日志输出到容器指定目录(fluent-bit收集)
# 部署
kubectl apply -f log-contanier-file-fluentbit.yaml # 查看
kubectl get pods -o wide
# 添加index fluentbit-k8s-* 查看日志
应用直接发送日志到日志系统
# 本次测试应用直接输出日志到 elasticsearch # 部署
kubectl apply -f log-contanier-es.yaml # 查看
kubectl get pods -o wide
# 添加index k8s-app-* 查看日志
# 本次测试应用直接输出日志到 elasticsearch # 部署
kubectl apply -f log-contanier-es.yaml # 查看
kubectl get pods -o wide
# 添加index k8s-app-* 查看日志
清理
kubectl delete -f log-contanier-es.yaml
kubectl delete -f log-contanier-file-fluentbit.yaml
kubectl delete -f log-contanier-file-filebeat.yaml
kubectl delete deploy echo-test
K8S学习笔记之k8s日志收集实战的更多相关文章
- 【K8s学习笔记】K8s是如何部署应用的?
本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...
- K8S学习笔记之kubernetes 日志架构
0x00 概述 应用程序和系统日志可以帮助我们了解集群内部的运行情况,日志对于我们调试问题和监视集群情况也是非常有用的.而且大部分的应用都会有日志记录,对于传统的应用大部分都会写入到本地的日志文件之中 ...
- 学习笔记:分布式日志收集框架Flume
业务现状分析 WebServer/ApplicationServer分散在各个机器上,想在大数据平台hadoop上进行统计分析,就需要先把日志收集到hadoop平台上. 思考:如何解决我们的数据从其他 ...
- K8S学习笔记之k8s使用ceph实现动态持久化存储
0x00 概述 本文章介绍如何使用ceph为k8s提供动态申请pv的功能.ceph提供底层存储功能,cephfs方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ...
- K8S学习笔记之K8S日志搜集实战
详细参考这篇文章,几乎覆盖了了K8S的各种日志搜集方案 https://juejin.im/post/5b6eaef96fb9a04fa25a0d37#heading-8
- Andorid:日常学习笔记(3)——掌握日志工具的使用
Andorid:日常学习笔记(3)——掌握日志工具的使用 使用Android的日志工具Log 方法: Android中的日志工具类为Log,这个类提供了如下方法来供我们打印日志: 使用方法: Log. ...
- k8s 学习笔记
常用的kubectl命令 kubectl run kubia --image=luksa/kubia --port=8080 --generator=run/v1 --image 指定镜像 - ...
- K8S学习笔记之Kubernetes核心概念
0x00 Kubernetes简介 Kubernetes(K8S)是Google开源的容器集群管理系统,其设计源于Google在容器编排方面积累的丰富经验,并结合社区创新的最佳实践. K8S在Doc ...
- 【k8s学习笔记】使用 kubeadm 部署 v1.18.5 版本 Kubernetes集群
说明 本文系搭建kubernetes v1.18.5 集群笔记,使用三台虚拟机作为 CentOS 测试机,安装kubeadm.kubelet.kubectl均使用yum安装,网络组件选用的是 flan ...
随机推荐
- Docker-堆栈stack(6)
堆栈(Stack)的概念: 堆栈是一组相互关联的服务,它们共享依赖关系,并且可以协调和缩放在一起.单个堆栈能够定义和协调整个应用程序的功能,但是非常复杂的应用程序可能希望使用多个堆栈. 下面我们就开始 ...
- IE 浏览器旧版本下载
1. http://www.oldversion.com/windows/internet-explorer/ IE10 浏览器 32bit & 64 bit:下载 2. https://ww ...
- tensorflow 在windows下的安装
anaconda3 python3.5 tensorflow 在 windows下的安装 1.安装Anaconda 清华的镜像:https://mirrors.tuna.tsinghua.edu.cn ...
- 1.7 flask 的组件 wtfroms使用
2019-1-7 17:59:37 还有两天左右flask就结束啦!昨晚逛了一下吾爱破解还有慕课,发现有三个意外项目, Django生鲜项目,flask电影网站项目,vue美团网项目,都保存百度云啦, ...
- oracle 自定义比较函数
1>自定义比较函数,targetVal的值为字符串,例如:“>=90”,"2~8"等范围格式,dataVal值为字符串. create or replace funct ...
- python 获取本机ip
有的设备上,有host相关配置,或者网络环境特殊,导致从hostname获取ip不符合预期. 如下函数整合了多种获取ip的方式,大部分情况都可涵盖,一般情况下可以满足需求~ 核心是创建一个UDP协议下 ...
- @staticmethod和classmethod
之前一直搞不清楚这两个类方法有什么区别,今天着重学习了一下 @staticmethod是静态方法,不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样. class C(object): ...
- php(数组方法
什么是数组? 数组就是一组数据的集合 其表现形式就是内存中的一段连续的内存地址 数组名称其实就是连续内存地址的首地址 关于js中的数组特点 数组定义时无需指定数据类型 数组定义时可以无需指定数组长度 ...
- height:100%
子元素的高度设置为height:100%时 继承父元素的高度为border+height 子元素的高度为height: 此时父元素的 box-sizing:content-box: border-bo ...
- 20175320 2018-2019-2 《Java程序设计》第3周学习总结
20175320 2018-2019-2 <Java程序设计>第3周学习总结 教材学习内容总结 本周学习了教材的第四章的内容.在这章中介绍了面向对象编程的概念以及Java编程中的类与对象, ...