k8s 日志收集之 EFK
如今越来越多的应用部署在容器之中,如何收集日志也是一个很重要的问题。服务出问题了,排查问题需要给开发看日志。服务一般会在多个不同的 pod 中,一个一个的登进去看也的确不方便。业务数据统计也需要日志。因此日志收集很重要。今天就来试着部署一下业内常用的 k8s 日志收集方案 EFK。
E - elasticsearch
F - fluentd / filebeat
K - kibana
参考: https://github.com/easzlab/kubeasz/blob/master/docs/guide/efk.md
下面就直接是部署步骤:
1. clone 脚本
1 2 3 | git clone https: //github .com /easzlab/kubeasz .git cd kubeasz git checkout 2.2.3 |
2. 修改镜像版本
脚本中默认的 elasticsearch / kibana 是 6.x 版本. 这里我们修改为 7.x 版本
1 2 3 4 5 6 7 8 | # 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
1 2 3 4 5 6 7 8 | # 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | # 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
1 2 | kubectl apply -f manifests /efk/ kubectl apply -f manifests /efk/es-static-pv/ |
6. 验证
1 2 3 4 5 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 不兼容。
1 2 | # 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
1 | kubectl apply -f manifests /efk/log-pilot/log-pilot-filebeat .yaml |
9. 验证
1 | kubectl -n kube-system get pods | grep log-pilot |
10. 部署应用测试日志收集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # 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: {} |
注意:容器中的环境变量 aliyun_logs_xxx 是收集日志的关键。"stdout" 是收集容器标准输出的日志。"/var/log/app/*.log" 是日志文件路径, 并且该路径是通过 emptyDir 类型挂载到容器中。
部署测试应用并访问一下刚部署的应用,使生成一些日志
1 2 3 4 5 6 7 8 9 10 | 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 一样的)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 获取客户端证书, 进行 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