容器云平台No.9~kubernetes日志收集系统EFK
EFK介绍
EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案。
通过EFK,可以把集群的所有日志收集到Elasticsearch中,然后可以对日志做分析。一般用于故障排查,数据分析等。。。
数据流示意图

官方项目
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch
小技巧,如果只希望下载github项目的某一个目录,可以使用svn,这里就只下载fluentd-elasticsearch目录,
例如需要下载的子目录为:
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/fluentd-elasticsearch
将/tree/master/换成trunk,然后使用svn下载即可
svn co https://github.com/kubernetes/kubernetes/trunk/cluster/addons/fluentd-elasticsearch
这里因为是学习,一步步安装,感兴趣的可以看官方项目
部署Elasticsearch
存储服务是基础,需要先部署,其他两个服务运行的时候需要连接es。
1、编写efk-es-statefulset.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: efk
---
kind: Service
apiVersion: v1
metadata:
name: elasticsearch-logging
namespace: efk
labels:
app: elasticsearch-logging
spec:
selector:
app: elasticsearch-logging
clusterIP: None
ports:
- port: 9200
name: rest
- port: 9300
name: inter
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch-logging
namespace: efk
spec:
serviceName: elasticsearch-logging
replicas: 3
selector:
matchLabels:
app: elasticsearch-logging
template:
metadata:
labels:
app: elasticsearch-logging
spec:
initContainers:
- name: increase-vm-max-map
image: busybox
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
- name: increase-fd-ulimit
image: busybox
command: ["sh", "-c", "ulimit -n 65536"]
securityContext:
privileged: true
containers:
- name: elasticsearch-logging
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.1
ports:
- name: rest
containerPort: 9200
- name: inter
containerPort: 9300
resources:
limits:
cpu: 1000m
requests:
cpu: 1000m
volumeMounts:
- name: elasticsearch-logging
mountPath: /usr/share/elasticsearch/data
env:
- name: cluster.name
value: k8s-logs
- name: node.name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: cluster.initial_master_nodes
value: "elasticsearch-logging-0,elasticsearch-logging-1,elasticsearch-logging-2"
- name: discovery.zen.minimum_master_nodes
value: "2"
- name: discovery.seed_hosts
value: "elasticsearch-logging"
- name: ES_JAVA_OPTS
value: "-Xms512m -Xmx512m"
- name: network.host
value: "0.0.0.0"
volumes:
- name: elasticsearch-logging
emptyDir: {}
2、执行部署命令
这里需要注意,如果长时间下载不下来镜像,可以自行先将镜像下载,要不然可能会一直不成功
本文把服务都部署到命名空间:efk
[root@k8s-master001 EFK]# kubectl apply -f efk-es-statefulset.yaml
[root@k8s-node001 EFK]# kubectl get po -n efk
NAME READY STATUS RESTARTS AGE
elasticsearch-logging-0 1/1 Running 0 10m
elasticsearch-logging-1 1/1 Running 0 10m
elasticsearch-logging-2 1/1 Running 0 9m42s
3、验证es是否正常运行
sh-4.2# curl http://localhost:9200/_cluster/state?pretty
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0{
"cluster_name" : "k8s-logs",
"cluster_uuid" : "OLzzi6sbSZG11bqBFM9z5Q",
"version" : 38,
"state_uuid" : "uFa1_QKgRAK_NJ33SArGDw",
"master_node" : "XiShXS0DSGmx0Dxp1r9vEw",
"blocks" : { },
"nodes" : {
"XN-vHccLRkaEgr9Q1cctNA" : {
"name" : "elasticsearch-logging-2",
"ephemeral_id" : "WBEY2tGNRzmc3cBDJAEP9Q",
"transport_address" : "100.108.163.2:9300",
"attributes" : {
"ml.machine_memory" : "16630661120",
"ml.max_open_jobs" : "20",
"xpack.installed" : "true",
"transform.node" : "true"
}
},
.................
以上, elasticsearch就部署好了,接下来部署kibana
部署kibana
1、编写efk-kibana.yaml
apiVersion: v1
kind: Service
metadata:
name: kibana-logging
namespace: efk
labels:
app: kibana-logging
spec:
ports:
- port: 5601
type: NodePort
selector:
app: kibana-logging
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana-logging
namespace: efk
labels:
app: kibana-logging
spec:
selector:
matchLabels:
app: kibana-logging
template:
metadata:
labels:
app: kibana-logging
spec:
containers:
- name: kibana-logging
image: docker.elastic.co/kibana/kibana:7.9.1
resources:
limits:
cpu: 1000m
requests:
cpu: 1000m
env:
- name: ELASTICSEARCH_HOSTS
value: http://elasticsearch-logging:9200
ports:
- containerPort: 5601
2、执行部署命令
[root@k8s-node001 EFK]# kubectl apply -f efk-kibana.yaml
service/kibana-logging created
deployment.apps/kibana-logging created
[root@k8s-node001 EFK]# kubectl get po,svc -n efk
NAME READY STATUS RESTARTS AGE
kibana-logging-6b5f984c44-7ljjn 1/1 Running 0 8m16s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/elasticsearch-logging ClusterIP None <none> 9200/TCP,9300/TCP 28m
service/kibana-logging NodePort 10.105.208.90 <none> 5601:32352/TCP 13m
3、验证kibana
服务以及通过NodePort暴露,通过IP+32352,可以访问到kibana web界面,如图所示

下一步,我们来部署日志收集客户端Fluentd
部署Fluentd
1、使用configmap创建fluentd配置文件
配置比较长,可以查看链接,这里就不贴出来了
https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/fluentd-elasticsearch/fluentd-es-configmap.yaml
2、执行部署
[root@k8s-node001 EFK]# kubectl appply -f fluentd-es-configmap.yaml
3、创建fluentd-es-ds.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: fluentd-es
namespace: efk
labels:
k8s-app: fluentd-es
addonmanager.kubernetes.io/mode: Reconcile
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd-es
labels:
k8s-app: fluentd-es
addonmanager.kubernetes.io/mode: Reconcile
rules:
- apiGroups:
- ""
resources:
- "namespaces"
- "pods"
verbs:
- "get"
- "watch"
- "list"
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd-es
labels:
k8s-app: fluentd-es
addonmanager.kubernetes.io/mode: Reconcile
subjects:
- kind: ServiceAccount
name: fluentd-es
namespace: efk
apiGroup: ""
roleRef:
kind: ClusterRole
name: fluentd-es
apiGroup: ""
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-es-v3.0.2
namespace: efk
labels:
k8s-app: fluentd-es
version: v3.0.2
addonmanager.kubernetes.io/mode: Reconcile
spec:
selector:
matchLabels:
k8s-app: fluentd-es
version: v3.0.2
template:
metadata:
labels:
k8s-app: fluentd-es
version: v3.0.2
spec:
securityContext:
seccompProfile:
type: RuntimeDefault
priorityClassName: system-node-critical
serviceAccountName: fluentd-es
containers:
- name: fluentd-es
image: registry.cn-qingdao.aliyuncs.com/up2cloud/fluentd:v3.0.2
env:
- name: FLUENTD_ARGS
value: --no-supervisor -q
resources:
limits:
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
- name: config-volume
mountPath: /etc/fluent/config.d
ports:
- containerPort: 24231
name: prometheus
protocol: TCP
livenessProbe:
tcpSocket:
port: prometheus
initialDelaySeconds: 5
timeoutSeconds: 10
readinessProbe:
tcpSocket:
port: prometheus
initialDelaySeconds: 5
timeoutSeconds: 10
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: config-volume
configMap:
name: fluentd-es-config-v0.2.0
4、执行部署
[root@k8s-node001 EFK]# kubectl apply -f fluentd-es-ds.yaml
5、查看部署结果
[root@k8s-node001 EFK]# kubectl get po -n efk
NAME READY STATUS RESTARTS AGE
elasticsearch-logging-0 1/1 Running 0 3h34m
elasticsearch-logging-1 1/1 Running 0 3h33m
elasticsearch-logging-2 1/1 Running 0 3h33m
fluentd-es-v3.0.2-24lbr 1/1 Running 0 26m
fluentd-es-v3.0.2-5qcsv 1/1 Running 0 26m
fluentd-es-v3.0.2-gnp58 1/1 Running 0 26m
fluentd-es-v3.0.2-gtx4s 1/1 Running 0 26m
fluentd-es-v3.0.2-mxz9t 1/1 Running 0 26m
kibana-logging-6b5f984c44-7ljjn 1/1 Running 0 3h19m
从输出信息可以看到,整套日志收集系统已经全部正常运行,现在就可以使用kibana查看收集到的日志了

至此日志收集系统搭建完毕,EFK更多用途后面会陆续介绍,也可以自行前往官网查看。

容器云平台No.9~kubernetes日志收集系统EFK的更多相关文章
- 容器云平台No.4~kubernetes 服务暴露之Ingress
这是容器云平台第四篇,接上一篇继续, 首先kubernetes服务暴露有如下几种方式: NodePort Loadbalance ClusterIP Ingress 本文紧贴第一篇架构图,只介绍Ing ...
- 容器云平台No.8~kubernetes负载均衡之ingress-nginx
Ingress 是什么? Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由. 流量路由由 Ingress 资源上定义的规则控制. 可以将 Ingress 配置为服务提供外 ...
- 容器云平台No.7~kubernetes监控系统prometheus-operator
简介 prometheus-operator Prometheus:一个非常优秀的监控工具或者说是监控方案.它提供了数据搜集.存储.处理.可视化和告警一套完整的解决方案.作为kubernetes官方推 ...
- 容器云平台No.3~kubernetes使用
今天是是第三篇,接着上一篇继续 首先,通过kubectl可以看到,三个节点都正常运行 [root@k8s-master001 ~]# kubectl get no NAME STATUS ROLES ...
- docker搭建日志收集系统EFK
EFK Elasticsearch是一个数据搜索引擎和分布式NoSQL数据库的组合,提过日志的存储和搜索功能. Fluentd是一个消息采集,转化,转发工具,目的是提供中心化的日志服务. Kibana ...
- 026.[转] 基于Docker及Kubernetes技术构建容器云平台 (PaaS)
[编者的话] 目前很多的容器云平台通过Docker及Kubernetes等技术提供应用运行平台,从而实现运维自动化,快速部署应用.弹性伸缩和动态调整应用环境资源,提高研发运营效率. 本文简要介绍了与容 ...
- 容器云平台No.1~基于Docker及Kubernetes构建的容器云平台
开篇 最近整理笔记,不知不觉发现关于kubernetes相关的笔记已经达99篇了,索性一起总结了.算是对这两年做容器云平台的一个总结,本文是开篇,先介绍下所有用到的组件.首先来看下架构图(实在画的太丑 ...
- Kubernetes容器云平台建设实践
[51CTO.com原创稿件]Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.伴随着云原生技术的迅速崛起,如今Kubernetes 事实上已经 ...
- 容器云平台No.10~通过gogs+drone+kubernetes实现CI/CD
什么是CI/CD 持续集成(Continous Intergration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成.每 ...
随机推荐
- Dubbo直连方式
目录 一.dubbo概述 1. 基本架构 2. dubbo 支持的协议 二.直连方法 三.创建服务提供者 1. 思路 1. 创建maven web 2. pom.xml 3. 创建实体 4. 创建服务 ...
- 【转】在Python的struct模块中进行数据格式转换的方法
这篇文章主要介绍了在Python的struct模块中进行数据格式转换的方法,文中还给出了C语言和Python语言的数据类型比较,需要的朋友可以参考下 Python是一门非常简洁的语言,对于数据类型的表 ...
- 0基础掌握接口测试神器-Postman
一:Postman环境搭建 1:postman是什么?Postman是一款功能强大的网页调试与发送网页HTTP请求的接口测试工具.2:postman有几种安装方式?两种,应用程序和浏览器插件 3:po ...
- Linux两台服务器mysql数据库同步
我们在做web系统部署的时候往往涉及到两台甚至多台数据库的备份,为了数据安全考虑(虽然说到底不过是一堆0 1,但是价值千金啊),所以我们还是乖乖做同步把! 1.准备两台Linux服务器(主.从) 2. ...
- [PyTorch 学习笔记] 3.1 模型创建步骤与 nn.Module
本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson3/module_containers.py 这篇文章来看下 ...
- Linux系统时间同步方法
在Windwos中,系统时间的设置很简单,界面操作,通俗易懂,而且设置后,重启,关机都没关系.系统时间会自动保存在BIOS时钟里面,启动计算机的时候,系统会自动在BIOS里面取硬件时间,以保证时间的不 ...
- e3mall商城的归纳总结3之后台商品节点、认识nginx
一 后台商品节点 大家都知道后台创建商品的时候需要选择商品的分类,而这个商品的分类就就像一棵树一样,一层包含一层又包含一层.因此这里用的框架是easyUiTree.该分类前端使用的是异步加载模式(指 ...
- 【平台开发】— 4.mysql建库建表
本想着把前端脚手架run起来了,然后就可以借着登录来捋一下前后端交互的过程.但是后端导入JPA的时候就发现了,还没有数据库. 既然是本着学习的目的,那咱也不想只在后端写死返回的数据,要做就做全套. 一 ...
- MockMvc编写单测
目录 MockMvc 注意点 code 待测试的controller 测试类 github MockMvc 注意点 1.通过spring上下文获取mockmvc对象 @BeforeEach publi ...
- Black & White(尺取)
链接:https://ac.nowcoder.com/acm/contest/893/F来源:牛客网 * 第一行一个整数 T ,表示接下来有 T 个样例.* 首先输入n,m,表示S串的长度n和操作次数 ...