容器化(Docker、K8S)部署Elasticsearch + Kibana

Elasticsearch简介

#简介
Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎,可以实现单机和集群部署,轻松缩放规模。

ELK:Elasticsearch + Kibana


#官方地址
https://www.elastic.co/cn/
https://www.elastic.co/guide/en/elastic-stack/7.6/overview.html
https://hub.docker.com/_/elasticsearch


#应用场景
日志分析:对IT设备进行运维分析与故障定位、对业务指标分析运营效果。
站内搜索:对网站内容进行关键字检索、对电商网站商品进行检索与推荐。
向量检索:对图像、视频、语料等非结构化数据提取的特征向量数据进行最近邻或近似近邻检索。

运行环境

#运行环境

CentOS Stream9

#前期环境条件

已安装好Docker,配置加速镜像

Docker部署Elasticsearch + Kibana

#基于7.6.0版本拉取镜像,以下镜像源现在依然可用

$ docker pull m.daocloud.io/docker.io/elasticsearch:7.6.0

$ docker pull m.daocloud.io/docker.io/kibana:7.6.0

#准备
$ mkdir -p /docker-compose/elastic76/data
$ chmod 777 /docker-compose/elastic76/data    #如果不授权,容器里的用户权限不足操作外层目录,启动会失败

#部署ElasticSearch
$ docker run -d --name es7.6 -p 9200:9200 -p 9300:9300 -v "/docker-compose/elastic76/data":/usr/share/elasticsearch/data -e "discovery.type=single-node" elasticsearch:7.6.0

#查看日志
$ docker logs es7.6 --since 30m

#访问验证
http://ip:9200

#部署Kibana 
$ docker run --name kibana7.6 -p 5601:5601 -d --link es7.6:elasticsearch kibana:7.6.0
$ docker logs -f kibana7.6

#修改配置文件
$ docker exec -it kibana7.6 bash
$ cd config
$ vi kibana.yml

1)如果地址不对,改一下地址
2)添加:i18n.locale: "zh-CN"

#改配后重启
$ docker restart kibana7.6

#验证
http://ip:5601
 

安装中文分词器插件,配置认证

#安装中文分词器(版本务必对应)
#下载地址:https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.6.0.zip

$ wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.6.0.zip
$ docker cp elasticsearch-analysis-ik-7.6.0.zip es7.6:/usr/share/elasticsearch/plugins/

$ docker exec -it es7.6 bash

#安装插件
$ cd plugins/
$ mkdir analysis-ik
$ mv elasticsearch-analysis-ik-7.6.0.zip  analysis-ik/
$ cd analysis-ik
$ unzip elasticsearch-analysis-ik-7.6.0.zip
$ rm -rf elasticsearch-analysis-ik-7.6.0.zip

#重启服务
$ docker restart es7.6

#验证
POST  _analyze
{
  "analyzer": "ik_max_word",
  "text": "2024春装新款连衣裙"
}

#安全设置,认证配置
$ docker exec -it es7.6 bash
$ vi /usr/share/elasticsearch/config/elasticsearch.yml

#开启自带的xpack的验证功能(复制如下内容到elasticsearch.yml)
xpack.security.enabled: true

#重启服务
$ docker restart es7.6

#设置密码
$ docker exec -it es7.6 bash
$ cd /usr/share/elasticsearch/bin
$ ./elasticsearch-setup-passwords interactive
#给每个账号设置密码,至少6位(举例:admin1)


#改变kibana
$ docker exec -it kibana7.6 bash
$ vi config/kibana.yml

#复制如下内容到【需与 ES 的 ELASTIC_PASSWORD(admin1) 一致】kibana.yml
elasticsearch.username: "elastic"
elasticsearch.password: "admin1"

#重启服务
$ docker restart kibana7.6

#验证
登录kibana时需要用  elastic  作为用户名。
 

基于Dockerfile、docker-compose.yml一键部署 Elasticsearch + Kibana

#先做准备工作

$ mkdir -p /docker-compose/elastic76/data

$ mkdir -p /docker-compose/elastic76/config

$ mkdir -p /docker-compose/elastic76/plugins

$ mkdir -p /docker-compose/kibana76/config

###############第一步:编辑elasticsearch.yml############

