如今越来越多的应用部署在容器之中,如何收集日志也是一个很重要的问题。服务出问题了,排查问题需要给开发看日志。服务一般会在多个不同的 pod 中,一个一个的登进去看也的确不方便。业务数据统计也需要日志。因此日志收集很重要。今天就来试着部署一下业内常用的 k8s 日志收集方案 EFK。

E - elasticsearch

F - fluentd / filebeat

K - kibana

参考: https://github.com/easzlab/kubeasz/blob/master/docs/guide/efk.md

下面就直接是部署步骤:

1. clone 脚本

git clone https://github.com/easzlab/kubeasz.git
cd kubeasz
git checkout 2.2.3

2. 修改镜像版本

脚本中默认的 elasticsearch / kibana 是 6.x 版本. 这里我们修改为 7.x 版本
# manifests/efk/kibana-deployment.yaml
image: registry.cn-shanghai.aliyuncs.com/ninejy/kibana-oss:7.4.2 # manifests/efk/es-static-pv/es-statefulset.yaml
image: registry.cn-shanghai.aliyuncs.com/ninejy/elasticsearch:v7.4.3 # manifests/efk/fluentd-es-ds.yaml
image: registry.cn-shanghai.aliyuncs.com/ninejy/fluentd:v3.1.0

3. 安装并配置 nfs

# ubuntu 16.04
apt-get update && apt-get install -y nfs-kernel-server nfs-common # cat /etc/exports
/data *(insecure,rw,sync,no_root_squash,no_all_squash,no_subtree_check) # start nfs server
systemctl start nfs-kernel-server.service

4. 配置 pv

# cat manifests/efk/es-static-pv/es-pv0.yaml
# IP 根据实际的来写
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-es-0
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: "es-storage-class"
nfs:
path: /data/es00
server: 10.31.0.18 # cat manifests/efk/es-static-pv/es-pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-es-1
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: "es-storage-class"
nfs:
path: /data/es01
server: 10.31.0.18 # cat manifests/efk/es-static-pv/es-pv2.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-es-2
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
volumeMode: Filesystem
persistentVolumeReclaimPolicy: Recycle
storageClassName: "es-storage-class"
nfs:
path: /data/es02
server: 10.31.0.18 # create directory
mkdir -p /data/{es00,es01,es02} # manifests/efk/es-static-pv/es-statefulset.yaml
# 修改 volumeClaimTemplates 下面的 storage 容量, 跟上面创建的 pv 容量保持一致
volumeClaimTemplates:
- metadata:
name: elasticsearch-logging
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: "es-storage-class"
resources:
requests:
storage: 5Gi

5. 执行脚本创建 efk

kubectl apply -f manifests/efk/
kubectl apply -f manifests/efk/es-static-pv/

6. 验证

kubectl get pods -n kube-system|grep -E 'elasticsearch|fluentd|kibana'
kubectl get pv
kubectl get pvc --all-namespaces # 强制删除 pv
# kubectl patch pv pv-name -p '{"metadata":{"finalizers":null}}'

说明: 这个方案只能搜集容器标准输出的日志, 如果需要搜集文件日志,可以使用阿里云开源的 log-pilot

下面是 log-pilot 的部署步骤:

7. 修改镜像, 默认的镜像使用 filebeat-6.x, 这跟 elasticsearch-7.x 不兼容。

# manifests/efk/log-pilot/log-pilot-filebeat.yaml
image: registry.cn-shanghai.aliyuncs.com/ninejy/log-pilot:0.9.7-filebeat-oss-7.4.2

8. 执行命令创建 Daemonset

kubectl apply -f manifests/efk/log-pilot/log-pilot-filebeat.yaml

9. 验证

kubectl -n kube-system get pods | grep log-pilot

10. 部署应用测试日志收集

# myapp-test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-test
spec:
replicas: 3
selector:
matchLabels:
app: myapp-test
template:
metadata:
labels:
app: myapp-test
spec:
containers:
- name: myapp-container
image: registry.cn-shanghai.aliyuncs.com/ninejy/hello:v5
ports:
- containerPort: 80
env:
- name: aliyun_logs_myappStdout
value: "stdout"
- name: aliyun_logs_myappFile
value: "/var/log/app/*.log"
volumeMounts:
- name: myapp-log
mountPath: /var/log/app
volumes:
- name: myapp-log
emptyDir: {}

部署测试应用并访问一下刚部署的应用,使生成一些日志

kubectl apply -f myapp-test.yaml

kubectl get pod -o wide
# myapp-test-b5bf9975-nz2kk 1/1 Running 0 143m 172.20.2.7 192.168.0.63 curl 172.20.2.7:28080
# [2021-03-14 13:30:48] Version --> v5.0, Hostname --> myapp-test-b5bf9975-nz2kk # 获取 kibana 访问地址
kubectl cluster-info | grep kibana

浏览器打开 kibana 访问地址,创建 'index pattern', 之后就能看到应用的日志已经到 elasticsearch 中了

补充:通过 Api-server 访问 kibana (dashboard 一样的)

