Kubernetes StatefulSet 可以用来部署有状态的服务(Stateful Service),Elasticsearch 是一种非常流行的分布式搜索和数据分析引擎,支持集群部署和数据持久化等功能。在 Kubernetes 中使用 StatefulSet 部署 Elasticsearch 集群需要注意以下几个方面。
- 创建一个 ConfigMap
ConfigMap 可以用来存放 Elasticsearch 的配置文件,例如 elasticsearch.yml
和 jvm.options
等。在创建 ConfigMap 时可以指定这些配置文件的内容,例如:
apiVersion: v1
kind: ConfigMap
metadata:
name: elasticsearch-configmap
data:
elasticsearch.yml: |
cluster.name: es-cluster
node.name: ${HOSTNAME}
network.host: "0.0.0.0"
discovery.zen.ping.unicast.hosts: "es-discovery-0,es-discovery-1,es-discovery-2"
discovery.zen.minimum_master_nodes: 2
jvm.options: |
-Xms512m
-Xmx512m
- 创建一个 Headless Service
为了让每个 Elasticsearch 实例都有唯一的 hostname 和 network identity,我们需要创建一个 Headless Service 来分配独立的 hostname。
apiVersion: v1
kind: Service
metadata:
name: es-service-headless
spec:
ports:
- name : http
port : 9200
targetPort : http
clusterIP : None
selector :
app : elasticsearch
- 创建一个 StatefulSet
下面是一个简单的 Elasticsearch StatefulSet 配置示例,其中 replicas
指定了副本数,serviceName
指定了使用的 Headless Service 名称,volumeClaimTemplates
定义了每个 Pod 使用的 PVC。
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: es-statefulset
spec:
serviceName: es-service-headless
replicas: 3
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name : elasticsearch
image : docker.elastic.co/elasticsearch/elasticsearch:7.10.2
ports :
- containerPort : 9200
name : http
- containerPort : 9300
name : transport
env :
- name : cluster.name
value : "es-cluster"
- name : discovery.seed_hosts
value : "es-discovery-0,es-discovery-1,es-discovery-2"
- name : cluster.initial_master_nodes
value : "es-0,es-1,es-2"
volumeMounts :
- name : data-volume
mountPath : /usr/share/elasticsearch/data
- name : config-volume
mountPath : /usr/share/elasticsearch/config/
args :
["-Enode.name=${HOSTNAME}"]
volumes :
- name : data-volume
persistentVolumeClaim :
claimName : pvc-es-data
- name : config-volume
configMap :
name : elasticsearch-configmap
terminationGracePeriodSeconds: 10
dnsPolicy: ClusterFirstWithHostNet
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name:pvc-es-data
spec:
accessModes:
- ReadWriteOnce
resources :
requests :
storage : 20Gi
这个配置将创建三个 Elasticsearch 实例,每个实例都有自己的 PVC 存储卷和配置文件。StatefulSet 会按照 es-0
、es-1
、es-2
的顺序为 Pod 分配唯一的 hostname 和 network identity。我们可以使用 DNS 来访问这些实例:
http://es-0.es-service-headless.default.svc.cluster.local:9200
http://es-1.es-service-headless.default.svc.cluster.local:9200
http://es-2.es-service-headless.default.svc.cluster.local:9200
这样,我们就成功地使用 Kubernetes StatefulSet 部署了一个 Elasticsearch 集群。