在k8s集群中搭建elasticsearch+kibana+flentd日志系统

如何在k8s中搭建efk收集集群日志

在离线环境部署一套日志采集系统我采用的是elasticsearch+kibana+flentd日志系统

首先跟大部分网友一样 创建ns,es的无头服务

yaml文件如下:
apiVersion: v1
kind: Namespace
metadata:
name: logging

kind: Service
apiVersion: v1
metadata:
name: elasticsearch
namespace: logging
labels:
app: elasticsearch
spec:
selector:
app: elasticsearch
clusterIP: None
ports:
- port: 9200
name: rest
- port: 9300
name: inter-node

2.部署es集群

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: es
namespace: logging
spec:
serviceName: elasticsearch
replicas: 3
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
nodeSelector:
es: log
initContainers:
- name: increase-vm-max-map
image: busybox
imagePullPolicy: “IfNotPresent”
command: [“sysctl”, “-w”, “vm.max_map_count=262144”]
securityContext:
privileged: true
- name: increase-fd-ulimit
image: busybox
command: [“sh”, “-c”, “ulimit -n 65536”]
securityContext:
privileged: true
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.1
imagePullPolicy: “IfNotPresent”
ports:
- name: rest
containerPort: 9200
- name: inter
containerPort: 9300
resources:
limits:
cpu: 1000m
requests:
cpu: 1000m
volumeMounts:
- name: data
mountPath: /usr/share/elasticsearch/data
env:
- name: cluster.name
value: k8s-logs
- name: node.name
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: cluster.initial_master_nodes
value: “es-0,es-1,es-2”
- name: discovery.zen.minimum_master_nodes
value: “2”
- name: discovery.seed_hosts
value: “elasticsearch”
- name: ES_JAVA_OPTS
value: “-Xms512m -Xmx512m”
- name: network.host
value: “0.0.0.0”
vloumes:
- name: data
hostpath:
path: /var/app/ocr
这里我采用的是hostpath的挂载方式,因为我还没有单独划分一块磁盘出来。接下来我们可以通过es的rest接口去测试一下es集群
使用下面的命令将本地端口9200 转发到 Elasticsearch 节点(如es-0)对应的端口:
$ kubectl port-forward es-0 9200:9200 --namespace=logging
Forwarding from 127.0.0.1:9200 -> 9200
Forwarding from [::1]:9200 -> 9200
另外开启终端执行:$ curl http://localhost:9200/_cluster/state?pretty
apiVersion: v1
kind: ConfigMap
metadata:
namespace: logging
name: kibana-config
labels:
app: kibana
data:
kibana.yml: |
server.name: kibana
server.host: “0.0.0.0”
i18n.locale: zh-CN #设置默认语言为中文
elasticsearch:
hosts: ${ELASTICSEARCH_HOSTS} #es集群连接地址,由于我这都都是k8s部署且在一个ns下,可以直接使用service name连接

apiVersion: v1
kind: Service
metadata:
name: kibana
namespace: logging
labels:
app: kibana
spec:
ports:

  • port: 5601
    type: NodePort
    selector:
    app: kibana

apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: logging
labels:
app: kibana
spec:
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
nodeSelector:
es: log
containers:
- name: kibana
image: harbor.domain.com/efk/kibana:7.17.1
imagePullPolicy: “IfNotPresent”
resources:
limits:
cpu: 1000m
requests:
cpu: 1000m
env:
- name: ELASTICSEARCH_URL
value: http://elasticsearch:9200 #设置为handless service dns地址即可
- name: ELASTICSEARCH_HOSTS
value: http://elasticsearch:9200
ports:
- containerPort: 5601
这里我依旧没有挂载配置文件,通过nortport端口访问 正常能打开

3.以上我是直接参考的其他网友的操作,但是接下来如果还按照他们的配置的话,我发现自己的集群没有办法采集日志到es,浏览官网后发现,不需要自己去配置规则,官网把采集配置已经打包在镜像里面,

