Kubernetes 中部署 Elasticsearch(集群版)

Kubernetes 中部署 Elasticsearch(集群版)

在 Kubernetes 中使用 YAML 文件部署集群版 Elasticsearch,并配置账号和密码,可以使用以下步骤。这里我们将使用 StatefulSet 和 Service 来部署 Elasticsearch。

一、Elasticsearch简介

  1. Elasticsearch是一个开源的、基于Lucene的分布式搜索和分析引擎,设计用于云计算环境中,能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。
  2. 在当前系统中,部署Elasticsearch主要作为SkyWalking持久化使用
  3. 版本选择

Elasticsearch 选择 elasticsearch:7.9.0(镜像)

二、创建命名空间

你可以选择创建一个专用的命名空间来部署 elasticsearch: elasticsearch-namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: elasticsearch
  annotations:
    description: elasticsearch库

三、创建 Secret 存储密码

首先,创建一个 Secret 来存储 Elasticsearch 的用户名和密码:elasticsearch-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: elasticsearch-secret
  namespace: elasticsearch
type: Opaque
data:
  elastic-username: ZWxhc3RpYw== # "elastic" 的 base64 编码
  elastic-password: "password_to_base" # 替换为你的密码的 base64 编码

你可以使用以下命令生成 base64 编码:

# 任何一台物理机上,使用echo命令
echo -n 'elastic' | base64
echo -n 'yourpassword' | base64 # 替换为你的密码

四、创建 PersistentVolumeClaim (PVC)

创建 PVC,以便 Elasticsearch 可以持久化数据:elasticsearch-pvc.yaml

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: elasticsearch-pvc
  namespace: elasticsearch
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi  # 根据需求调整存储大小

在Kubernetes中,PVC(Persistent Volume Claim)中的ReadWriteOnce是一个访问模式,用于指定持久卷(Persistent Volume)可以如何被挂载。具体来说,ReadWriteOnce意味着:

单节点写入:持久卷可以被单个节点以读写方式挂载。这意味着只有一个Pod可以对该卷进行写入。
多节点读取:虽然只有一个节点可以写入,但其他节点可以以只读方式访问同一个卷。

除了ReadWriteOnce之外,还有一些其他重要参数。以下是一些关键参数及其含义:

  1. ReadWriteOnce: 允许单个节点以读写模式挂载。
  2. ReadOnlyMany: 允许多个节点以只读模式挂载。
  3. ReadWriteMany: 允许多个节点以读写模式挂载。

注意:因为云硬盘CBS仅支持单机读写,accessModes只能选择ReadWriteOnce,导致当前部署Elasticsearch时,我们的pod个数设置为1个。后续可以更改存储的Provisioner模式为对象存储COS,这样就可以部署多个pod实例,达到真正意义上的集群。

五、创建 ConfigMap

创建 ConfigMap,以便配置Elasticsearch的配置参数,基本配置文件建议重官方文档中获取:elasticsearch-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: elasticsearch-config
  namespace: elasticsearch
data:
  elasticsearch.yml: |
    # Elasticsearch Configuration
    cluster.name: "tke2-sit-cluster" # 集群名称
    network.host: "0.0.0.0"
    xpack.security.enabled: "true"  # 开启认证

六、创建 StatefulSet 和 Service

接下来,创建 Elasticsearch 的 StatefulSet 和 Service:

elasticsearch-deployment.yaml

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: elasticsearch
  namespace: elasticsearch
spec:
  serviceName: "elasticsearch"
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
        - name: elasticsearch
          image: elasticsearch:7.9.0
#          command: ['sh', '-c', 'chown -R 1000:1000 /usr/share/elasticsearch/data']
          env:
            - name: discovery.type
              value: "single-node"  # 对于生产集群,使用其他方法发现节点
            - name: ES_JAVA_OPTS
              value: "-Xms512m -Xmx512m"  # Java 堆内存设置
            - name: ELASTIC_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: elasticsearch-secret
                  key: elastic-password
          ports:
            - containerPort: 9200
          resources:
            limits:
              memory: "2Gi"
              cpu: "1"
          volumeMounts:
            - name: elasticsearch-data
              mountPath: /usr/share/elasticsearch/data
#          imagePullPolicy: IfNotPresent
            - name: config
              mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
              subPath: elasticsearch.yml
#          imagePullPolicy: Always
      volumes:
        - name: elasticsearch-data
          persistentVolumeClaim:
            claimName: elasticsearch-pvc
        - name: config
          configMap:
            name: elasticsearch-config
      #          配置使用的密钥,不然没有访问镜像的权限(当前为腾讯云)
      imagePullSecrets:
        - name: ctos-secret

可以看到,ELASTIC_PASSWORD环境变量配置了访问的密码,elasticsearch-data把数据持久化到pvc中,config把配置文件挂载到容器中。

elasticsearch-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch
  namespace: elasticsearch
spec:
  ports:
    - port: 9200
      targetPort: 9200
      name: http
  selector:
    app: elasticsearch

---
apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-node
  namespace: elasticsearch
spec:
  selector:
    app: elasticsearch
#    version: v1
  ports:
    - name: service-port
      protocol: TCP
      port: 9200
      targetPort: 9200
      nodePort: 31200
  type: NodePort

配置NodePort访问的方式,为了方便调试和查询,访问方式为:其中一台物理节点IP:nodePort,但是当前通过收缩负载均衡器代理,所以党文方式为:负载均衡器IP:监听端口(9200)

七、问题记录与测试连接

1、权限不足

当我们pod开始启动的时候,可能会报权限问题

原因是/usr/share/elasticsearch/data目录权限不足,找到pv所在的物理机,执行如下命令

1.1 使用lsblk命令查看磁盘目录

1.2 给目录授权:chmod -R 777 {pv目录}

2、测试连接

直接访问:http://IP(负载均衡器IP):9200(监听端口)

请添加图片描述

发现并没有权限访问,状态为401,原因是我们开启了访问认证,xpack.security.enabled参数设置了true,所以当我们需要访问时,需要增加相关认证条件。

访问方式一:

在 Authorization 标签下,选择 Basic Auth,并输入用户名和密码。
请添加图片描述

访问方式二:

需要在请求头中携带Authorization,需要通过命令生成账号和密码的base64:

# elastic为账号
# yourpassword替换成你使用的密码
echo -n 'elastic:yourpassword' | base64

value为:Basic base64

请添加图片描述

本篇主要以实战为主,所以使用Kubernetes部署服务时,需要了解集群工作负载、pod、配置管理、存储、服务等基本原理,文档中存在不足之处请指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值