$ vi /docker-compose/elasticsearch.yml

# 复制以下内容到elasticsearch.yml,保存并退出

cluster.name: "docker-cluster"
network.host: 0.0.0.0
xpack.security.enabled: true

###############第一步:编辑elasticsearch.yml############

###############第二步:下载elasticsearch-analysis-ik-7.6.0.zip############

$ wget -P /docker-compose/elastic76/plugins/ https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-7.6.0.zip

###############第二步:下载elasticsearch-analysis-ik-7.6.0.zip############

###############第三步:编辑构建镜像的Dockerfile、Makefile############

$ vim /docker-compose/Dockerfile

#输入以下内容并保存

# es的基础镜像
FROM elasticsearch:7.6.0

# 1. 安装 IK 分词器
COPY ./plugins/elasticsearch-analysis-ik-7.6.0.zip /tmp/
RUN mkdir -p /usr/share/elasticsearch/plugins/analysis-ik && \
    unzip /tmp/elasticsearch-analysis-ik-7.6.0.zip -d /usr/share/elasticsearch/plugins/analysis-ik && \
    rm -f /tmp/elasticsearch-analysis-ik-7.6.0.zip

# 2. 复制自定义配置(启用 X-Pack 安全认证)
COPY ./config/elasticsearch.yml /usr/share/elasticsearch/config/

# 3. 设置环境变量(单节点模式)
ENV discovery.type=single-node

# 4. 暴露端口
EXPOSE 9200 9300

#保存Dockerfile文件后,继续创建Makefile

$ vim /docker-compose/Makefile

# 输入以下内容,并保存

build:
    docker build -t elasticsearch-xpack:7.6.0 .
 

#保存Makefile文件后,执行make命令,可以得到一个elasticsearch-xpack:7.6.0的镜像

$ make

###############第三步:编辑构建镜像的Dockerfile、Makefile############

###############第四步:编辑kibana的kibana.yml的外部数据卷############

$ vim /docker-compose/kibana76/config/kibana.yml

#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
server.name: kibana
server.host: "0.0.0.0"
# 通过服务名访问 ES,es7.6为docker-compose定义的服务名
elasticsearch.hosts: [ "http://es7.6:9200" ]

# X-Pack 认证
xpack.monitoring.ui.container.elasticsearch.enabled: true

elasticsearch.username: "elastic"
# 需与 ES 的 ELASTIC_PASSWORD 一致
elasticsearch.password: "admin1"

# 中文界面
i18n.locale: "zh-CN"
 

###############第四步:编辑kibana的kibana.yml的外部数据卷############

###############第五步:编辑docker-compose.yml,内容如下############

$ vim /docker-compose/docker-compose.yml

services:
  es7.6:
    container_name: es7.6
    environment:
      - discovery.type=single-node
      - ELASTIC_PASSWORD=admin1  # 设置 elastic 超级用户密码(可选)
    volumes:
      - ./elastic76/data:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
      - "9300:9300"
    restart: unless-stopped
  setup-passwords: # 可选:初始化密码的临时容器(仅第一次运行时需要)
    image: elasticsearch-xpack:7.6.0
    depends_on:
      - es7.6
    command: >
      sh -c "sleep 30 &&
             elasticsearch-setup-passwords auto --url http://elasticsearch:9200 -b"
    environment:
      - ELASTIC_PASSWORD=admin1  # 必须与 ELASTIC_PASSWORD 一致
  kibana7.6: # 可选:初始化密码的临时容器(仅第一次运行时需要)
    image: kibana:7.6.0
    container_name: kibana7.6
    depends_on:
      - es7.6
    volumes:
      - ./kibana76/config/kibana.yml:/usr/share/kibana/config/kibana.yml
    ports:
      - "5601:5601"

###############第五步:编辑docker-compose.yml############

启动认证

$ docker-compose up -d

本文借鉴容器化(Docker、K8S)部署Elasticsearch + Kibana_elk 容器化部署-优快云博客

