找回密码
 立即注册
首页 业界区 业界 【Kubernetes】集成ELK收集日志

【Kubernetes】集成ELK收集日志

役魅肋 2025-11-23 14:25:01
Kubernetes集成ELK日志

由于我们使用Helm部署ELK,这里将分别部署Elasticsearch、Kibana和Logstash。同时,我们还需要部署Filebeat作为日志收集器
步骤:

  • 添加Elastic Helm仓库
  • 部署Elasticsearch
  • 部署Kibana
  • 部署Logstash(可选,因为Filebeat也可以直接发送到Elasticsearch,但通常用于更复杂的处理)
  • 部署Filebeat
各组件说明
Elasticsearch: 一个分布式、RESTful 风格的搜索和分析引擎。它是整个架构的核心,负责存储、搜索和分析从各种来源收集来的海量数据
Kibana: 一个为 Elasticsearch 设计的开源数据可视化和管理工具。用户可以通过 Kibana 在网页上直接与 Elasticsearch 中的数据交互
Logstash: 一个服务器端的数据处理管道,可以同时从多个来源接收数据,对数据进行转换和丰富,然后将其发送到像 Elasticsearch 这样的“存储库”中
Filebeat: 一个轻量级的、用于转发和集中日志数据的工具。Filebeat 被安装在需要收集日志的服务器上,监视指定的日志文件或位置,并将日志事件转发到 Logstash 或 Elasticsearch 进行索引
一个最常见的数据流是这样的:
应用日志 --> Filebeat --> Logstash --> Elasticsearch --> Kibana
前置条件


  • 一个正在运行的 Kubernetes 集群。
参考: k8s入门

  • 已安装 kubectl 并配置好对集群的访问
参考: macOS上优雅运行Docker容器

  • 已安装 Helm。
参考: k8s使用helm简化安装
部署ELK Stack到Kubernetes

1. 添加Elastic Helm仓库
  1. # 添加Elastic官方仓库
  2. helm repo add elastic https://helm.elastic.co
  3. helm repo update elastic
复制代码
2. 创建命名空间
  1. kubectl create namespace logging
复制代码
3. 部署Elasticsearch

3.1 创建自定义values文件

elasticsearch-values.yaml
  1. # elasticsearch-values.yaml
  2. clusterName: "elasticsearch"
  3. nodeGroup: "master"
  4. replicas: 2
  5. # 资源配置
  6. resources:
  7.   requests:
  8.     cpu: "1000m"
  9.     memory: "2Gi"
  10.   limits:
  11.     cpu: "2000m"
  12.     memory: "4Gi"
  13. # 持久化配置
  14. volumeClaimTemplate:
  15.   accessModes: [ "ReadWriteOnce" ]
  16.   storageClassName: "local-path"  # 根据你的存储类修改
  17.   resources:
  18.     requests:
  19.       storage: 50Gi
  20. # 配置参数
  21. esConfig:
  22.   elasticsearch.yml: |
  23.     xpack.security.enabled: true
  24.     xpack.monitoring.collection.enabled: true
  25. # 环境变量
  26. extraEnvs:
  27.   - name: "ES_JAVA_OPTS"
  28.     value: "-Xms2g -Xmx2g"
  29. # 启用服务
  30. service:
  31.   type: ClusterIP
  32.   loadBalancerIP: ""
  33. # 安全配置
  34. secret:
  35.   enabled: true
  36.   passwords:
  37.     elastic: "admin123!"  # 修改为强密码
  38. # 探针配置
  39. readinessProbe:
  40.   failureThreshold: 3
  41.   initialDelaySeconds: 10
  42.   periodSeconds: 10
  43.   successThreshold: 3
  44.   timeoutSeconds: 5
  45. livenessProbe:
  46.   failureThreshold: 3
  47.   initialDelaySeconds: 10
  48.   periodSeconds: 10
  49.   successThreshold: 3
  50.   timeoutSeconds: 5
复制代码
3.2 部署Elasticsearch
  1. helm install elasticsearch elastic/elasticsearch \
  2.   --namespace logging \
  3.   --values elasticsearch-values.yaml \
  4.   --version 8.5.1
复制代码
3.3 验证Elasticsearch部署
  1. # 检查Pod状态
  2. kubectl get pods -n logging -l app=elasticsearch-master
  3. # 检查服务
  4. kubectl get svc -n logging
  5. # 端口转发
  6. kubectl port-forward svc/elasticsearch-master -n logging 9200:9200
  7. # curl
  8. curl -u elastic:elastic123! http://localhost:9200