在这里插入图片描述
于是我的yaml文件只是换个镜像
apiVersion: v1
kind: ServiceAccount
metadata:
name: fluentd-es
namespace: logging
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: “true”
addonmanager.kubernetes.io/mode: Reconcile

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd-es
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: “true”
addonmanager.kubernetes.io/mode: Reconcile
rules:

  • apiGroups:
    • “”
      resources:
    • “namespaces”
    • “pods”
      verbs:
    • “get”
    • “watch”
    • “list”

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: fluentd-es
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: “true”
addonmanager.kubernetes.io/mode: Reconcile
subjects:

  • kind: ServiceAccount
    name: fluentd-es
    namespace: logging
    apiGroup: “”
    roleRef:
    kind: ClusterRole
    name: fluentd-es
    apiGroup: “”

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-es
namespace: logging
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: “true”
addonmanager.kubernetes.io/mode: Reconcile
spec:
selector:
matchLabels:
k8s-app: fluentd-es
template:
metadata:
labels:
k8s-app: fluentd-es
kubernetes.io/cluster-service: “true”
# 此注释确保如果节点被驱逐,fluentd不会被驱逐,支持关键的基于 pod 注释的优先级方案。
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ‘’
spec:
serviceAccountName: fluentd-es
containers:
- name: fluentd-es
image: harbor.domain.com/efk/fluentd:v3.4.0
imagePullPolicy: “IfNotPresent”
env:
- name: FLUENTD_ARGS
value: --no-supervisor -q
resources:
limits:
memory: 500Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /data/docker/containers
readOnly: true
- name: config-volume
mountPath: /etc/fluent/config.
tolerations:
- operator: Exists
terminationGracePeriodSeconds: 30
volumes:
- name: varlog
hostPath:
path: /var/log
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
- name: config-volume
configMap:
name: fluentd-config
我又发现一个bug,挂载的时候mountpath 跟hostpath目录要保持一致,hostpath路径为docker本地的日志存放位置

4.测试服务

