
🐇明明跟你说过:个人主页
🏅个人专栏:《洞察之眼:ELK监控与可视化》🏅
🔖行路有良友,便是天堂🔖
目录
2、Pods、Services、StatefulSet等基本概念
Elasticsearch是一个开源的、基于Lucene的分布式搜索和分析引擎,设计用于云计算环境中,能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。
1. 核心特性:
2. 数据支持:
3. 技术实现:
4. 应用场景:
5. 集成方案:

1. 自动化和编排
2. 可扩展性
3. 高可用性
4. 容器化优势

K8s,全称Kubernetes,是一个开源的容器编排系统,旨在自动化容器化应用程序的部署、扩展和管理。
1. 定义与概念:
2. 主要特点:
3. 架构与组件:

Pods 是Kubernetes中最小的可部署计算单元。一个Pod可以包含一个或多个容器,这些容器共享网络命名空间和存储资源,并总是共同调度在同一个节点上。
特点:
Services 是一种抽象,它定义了一组逻辑上相同的Pods,并且提供一个稳定的访问入口(IP地址和端口)。Services实现了负载均衡,并且允许Pod进行自动发现和通信。
类型:
功能:
StatefulSets 专门用于管理有状态应用,确保Pod有固定的标识符和稳定的存储。适用于数据库、分布式文件系统等需要持久化存储的应用。
特点:

一个Elasticsearch集群主要由以下几个部分组成:
1. 节点(Node):
2. 主节点(Master Node):
3. 数据节点(Data Node):
4. 协调节点(Coordinating Node):
5. 主节点候选节点(Master-Eligible Node):
6. 专用节点(Dedicated Node):

1. 索引和分片(Shards):
2. 数据分布:
3. 查询和搜索:
4. 数据写入:

本次部署的elasticsearch设计为5节点,一主多从的高可用方式,如果一个主节点意外宕掉,其他节点自主选举出新的Master节点接管任务,从而保证集群的高可用性

这里我们使用的k8s集群版本为 1.23,也可以使用其他的版本,只是镜像导入命令不通,如果还未搭建k8s集群,请参考《在Centos中搭建 K8s 1.23 集群超详细讲解》这篇文章

因为我们要对Elasticsearch中的数据进行持久化,避免Pod漂移后数据丢失,保证数据的完整性与可用性
如果还未创建存储类,请参考《k8s 存储类(StorageClass)创建与动态生成PV解析,(附带镜像)》这篇文件。