复制代码
正常应该有下面这样输出
  1. {
  2.   "name" : "elasticsearch-master-0",
  3.   "cluster_name" : "elasticsearch",
  4.   "cluster_uuid" : "iZdUU_7eSDGOtwcg6KqRaQ",
  5.   "version" : {
  6.     "number" : "7.17.3",
  7.     "build_flavor" : "default",
  8.     "build_type" : "docker",
  9.     "build_hash" : "5ad023604c8d7416c9eb6c0eadb62b14e766caff",
  10.     "build_date" : "2022-04-19T08:11:19.070913226Z",
  11.     "build_snapshot" : false,
  12.     "lucene_version" : "8.11.1",
  13.     "minimum_wire_compatibility_version" : "6.8.0",
  14.     "minimum_index_compatibility_version" : "6.0.0-beta1"
  15.   },
  16.   "tagline" : "You Know, for Search"
  17. }
复制代码
4. 部署Kibana

4.1 创建Kibana values文件

kibana-values.yaml
  1. # kibana-values.yaml
  2. elasticsearchHosts: "http://elasticsearch-master.logging.svc.cluster.local:9200"
  3. # 服务配置
  4. service:
  5.   type: LoadBalancer  # 或者使用NodePort/ClusterIP + Ingress
  6.   loadBalancerIP: ""
  7.   port: 5601
  8. # Elasticsearch连接配置
  9. elasticsearch:
  10.   username: "elastic"
  11.   password: "YourElasticPassword123"  # 与Elasticsearch相同的密码
  12. # 配置参数
  13. kibanaConfig:
  14.   kibana.yml: |
  15.     server:
  16.       name: kibana
  17.       host: "0.0.0.0"
  18.     monitoring:
  19.       ui:
  20.         enabled: true
  21.     xpack:
  22.       security:
  23.         enabled: true
  24. # 探针配置
  25. readinessProbe:
  26.   httpGet:
  27.     path: /api/status
  28.     port: 5601
  29.   initialDelaySeconds: 10
  30.   timeoutSeconds: 5
  31.   periodSeconds: 10
  32. livenessProbe:
  33.   httpGet:
  34.     path: /api/status
  35.     port: 5601
  36.   initialDelaySeconds: 10
  37.   timeoutSeconds: 5
  38.   periodSeconds: 30
复制代码
4.2 部署Kibana
  1. helm install kibana elastic/kibana \
  2.   --namespace logging \
  3.   --values kibana-values.yaml \
  4.   --version 7.17.3
复制代码
4.3 访问Kibana
  1. kubectl get svc -n logging kibana-kibana
  2. kubectl port-forward -n logging svc/kibana-kibana 5601:5601
复制代码
访问 http://localhost:5601,用户名:elastic,密码:elastic123!
4.4 使用Ingress暴露Kibana

kibana-ingress.yaml
  1. apiVersion: networking.k8s.io/v1
  2. kind: Ingress
  3. metadata:
  4.   name: kibana-ingress
  5.   namespace: logging
  6.   annotations:
  7.     nginx.ingress.kubernetes.io/rewrite-target: /
  8.     nginx.ingress.kubernetes.io/ssl-redirect: "false"
  9.     nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
  10. spec:
  11.   ingressClassName: nginx
  12.   rules:
  13.   - host: kibana.wilson.local
  14.     http:
  15.       paths:
  16.       - path: /
  17.         pathType: Prefix
  18.         backend:
  19.           service:
  20.             name: kibana-kibana
  21.             port:
  22.               number: 5601
复制代码
部署Kibana Ingress
  1. kubectl apply -f kibana-ingress.yaml
复制代码
5. 部署Filebeat

5.1 创建Filebeat values文件

