文章目录
Kubernetes 中部署 Elasticsearch(集群版)
在 Kubernetes 中使用 YAML 文件部署集群版 Elasticsearch,并配置账号和密码,可以使用以下步骤。这里我们将使用 StatefulSet 和 Service 来部署 Elasticsearch。
一、Elasticsearch简介
- Elasticsearch是一个开源的、基于Lucene的分布式搜索和分析引擎,设计用于云计算环境中,能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。
- 在当前系统中,部署Elasticsearch主要作为SkyWalking持久化使用
- 版本选择
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之外,还有一些其他重要参数。以下是一些关键参数及其含义:
- ReadWriteOnce: 允许单个节点以读写模式挂载。
- ReadOnlyMany: 允许多个节点以只读模式挂载。
- 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、配置管理、存储、服务等基本原理,文档中存在不足之处请指出,谢谢!