# 获取客户端证书, 进行 base64 解码后保存到 kubecfg.crt
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d > kubecfg.crt # 获取客户端公钥, 进行 base64 解码后保存到 kubecfg.key
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d > kubecfg.key # 提取 kubecfg.crt 和 kubecfg.key 文件内容, 生成 P12 安全证书, 并保存到 kubecfg.p12 文件
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client" # 说明: 生成安全证书时, 需要设置提取密码, 你可以设置自定义密码或设置密码为空 # 将安全证书下载到本地, 以 Windows10 操作系统为例, 证书的安装步骤如下
# 1. 双击证书文件, 弹出证书导入向导对话框, 确定要导入的证书文件
# 2. 输入生成安全证书时设置的自定义密码
# 3. 设置证书保存位置
# 4. 完成证书导入 # kubectl cluster-info | grep kibana # 这条命令获取 kibana 的访问地址
# https://192.168.0.61:6443/api/v1/namespaces/kube-system/services/kibana-logging/proxy
# 浏览器输入上面获取的地址即可访问 kibana

更多详细的 log-pilot 介绍请参考文档

阿里云介绍文档: https://help.aliyun.com/document_detail/86552.html

介绍文档2: https://yq.aliyun.com/articles/674327

k8s 日志收集之 EFK的更多相关文章

  1. k8s日志收集方案

    k8s日志收集方案 三种收集方案的优缺点: 下面我们就实践第二种日志收集方案: 一.安装ELK 下面直接采用yum的方式安装ELK(源码包安装参考:https://www.cnblogs.com/De ...

  2. k8s日志收集及存档

    k8s日志收集架构图 利用阿里开源的工具log-pilot,往kafka内写日志,然后吐一份至es,另外一份用flume消费kafka数据落盘

  3. 容器云平台No.9~kubernetes日志收集系统EFK

    EFK介绍 EFK,全称Elasticsearch Fluentd Kibana ,是kubernetes中比较常用的日志收集方案,也是官方比较推荐的方案. 通过EFK,可以把集群的所有日志收集到El ...

  4. K8S学习笔记之k8s日志收集实战

    0x00 简介 本文主要介绍在k8s中收集应用的日志方案,应用运行中日志,一般情况下都需要收集存储到一个集中的日志管理系统中,可以方便对日志进行分析统计,监控,甚至用于机器学习,智能分析应用系统问题, ...

  5. k8s日志收集配置

    容器日志样例 172.101.32.1 - - [03/Jun/2019:17:14:10 +0800] "POST /ajaxVideoQueues!queryAllUser.action ...

  6. docker搭建日志收集系统EFK

    EFK Elasticsearch是一个数据搜索引擎和分布式NoSQL数据库的组合,提过日志的存储和搜索功能. Fluentd是一个消息采集,转化,转发工具,目的是提供中心化的日志服务. Kibana ...

  7. Kubernetes 系列(八):搭建EFK日志收集系统

    Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch.Fluentd 和 Kibana(EFK)技术栈,也是官方现在比较推荐的一种方案. Elasticsearch 是一个 ...

  8. 微服务从代码到k8s部署应有尽有系列(十一、日志收集)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  9. 关于K8s集群器日志收集的总结

    本文介绍了kubernetes官方提供的日志收集方法,并介绍了Fluentd日志收集器并与其他产品做了比较.最后介绍了好雨云帮如何对k8s进行改造并使用ZeroMQ以消息的形式将日志传输到统一的日志处 ...

随机推荐

  1. 牛客网-Beautiful Land 【01背包 + 思维】

    链接:https://www.nowcoder.com/acm/contest/119/F来源:牛客网 Now HUST got a big land whose capacity is C to p ...

  2. HDU 6611 K Subsequence(Dijkstra优化费用流 模板)题解

    题意: 有\(n\)个数\(a_1\cdots a_n\),现要你给出\(k\)个不相交的非降子序列,使得和最大. 思路: 费用流建图,每个点拆点,费用为\(-a[i]\),然后和源点连边,和后面非降 ...

  3. C语言中函数的调用方式

    第一眼看到这样一个题目的我,心想除了如下的直接调用还能怎么调用呢? 1 void fun(void) 2 { 3 ...... 4 //你的代码 5 ..... 6 } 7 int main(void ...

  4. 微信分享 API

    微信分享 API https://market.cmbchina.com/MPage/online/190416201200302/wechatShare.js /* * 注意: * 1. 所有的JS ...

  5. css skeleton & web app skeleton

    css skeleton & web app skeleton skeleton https://www.cnblogs.com/xgqfrms/p/10437258.html https:/ ...

  6. [转]关于特征点法、直接法、光流法slam的对比

    转载网址:https://blog.csdn.net/weixin_38203573/article/details/79787499 特征点法: 通过特征点匹配来跟踪点,计算几何关系得到R,t,BA ...

  7. [转]基于ROS平台的移动机器人-4-通过ROS利用键盘控制小车移动

    原文出处: https://blog.csdn.net/Forrest_Z/article/details/55002484 准备工作 1.下载串口通信的ROS包 (1)cd ~/catkin_ws/ ...

  8. Java中的CPU占用高和内存占用高的问题排查

    下面通过模拟实例分析排查Java应用程序CPU和内存占用过高的过程.如果是Java面试,这2个问题在面试过程中出现的概率很高,所以我打算在这里好好总结一下. 1.Java CPU过高的问题排查 举个例 ...

  9. Sqoop 数据迁移工具

    Sqoop 数据迁移工具 sqoop : SQL to hadOOP 两个功能: 1. RDB 向HDFS导入 2. HDFS向RDB导入 注:拷贝mysql-connector.jar 和 json ...

  10. Echart饼图旋转

    1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=" ...