创建 filebeat-values.yaml
  1. # filebeat-values-clean.yaml
  2. clusterRoleRules:
  3.   - apiGroups: [coordination.k8s.io]
  4.     resources: [leases]
  5.     verbs: ['get', 'create', 'update']
  6.   - apiGroups: [""]
  7.     resources: ["nodes", "nodes/stats", "events", "endpoints", "pods", "services"]
  8.     verbs: ["get", "list", "watch"]
  9. # 如果不需要采集容器日志,可以注释掉以下部分
  10. daemonset:
  11.   enabled: true
  12.   # 确保卷定义不重复
  13.   volumes:
  14.     - name: varlog
  15.       hostPath:
  16.         path: /var/log
  17.     - name: varlibdockercontainers
  18.       hostPath:
  19.         path: /var/lib/docker/containers
  20.     - name: varlogpods
  21.       hostPath:
  22.         path: /var/log/pods
  23.     - name: varlibcontainers
  24.       hostPath:
  25.         path: /var/lib/containers
  26.   volumeMounts:
  27.     - name: varlog
  28.       mountPath: /var/log
  29.       readOnly: true
  30.     - name: varlibdockercontainers
  31.       mountPath: /var/lib/docker/containers
  32.       readOnly: true
  33.     - name: varlogpods
  34.       mountPath: /var/log/pods
  35.       readOnly: true
  36.     - name: varlibcontainers
  37.       mountPath: /var/lib/containers
  38.       readOnly: true
  39.   # 环境变量配置 - 确保不重复
  40.   env:
  41.     - name: NODE_NAME
  42.       valueFrom:
  43.         fieldRef:
  44.           fieldPath: spec.nodeName
  45. filebeatConfig:
  46.   filebeat.yml: |
  47.     filebeat.inputs:
  48.     - type: container
  49.       paths:
  50.         - /var/log/containers/*.log
  51.       processors:
  52.         - add_kubernetes_metadata:
  53.             host: ${NODE_NAME}
  54.             matchers:
  55.             - logs_path:
  56.                 logs_path: "/var/log/containers/"
  57.     output.elasticsearch:
  58.       hosts: ['elasticsearch-master:9200']
  59.       username: "elastic"
  60.       password: "elastic123!"
复制代码
5.2 部署Filebeat
  1. helm install filebeat elastic/filebeat \
  2.   --namespace logging \
  3.   --values filebeat-values.yaml \
  4.   --version 7.17.3
复制代码
5.3  验证Filebeat部署
  1. kubectl get pods --namespace=logging -l app=filebeat-filebeat -w
  2. kubectl get svc -n logging
复制代码
6. 部署Logstash

6.1 创建Logstash values文件

创建 logstash-values.yaml
6.2 部署Logstash
  1. helm install logstash elastic/logstash \
  2.   --namespace logging \
  3.   --values logstash-values.yaml \
  4.   --version 7.17.3
复制代码
6.3 验证Logstash部署
  1. kubectl get pods --namespace=logging -l app=logstash-logstash -w
复制代码
测试日志收集
  1. kubectl run test-logger --image=busybox --restart=Never -- /bin/sh -c 'i=0; while true; do echo "$(date) - Test log message $i"; i=$((i+1)); sleep 5; done'
复制代码
在Kibana中创建索引模式并查看日志
1.png

Java应用日志写入ELK
  1. Java应用 → 日志文件 → Filebeat → Logstash → Elasticsearch → Kibana
复制代码
添加依赖
  1. <dependency>
  2.     <groupId>net.logstash.logback</groupId>
  3.     logstash-logback-encoder</artifactId>
  4.     <version>7.4</version>
  5. </dependency>
复制代码
Logback 配置
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3.    
  4.    
  5.         <encoder>
  6.             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  7.         </encoder>
  8.     </appender>
  9.    
  10.    
  11.         <file>logs/app.log</file>
  12.         <rollingPolicy >
  13.             <fileNamePattern>logs/app.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
  14.             <maxHistory>30</maxHistory>
  15.             <timeBasedFileNamingAndTriggeringPolicy >
  16.                 <maxFileSize>100MB</maxFileSize>
  17.             </timeBasedFileNamingAndTriggeringPolicy>
  18.         </rollingPolicy>
  19.         <encoder>
  20.             <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  21.         </encoder>
  22.     </appender>
  23.    
  24.    
  25.         <file>logs/logstash.json</file>
  26.         <rollingPolicy >
  27.             <fileNamePattern>logs/logstash.%d{yyyy-MM-dd}.%i.json</fileNamePattern>
  28.             <maxHistory>7</maxHistory>
  29.             <timeBasedFileNamingAndTriggeringPolicy >
  30.                 <maxFileSize>100MB</maxFileSize>
  31.             </timeBasedFileNamingAndTriggeringPolicy>
  32.         </rollingPolicy>
  33.         <encoder >
  34.             <providers>
  35.                 <timestamp/>
  36.                 <version/>
  37.                 <logLevel/>
  38.                 <loggerName/>
  39.                 <message/>
  40.                 <mdc/>
  41.                 <stackTrace/>
  42.                 <threadName/>
  43.                 <pattern>
  44.                     <pattern>
  45.                         {
  46.                             "app": "spring-k8s-demo",
  47.                             "env": "${ENV:-dev}"
  48.                         }
  49.                     </pattern>
  50.                 </pattern>
  51.             </providers>
  52.         </encoder>
  53.     </appender>
  54.     <root level="INFO">
  55.         
  56.         
  57.         
  58.     </root>
  59. </configuration>
复制代码
应用写入日志
  1. @GetMapping("/")
  2. public String hello() {
  3.   if (firstTime == null) {
  4.     firstTime = new Date();
  5.   }
  6.   // 测试日志
  7.   logger.info("request in " + formatter.format(new Date()));
  8.   return "Hello from Spring Boot on Kubernetes! first time: " + formatter.format(firstTime);
  9. }
复制代码
Kibana 搜索日志
2.png

清理资源
  1. # 删除所有ELK组件
  2. helm uninstall filebeat -n logging
  3. helm uninstall logstash -n logging
  4. helm uninstall kibana -n logging
  5. helm uninstall elasticsearch -n logging
  6. # 删除命名空间
  7. kubectl delete namespace logging
  8. # 清理持久卷(如果不再需要)
  9. kubectl delete pvc -n logging --all
复制代码
引用

https://github.com/WilsonPan/java-developer
例子: https://github.com/WilsonPan/java-developer/k8s/logging

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册