分享免费的编程资源和教程

网站首页 > 技术教程 正文

Kubernetes日志采集ELK|部署ElasticSearch存储

goqiw 2025-05-28 17:11:47 技术教程 9 ℃ 0 评论

简介

在Kubernetes内搭建ES集群时,需要使用的技术如下:
1. k8s集群:需要先搭建一个k8s集群,用于部署和管理ES集群中的各种资源。
2. StatefulSet控制器:使用StatefulSet控制器来管理ES集群中的各个节点,它可以保证每个节点的数据不同,同时也可以自动重建被误删除的节点。
3. Service(NodePort)服务:使用Service来暴露ES节点的端口,使得其他节点可以访问它们。
4. PV、PVC:使用PV(持久卷)和PVC(持久卷声明)来管理ES集群中的存储卷,确保数据持久化。PVC可以申请PV并将其绑定到节点上,以便存储节点的数据。
5. volumeClaimTemplates(存储卷申请模板):使用volumeClaimTemplates来定义和管理PVC,以便在需要时自动创建和管理它们。

创建一个Kubernetes命令空间

在Kubernetes中,命名空间是用于隔离不同应用程序的一种机制。因此,需要创建一个新的Kubernetes命名空间来部署ElasticSearch。

vim namespace.yaml

# 注意,所有的Controller、service等都需要添加到elk命名空间中
# 在查询相关信息时需要命名空间(参数:-n elk)
apiVersion: v1
kind: Namespace
metadata:
  name: elk

创建NFS用于ElasticSearch数据

在Kubernetes中,我采用的是NFS实现持久化存储。你现有的环境中没有NFS服务器的话,可以参考我之前的文章Linux下网络共享存储搭建与配置,如果您要在Kubernetes集群中使用NFS存储实现数据持久化可以看一下这篇文章Kubernetes基于NFS实现持久化存储

创建ElasticSearch服务

Service是一种机制,用于将应用程序暴露到集群内的其它组件。因此,需要一个Service来暴露ElasticSearch到集群内的其它组件。

vim service.yaml
apiVersion: v1
kind: Service
metadata:
  namespace: elk
  name: es-cluster-svc
spec:
  externalTrafficPolicy: Cluster
  # 设置服务类型
  type: NodePort
  ports:
    - name: rest
      protocol: TCP
      # 服务端口
      port: 9200
      # 应用端口(Pod端口)
      targetPort: 9200
      # 映射到主机的端口
      nodePort: 39200
    - name: data
      protocol: TCP
      #ElasticSearch数据端口
      port: 9300
  selector:
    # 注意一定要与"StatefulSet.yaml"中spec.selector.matchLabels相同
    app: elasticsearch-app

创建一个ElasticSearch应用

StatefulSet是一种机制,用于部署有状态的应用程序。因此,需要创建一个StatefulSet来部署ElasticSearch

vim StatefulSet.yaml

apiVersion: apps/v1
# 设置控制器
kind: StatefulSet
metadata:
  name: es-cluster
  namespace: elk
spec:
  # 必须设置
  serviceName: es-cluster-svc
  # 设置副本数
  replicas: 3
  # 设置选择器
  selector:
    # 设置标签
    matchLabels:
      app: elasticsearch-app
  template:
    metadata:
      # 此处必须要与上面的matchLabels相同
      labels: 
        app: elasticsearch-app
    spec:
      containers:
      # 这里我是把镜像上传到了我的Harbor仓库内
        - name: es-container
          image: 192.168.82.111:80/elk/elasticsearch:8.6.0
          ports:
            # 容器内端口
            - name: rest
              containerPort: 9200
              protocol: TCP
          # 限制CPU数量
          resources:
            limits:
              cpu: 1000m
            requests:
              cpu: 100m
          # 设置挂载目录
          volumeMounts:
            - name: es-valume
              mountPath: /usr/share/elasticsearch/data
          # 设置环境变量
          env:
            # 自定义集群名
            - name: cluster.name
              value: k8s-es
            # 定义节点名,使用metadata.name名称
            - name: node.name
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            # 初始化集群时,ES从中选出master节点
            - name: cluster.initial_master_nodes
              # 对应metadata.name名称加编号,编号从0开始
              value: "es-cluster-0,es-cluster-1,es-cluster-2"
            # 发现节点的地址,discovery.seed_hosts的值应包括所有master候选节点
            # 如果discovery.seed_hosts的值是一个域名,且该域名解析到多个IP地址,那么es将处理其所有解析的IP地址。
            - name: discovery.seed_hosts
              value: "es-cluster-svc"
            # 配置内存
            - name: ES_JAVA_OPTS
              value: "-Xms1g -Xmx1g"
            - name: network.host
              value: "0.0.0.0"
            - name: xpack.security.transport.ssl.enabled
              value: "false"
            - name: xpack.security.enabled
              value: "false"
  volumeClaimTemplates:
    - metadata:
        # 对应容器中volumeMounts.name
        name: es-valume
        namespace: elk
      spec:
        storageClassName: nfs-client
        # 存储卷可以被单个节点读写
        accessModes:
          - ReadWriteMany
        # 申请资源的大小
        resources:
          requests:
            storage: 10Gi

访问一下ES看是否正常

总结

总的来说,搭建ES集群需要使用StatefulSet控制器、Service、PV、PVC、volumeClaimTemplates等技术,以便保证集群的高可用性和数据持久化。同时,需要注意使用StatefulSet时节点的编号规则和启动回收的顺序。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表