使用k8s多节点部署ELK
时间: 2025-05-23 07:13:17 浏览: 20
### Kubernetes多节点环境下的ELK Stack部署方案
在Kubernetes多节点环境下部署ELK Stack是一种常见的需求,用于集中化日志管理和分析。以下是针对该场景的解决方案和指南。
#### 1. 部署前提条件
为了成功部署ELK Stack,需满足以下先决条件:
- Kubernetes集群版本应为v1.15.0及以上[^1]。
- 节点支持的CPU架构包括`amd64`和`arm64`[^1]。
- 使用Docker或Containerd作为容器运行时环境。
- 各组件的具体版本建议为Elasticsearch:7.9.3, Filebeat:7.9.3, Kibana:7.9.3 和 Logstash:7.9.3。
#### 2. 架构设计
ELK Stack由以下几个核心组件组成:
- **Elasticsearch**: 数据存储和检索引擎。
- **Logstash/Kafka (可选)**: 日志数据处理管道。
- **Filebeat**: 轻量级日志收集器,负责从各个节点采集日志并发送到Elasticsearch或Logstash。
- **Kibana**: 可视化工具,提供友好的界面展示日志和其他指标数据。
对于多节点环境中的日志收集,推荐采用以下架构模式:
- 在每个Node上部署一个Filebeat实例,监听本地应用产生的日志文件,并将其转发至中央化的Logstash服务或者直接写入Elasticsearch。
- 如果存在高吞吐率的日志流,则可以在中间加入消息队列(如Kafka),缓解压力并提高可靠性[^2]。
#### 3. 实现步骤概述
##### a. 创建持久卷(PV)与声明(PVC)
由于Elasticsearch需要长期保存索引数据,因此必须为其分配稳定的存储资源。可以通过NFS或其他分布式文件系统实现跨节点的数据共享。例如,在Master节点执行命令创建共享目录[^4]:
```bash
mkdir -p /data/elk
vim /etc/exports
# 添加如下内容
/data/elk *(rw,no_root_squash)
exportfs -arv
```
接着定义PV对象yaml文件:
```yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: elk-pv-volume
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
path: "/data/elk"
server: <MASTER_IP>
```
##### b. 配置StatefulSet管理 Elasticsearch Pod
利用Kubernetes StatefulSets特性保障Pod顺序启动以及稳定网络身份标识符(FQDN),从而简化后续客户端连接逻辑。下面给出一份基础模板供参考:
```yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: elasticsearch-cluster
spec:
serviceName: "elasticsearch-service"
replicas: 3
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name: elasticsearch-container
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.3
ports:
- containerPort: 9200
name: http
volumeMounts:
- mountPath: "/usr/share/elasticsearch/data"
name: es-storage
---
apiVersion: v1
kind: Service
metadata:
name: elasticsearch-service
spec:
type: ClusterIP
ports:
- port: 9200
targetPort: 9200
selector:
app: elasticsearch
```
注意调整副本数量(replicas field value above), 并确保实际使用的磁盘空间大小符合业务规模预期.
##### c. 设置ConfigMap加载自定义配置参数
无论是Logstash还是其他子模块都可能依赖外部传参控制行为表现形式, 此处演示如何借助 ConfigMaps 功能完成此目的.
假设已编写好名为 `logstash-to-elastic.conf` 的pipeline脚本存放在主机路径 `/tmp/logstash-conf`, 则可通过下述方式引入:
```yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: logstash-configmap
data:
logstash.conf: |
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch-service:9200"]
}
}
```
随后关联进对应的Deployment描述文档里即可生效.
##### d. 编排DaemonSet分发Filebeat代理进程
最后一步便是安排 DaemonSet 类型的工作负载单元自动覆盖整个Cluster范围内的Worker Nodes集合成员个体之上安装指定版本号标记出来的filebeat镜像制品项例子如下所示 :
```yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: filebeat-daemonset
spec:
selector:
matchLabels:
app: filebeat
template:
metadata:
labels:
app: filebeat
spec:
serviceAccountName: default
terminationGracePeriodSeconds: 30
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- name: filebeat
image: docker.elastic.co/beats/filebeat:7.9.3
args: [
"-c", "/etc/filebeat.yml",
"-e",
]
env:
- name: ELASTICSEARCH_HOSTS
value: "http://elasticsearch-service:9200"
securityContext:
runAsUser: 0
resources:
limits:
memory: 200Mi
requests:
cpu: 100m
memory: 100Mi
volumeMounts:
- name: config
mountPath: /etc/filebeat.yml
subPath: filebeat.yml
- name: data
mountPath: /usr/share/filebeat/data
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
volumes:
- name: config
configMap:
defaultMode: 0600
name: filebeat-config
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: data
emptyDir: {}
```
#### 总结说明
综上所述即完成了基于K8S平台构建起一套完整的ELK生态体系流程阐述工作 , 整体思路清晰明了易于理解操作性强 .
阅读全文
相关推荐

