<think>好的,用户现在想要在Kubernetes集群内部署Elasticsearch、Fluentd和Kibana(EFK)技术栈的文档。首先,我需要理解用户的需求。用户可能正在搭建一个日志管理系统,用于收集、存储和可视化Kubernetes中的日志。EFK是一个常见的组合,其中Fluentd负责日志收集,Elasticsearch存储日志,Kibana提供可视化界面。 接下来,我需要考虑用户可能的背景。他们可能是有一定Kubernetes基础的系统管理员或DevOps工程师,但可能对EFK的具体部署步骤不太熟悉。用户可能希望有一个详细的指南,帮助他们一步步完成部署,并解决可能遇到的问题。 然后,我需要组织内容结构。首先介绍EFK各组件的作用,然后详细说明部署步骤,包括命名空间创建、Elasticsearch部署、Fluentd配置、Kibana部署以及验证步骤。此外,常见问题和优化建议也很重要,帮助用户应对实际部署中的挑战。 在编写具体步骤时,需要注意Kubernetes的资源配置,比如Elasticsearch的StatefulSet需要持久化存储,资源限制,以及节点亲和性设置。Fluentd的配置需要涉及DaemonSet,确保每个节点运行一个Pod来收集日志。Kibana部署则需要注意服务暴露的方式,比如NodePort或Ingress。 同时,要检查用户之前的问题历史。用户之前询问过Filebeat处理多行日志的问题,现在转向EFK,可能对日志收集的可靠性和扩展性有更高要求。因此,在文档中需要强调Fluentd在多行日志处理上的优势,并可能提供相关配置示例。 另外,用户可能关心如何验证部署是否成功,所以需要包括检查Pod状态、访问Kibana界面以及测试日志收集的步骤。常见问题部分需要覆盖存储问题、资源不足、Fluentd配置错误等,提供具体的解决方案。 最后,优化建议部分应该帮助用户提升性能和稳定性,比如Elasticsearch的索引策略、Fluentd的缓冲区配置和Kibana的优化。这些内容能够帮助用户在生产环境中更好地管理EFK栈。 总结来说,需要提供一个结构清晰、步骤详细、包含故障排查和优化建议的文档,帮助用户在K8s上顺利部署EFK,满足日志管理的需求。</think>以下是基于 Kubernetes 集群部署 **Elasticsearch + Fluentd + Kibana (EFK)** 技术栈的完整文档: --- ### 一、架构概述 ```mermaid graph TD A[应用Pod日志] -->|stdout/stderr| B[K8s节点/var/log/containers] B -->|DaemonSet采集| C[Fluentd] C -->|结构化处理| D[Elasticsearch] D -->|数据存储| E[Kibana可视化] ``` --- ### 二、前置条件 1. **Kubernetes 集群版本** ≥ 1.18 2. **存储类(StorageClass)**:支持动态卷供应(如 `rook-ceph`, `nfs`) 3. **资源配额**:建议每个节点预留至少 2CPU + 4GB 内存 4. **Helm 工具**:用于快速部署(版本 ≥ 3.0) --- ### 三、详细部署步骤 #### 步骤 1:创建专用命名空间 ```bash kubectl create namespace efk ``` #### 步骤 2:部署 Elasticsearch ```yaml # elasticsearch-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: elasticsearch namespace: efk spec: serviceName: elasticsearch replicas: 3 selector: matchLabels: app: elasticsearch template: metadata: labels: app: elasticsearch spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: ["elasticsearch"] topologyKey: "kubernetes.io/hostname" containers: - name: elasticsearch image: docker.elastic.co/elasticsearch/elasticsearch:7.17.3 resources: limits: memory: 4Gi requests: cpu: 1000m memory: 2Gi env: - name: discovery.type value: single-node # 生产环境需改为 zen 发现机制 - name: ES_JAVA_OPTS value: "-Xms2g -Xmx2g" ports: - containerPort: 9200 name: http volumeMounts: - name: data mountPath: /usr/share/elasticsearch/data volumes: - name: data persistentVolumeClaim: claimName: es-data-pvc --- # elasticsearch-service.yaml apiVersion: v1 kind: Service metadata: name: elasticsearch namespace: efk spec: selector: app: elasticsearch ports: - port: 9200 name: http clusterIP: None ``` #### 步骤 3:部署 Fluentd ```yaml # fluentd-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: fluentd-config namespace: efk data: fluent.conf: | <source> @type tail path /var/log/containers/*.log pos_file /var/log/fluentd-containers.log.pos tag kube.* read_from_head true <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source> <filter kube.**> @type kubernetes_metadata </filter> <match kube.**> @type elasticsearch host elasticsearch.efk.svc.cluster.local port 9200 logstash_format true logstash_prefix fluentd flush_interval 5s </match> --- # fluentd-daemonset.yaml apiVersion: apps/v1 kind: DaemonSet metadata: name: fluentd namespace: efk spec: selector: matchLabels: app: fluentd template: metadata: labels: app: fluentd spec: tolerations: - key: node-role.kubernetes.io/master effect: NoSchedule containers: - name: fluentd image: fluent/fluentd-kubernetes-daemonset:v1.16-debian-elasticsearch7 env: - name: FLUENT_ELASTICSEARCH_HOST value: "elasticsearch.efk.svc.cluster.local" - name: FLUENT_ELASTICSEARCH_PORT value: "9200" resources: limits: memory: 512Mi requests: cpu: 100m memory: 200Mi volumeMounts: - name: varlog mountPath: /var/log - name: config-volume mountPath: /fluentd/etc/conf.d volumes: - name: varlog hostPath: path: /var/log - name: config-volume configMap: name: fluentd-config ``` #### 步骤 4:部署 Kibana ```yaml # kibana-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: kibana namespace: efk spec: replicas: 1 selector: matchLabels: app: kibana template: metadata: labels: app: kibana spec: containers: - name: kibana image: docker.elastic.co/kibana/kibana:7.17.3 resources: limits: memory: 1Gi requests: cpu: 500m memory: 512Mi env: - name: ELASTICSEARCH_HOSTS value: "http://elasticsearch.efk.svc.cluster.local:9200" ports: - containerPort: 5601 --- # kibana-service.yaml apiVersion: v1 kind: Service metadata: name: kibana namespace: efk spec: type: NodePort selector: app: kibana ports: - port: 5601 targetPort: 5601 nodePort: 30601 ``` --- ### 四、验证部署 1. **检查 Pod 状态**: ```bash kubectl -n efk get pods -l app=elasticsearch kubectl -n efk get pods -l app=fluentd kubectl -n efk get pods -l app=kibana ``` 2. **访问 Kibana**: - 浏览器访问 `http://<任意节点IP>:30601` - 创建索引模式 `fluentd-*` 3. **测试日志收集**: ```bash kubectl run test-logger --image=alpine -- sh -c "while true; do echo 'EFK test log'; sleep 5; done" ``` --- ### 五、常见问题处理 #### 问题 1:Elasticsearch 无法启动 - **现象**:Pod 处于 `CrashLoopBackOff` 状态 - **排查**: ```bash kubectl -n efk logs elasticsearch-0 ``` - **解决方案**:检查存储类是否可用,调整 Java 堆内存参数 #### 问题 2:Fluentd 无法连接 Elasticsearch - **现象**:日志中出现 `Connection refused` 错误 - **排查**: ```bash kubectl -n efk exec -it fluentd-xxxxx -- curl elasticsearch:9200 ``` - **解决方案**:检查 Service 域名解析,确认网络策略允许通信 --- ### 六、生产环境优化建议 1. **Elasticsearch 优化**: - 使用专用节点角色(master/data/ingest) - 配置索引生命周期管理 (ILM) ```yaml # 示例索引模板 PUT _template/logs { "index_patterns": ["fluentd-*"], "settings": { "number_of_shards": 3, "number_of_replicas": 1, "index.lifecycle.name": "logs_policy" } } ``` 2. **Fluentd 优化**: - 增加缓冲区配置防止数据丢失 ```conf <match **> @type elasticsearch buffer_type memory buffer_chunk_limit 32m buffer_queue_limit 1024 flush_interval 5s </match> ``` 3. **Kibana 优化**: - 启用 X-Pack 安全模块 - 配置 Ingress + TLS 证书 --- ### 附:快速部署命令(Helm 方式) ```bash # 添加 Helm 仓库 helm repo add elastic https://helm.elastic.co # 部署 Elasticsearch helm install elasticsearch elastic/elasticsearch -n efk # 部署 Kibana helm install kibana elastic/kibana -n efk # 部署 Fluentd helm install fluentd stable/fluentd --set elasticsearch.host=elasticsearch-master.efk.svc.cluster.local ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值