测试的时候发现日志能正常推送,调es的rest接口也能看到索引,但是正常运行二天过后就出现了日志无法发送es的问题,初步判断可能是跟新搭建的es集群有关系,还有kibana照网友安装 会有安全问题,导致没办法把日志吐到es,正好我们公司有公共的es,于是我
在这里插入图片描述
在环境变量里面添加地址跟账号信息,发现可以正常展示日志,而且是实时的,于是改成公共的es,这样还不用我们去维护
建议:还是要以官方文档位置,每个人的环境都是不一样,不能完全照搬别人的搭建思路
参考文件:https://blog.csdn.net/qq_36200932/article/details/123166613

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Kubernetes(k8s)是一个流行的容器编排平台,可以用于部署Elasticsearch集群。以下是部署Elasticsearch集群的一些步骤: 1. 创建Kubernetes集群:您需要先创建一个Kubernetes集群,可以使用公共云提供商(如AWS、GCP、Azure)或私有云(如OpenStack)。 2. 安装Elasticsearch:您可以使用Helm chart或自定义YAML文件来安装Elasticsearch。在安装过程,您需要指定Elasticsearch节点的数量、资源限制和其他配置。 3. 配置Elasticsearch:您需要配置Elasticsearch集群的网络、存储和安全设置。您可以使用Kubernetes的网络插件(如Calico、Flannel)来配置网络,使用Kubernetes的存储卷(如PersistentVolumeClaim)来配置存储,使用Kubernetes的Secret对象来配置安全设置。 4. 部署Kibana:如果您想使用Kibana来可视化Elasticsearch数据,您可以使用Helm chart或自定义YAML文件来部署Kibana。在部署过程,您需要指定Kibana的资源限制和其他配置。 5. 配置Kibana:您需要配置Kibana的网络、存储和安全设置。您可以使用Kubernetes的网络插件(如Calico、Flannel)来配置网络,使用Kubernetes的存储卷(如PersistentVolumeClaim)来配置存储,使用Kubernetes的Secret对象来配置安全设置。 6. 部署Logstash:如果您想使用Logstash来收集和处理日志数据,您可以使用Helm chart或自定义YAML文件来部署Logstash。在部署过程,您需要指定Logstash的资源限制和其他配置。 7. 配置Logstash:您需要配置Logstash的网络、存储和安全设置。您可以使用Kubernetes的网络插件(如Calico、Flannel)来配置网络,使用Kubernetes的存储卷(如PersistentVolumeClaim)来配置存储,使用Kubernetes的Secret对象来配置安全设置。 8. 测试集群:您可以使用curl或其他工具来测试Elasticsearch集群、Kibana和Logstash的功能和性能。 以上是部署Elasticsearch集群的一些步骤,具体实现可能因环境和需求而异。 ### 回答2: Elasticsearch是一个流行的开源搜索引擎和分布式文档存储和分析系统,有着广泛的应用领域,例如搜索、日志分析、业务指标监控、全文检索等方面。在生产环境,使用Kubernetes(K8s)部署Elasticsearch集群可能是一个不错的选择。下面将简要介绍如何使用K8s部署Elasticsearch集群。 1. 首先,需要准备Elasticsearch Docker镜像,并将其推送到私有或公共的Docker镜像仓库。如何构建和推送Docker镜像超出本文范围。 2. 接下来,需要定义Elasticsearch集群的K8s Object。这里可以使用StatefulSet,用于支持有状态应用程序的部署。同时,需要为每个Pod定义一个独特的网络标识符(hostname),以便它们之间能够互相通信。 3. 进一步,需要创建一个K8s Service,提供对Elasticsearch集群的访问。这可以使用ClusterIP类型的Service,允许在集群内部访问Elasticsearch集群。如果需要在集群外部访问Elasticsearch集群,则可以使用NodePort或LoadBalancer类型的Service,具体取决于环境需求。 4. 配置Elasticsearch集群的存储,以确保数据可持久化存储。这可以使用K8s提供的PersistentVolume或Dynamic Provisioning方式来完成,实现数据持久化存储,并保留Elasticsearch集群数据。同时,建议在Elasticsearch集群使用minimun_master_nodes属性来避免脑裂(brain split)问题。 5. 可以通过挂载ConfigMap或Secret到Elasticsearch集群的容器,来配置Elasticsearch。例如,可以配置Xpack安全性和备份等特性。 6. 创建一个K8s Job,用于初始化Elasticsearch集群。这可以在第一次部署Elasticsearch或者需要重新启动Elasticsearch时使用。初始化作业可以使用Elasticsearch提供的命令行工具,如elasticsearch-keystore、elasticsearch-setup-passwords、elasticsearch-certutil等工具。 7. 最后,可以使用K8s提供的各种监控与日志分析工具,如Prometheus、Grafana、Elasticsearch监控插件等,来监控和管理Elasticsearch集群。 总之,使用K8s部署Elasticsearch集群可以有效简化部署和管理过程,并提高可靠性和可维护性。然而,需要充分理解Elasticsearch的配置和性能特性,以充分发挥其潜力。同时,需要考虑节点数量、硬件负载和可用性等方面的因素,以确保集群的高可用性和性能。 ### 回答3: Kubernetes是一个容器编排平台,可以方便地部署和管理分布式应用程序。在k8s,我们可以使用Elasticsearch(ES)的官方Kubernetes运行时部署一组ES节点,从而创建一个高可用,可扩展且可靠的ES集群。在本文,我们将描述如何在Kubernetes上部署ES集群。 1. 前提条件 在开始之前,我们需要准备一个Kubernetes集群,在集群上安装好kubectl CLI和helm工具,以及一个持久存储卷插件(可以使用NFS或者云存储服务商自带的插件)。 2. 创建ES集群 使用helm工具,在Kubernetes上安装ES集群,可以快速地生成可部署的ES服务。在安装之前,我们需要设置一些ES集群的参数,如节点数量、内存分配、存储容量等。这些参数根据我们的业务需求进行配置。 helm install --set replicas=3,esJavaOpts='-Xms2g -Xmx2g' elastic/elasticsearch 3. 监控集群 在部署完ES集群之后,我们需要监控集群的健康状态,以及运行时数据等。通过Promethues+Grafana等监控工具,我们可以轻松地监视ES集群,确保集群的稳定性和高可用性。 4. 备份和恢复 为了保证数据的安全性,我们需要定期备份ES集群的数据。在集群发生故障时,我们可以通过备份数据来恢复集群。可以使用Velero等备份恢复工具来进行ES集群的备份和恢复。 总结 Kubernetes是一个在云时代兴起的容器编排平台。通过使用Kubernetes运行时,我们可以轻松地部署和管理ES集群,从而构建一个高可用,可伸缩的系统。同时,ES集群的监控和备份工作也非常重要,因为数据在大型分布式系统是最重要的资产之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小人参glk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值