- apiVersion: v1
- kind: Namespace
- metadata:
- name: es
- ---
- #创建ConfigMap用于挂载配置文件
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: sirc-elasticsearch-config
- namespace: es
- labels:
- app: elasticsearch
- data: #具体挂载的配置文件
- elasticsearch.yml: |+
- cluster.name: "es-cluster"
- network.host: 0.0.0.0
- http.cors.enabled: true
- http.cors.allow-origin: "*"
- http.cors.allow-headers: "*"
- bootstrap.system_call_filter: false
- xpack.security.enabled: false
- index.number_of_shards: 5
- index.number_of_replicas: 1
- #创建StatefulSet,ES属于数据库类型的应用,此类应用适合StatefulSet类型
- ---
- apiVersion: apps/v1
- kind: StatefulSet
- metadata:
- name: elasticsearch
- namespace: es
- spec:
- serviceName: "elasticsearch-cluster" #填写无头服务的名称
- replicas: 5
- selector:
- matchLabels:
- app: elasticsearch
- template:
- metadata:
- labels:
- app: elasticsearch
- spec:
- initContainers:
- - name: fix-permissions
- image: busybox
- imagePullPolicy: IfNotPresent
- command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
- securityContext:
- privileged: true
- volumeMounts:
- - name: es-data
- mountPath: /usr/share/elasticsearch/data
- - 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
- imagePullPolicy: IfNotPresent
- command: ["sh", "-c", "ulimit -n 65536"]
- securityContext:
- privileged: true
- containers:
- - name: elasticsearch
- image: elasticsearch:7.17.18
- imagePullPolicy: Never
- resources:
- requests:
- memory: "1000Mi"
- cpu: "1000m"
- limits:
- memory: "2000Mi"
- cpu: "2000m"
- ports:
- - containerPort: 9200
- name: elasticsearch
- env:
- - name: node.name
- valueFrom:
- fieldRef:
- fieldPath: metadata.name #metadata.name获取自己pod名称添加到变量MY_POD_NAME,status.hostIP获取自己ip等等可以自己去百度
- - name: discovery.type
- value: zen
- - name: cluster.name
- value: elasticsearch
- - name: cluster.initial_master_nodes
- value: "elasticsearch-0,elasticsearch-1,elasticsearch-2,elasticsearch-3,elasticsearch-4"
- - name: discovery.zen.minimum_master_nodes
- value: "3"
- - name: discovery.seed_hosts
- value: "elasticsearch-0.elasticsearch-cluster.es,elasticsearch-1.elasticsearch-cluster.es,elasticsearch-2.elasticsearch-cluster.es,elasticsearch-3.elasticsearch-cluster.es,elasticsearch-4.elasticsearch-cluster.es"
- - name: network.host
- value: "0.0.0.0"
- - name: "http.cors.allow-origin"
- value: "*"
- - name: "http.cors.enabled"
- value: "true"
- - name: "number_of_shards"
- value: "5"
- - name: "number_of_replicas"
- value: "1"
- - name: path.data
- value: /usr/share/elasticsearch/data
- volumeMounts:
- - name: es-data #挂载数据
- mountPath: /usr/share/elasticsearch/data
- volumes:
- - name: elasticsearch-config
- configMap: #configMap挂载
- name: sirc-elasticsearch-config
- volumeClaimTemplates: #这步自动创建pvc,并挂载动态pv
- - metadata:
- name: es-data
- spec:
- accessModes: ["ReadWriteMany"]
- storageClassName: nfs
- resources:
- requests:
- storage: 10Gi
- #创建Service
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: elasticsearch-cluster #无头服务的名称,需要通过这个获取ip,与主机的对应关系
- namespace: es
- labels:
- app: elasticsearch
- spec:
- ports:
- - port: 9200
- name: elasticsearch
- clusterIP: None
- selector:
- app: elasticsearch
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: elasticsearch #service服务的名称,向外暴露端口
- namespace: es
- labels:
- app: elasticsearch
- spec:
- ports:
- - port: 9200
- name: elasticsearch
- type: NodePort
- selector:
- app: elasticsearch
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: my-nodeport-service-0
- namespace: es
- spec:
- type: NodePort
- selector:
- statefulset.kubernetes.io/pod-name: elasticsearch-0
- ports:
- - protocol: TCP
- port: 80 # Service 暴露的端口
- targetPort: 9200 # Pod 中容器的端口
- nodePort: 30000 # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: my-nodeport-service-1
- namespace: es
- spec:
- type: NodePort
- selector:
- statefulset.kubernetes.io/pod-name: elasticsearch-1
- ports:
- - protocol: TCP
- port: 80 # Service 暴露的端口
- targetPort: 9200 # Pod 中容器的端口
- nodePort: 30001 # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: my-nodeport-service-2
- namespace: es
- spec:
- type: NodePort
- selector:
- statefulset.kubernetes.io/pod-name: elasticsearch-2
- ports:
- - protocol: TCP
- port: 80 # Service 暴露的端口
- targetPort: 9200 # Pod 中容器的端口
- nodePort: 30002 # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: my-nodeport-service-3
- namespace: es
- spec:
- type: NodePort
- selector:
- statefulset.kubernetes.io/pod-name: elasticsearch-3
- ports:
- - protocol: TCP
- port: 80 # Service 暴露的端口
- targetPort: 9200 # Pod 中容器的端口
- nodePort: 30003 # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: my-nodeport-service-4
- namespace: es
- spec:
- type: NodePort
- selector:
- statefulset.kubernetes.io/pod-name: elasticsearch-4
- ports:
- - protocol: TCP
- port: 80 # Service 暴露的端口
- targetPort: 9200 # Pod 中容器的端口
- nodePort: 30004 # NodePort 类型的端口范围为 30000-32767,可以根据需要调整
- ---
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: elasticsearchhead
- namespace: es
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: elasticsearchhead
- template:
- metadata:
- labels:
- app: elasticsearchhead
- spec:
- containers:
- - name: elasticsearchhead
- image: mobz/elasticsearch-head:5
- ports:
- - containerPort: 9100
- ---
- apiVersion: v1
- kind: Service
- metadata:
- name: elasticsearchhead-service
- namespace: es
- spec:
- type: NodePort
- ports:
- - port: 9100
- targetPort: 9100
- nodePort: 30910 # 可根据需要选择合适的端口号
- selector:
- app: elasticsearchhead
上述Kubernetes配置文件定义了Elasticsearch集群的部署,使用StatefulSet来管理其有状态的Pod。
配置说明
1. 命名空间 (Namespace)
2. ConfigMap
3. StatefulSet
4. Services
5. Elasticsearch Head 部署和服务
执行下面的命令

执行下面的命令

查看svc的nodeport端口

在浏览器输入Node的IP加30910端口
在连接窗口输入 Node的IP加30001端口,点击连接
如果能显示下面的结果,则集群部署成功

💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于Elasticsearch的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺
🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!!