EFK 是 Elasticsearch + Fluentd + Kibana 的日志收集分析解决方案: - Elasticsearch:分布式搜索和分析引擎,负责存储和索引日志 - Fluentd:日志收集器,负责从 Kubernetes 收集日志并发送到 Elasticsearch - Kibana:可视化界面,用于查询和分析日志
helm repo add elastic https://helm.elastic.co
helm repo update
# 创建命名空间
kubectl create namespace logging
# 安装 Elasticsearch
helm install elasticsearch elastic/elasticsearch \
--namespace logging \
--set replicas=2 \
--set minimumMasterNodes=1 \
--set resources.requests.cpu=1000m \
--set resources.requests.memory=2Gi \
--set resources.limits.memory=4Gi
验证 Elasticsearch 状态:
kubectl get pods -n logging -l app=elasticsearch-master
创建 Fluentd 配置文件 fluentd-values.yaml
:
image:
repository: fluent/fluentd-kubernetes-daemonset
tag: v1.14.6-debian-elasticsearch7-1.0
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch-master.logging.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
- name: FLUENT_ELASTICSEARCH_SCHEME
value: "http"
- name: FLUENT_UID
value: "0"
resources:
limits:
cpu: 500m
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
rbac:
create: true
使用 Helm 安装 Fluentd:
helm install fluentd stable/fluentd \
--namespace logging \
-f fluentd-values.yaml
验证 Fluentd 状态:
kubectl get pods -n logging -l app=fluentd
helm install kibana elastic/kibana \
--namespace logging \
--set service.type=NodePort \
--set service.nodePort=30601 \
--set resources.requests.cpu=500m \
--set resources.requests.memory=1Gi
验证 Kibana 状态:
kubectl get pods -n logging -l app=kibana
获取 Kibana 服务地址:
kubectl get svc -n logging kibana-kibana
使用 NodePort 或 Ingress 访问 Kibana(默认端口 30601)
首次登录需要配置索引模式:
logstash-*
@timestamp
作为时间过滤字段修改 Elasticsearch 的 values.yaml 添加持久化:
volumeClaimTemplate:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard" # 根据你的存储类修改
resources:
requests:
storage: 30Gi
在 Fluentd 配置中添加应用标签过滤:
configMaps:
fluent.conf: |
<filter kubernetes.**>
@type record_transformer
enable_ruby true
<record>
app_name ${record.dig("kubernetes", "labels", "app")}
pod_name ${record.dig("kubernetes", "pod_name")}
namespace ${record.dig("kubernetes", "namespace_name")}
</record>
</filter>
在 Elasticsearch 中配置 ILM(索引生命周期管理):
elasticsearch:
master:
extraEnvs:
- name: xpack.ilm.enabled
value: "true"
lifecycle:
policies:
- name: logs-policy
phases:
hot:
actions:
rollover:
max_size: 50GB
max_age: 7d
delete:
min_age: 30d
actions:
delete: {}
Elasticsearch 节点未启动:
kubectl logs -n logging <pod-name>
Fluentd 无法连接到 Elasticsearch:
kubectl exec -it <pod> -- nslookup elasticsearch-master.logging.svc.cluster.local
Kibana 无法显示日志:
日志收集延迟:
通过以上步骤,您可以在 Kubernetes 集群中成功部署 EFK 日志管理系统,实现容器日志的统一收集、存储和可视化分析。