ElasticSearch跟MySQL类似,都需要使用StatefulSet去部署这类有状态服务

es配置中常见的参数:

  • cluster.name:集群名称,确保同一集群中的节点此配置名称相同
  • node.name:节点名称,表示集群中节点名称
  • network.host:es监听的IP地址
  • discovery.seed_hosts:节点发现地址,配置成域名(域名下解析到多个IP地址),那么es将处理所有发现的IP地址
  • cluster.initial_master_nodes:集群内所有的node.name

部署NFS storageclass

参考文章:https://1335402049.github.io/2020/09/16/Kubernetes%E4%B8%AD%E4%BD%BF%E7%94%A8NFS%E7%9A%84StorageClass/

创建namespace

apiVersion: v1
kind: Namespace
metadata:
name: log-system
labels:
name: log-system

创建configmap

apiVersion: v1
kind: ConfigMap
metadata:
name: es
namespace: log-system
data:
elasticsearch.yml: |
cluster.name: "es-cluster"
node.name: "${POD_NAME}"
network.host: 0.0.0.0
discovery.seed_hosts: "elasticsearch-discovery"
cluster.initial_master_nodes: "es-0,es-1,es-2"
http.cors.enabled: "true"
http.cors.allow-origin: "*"

创建statefulset

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: es
namespace: log-system
spec:
replicas: 3
selector:
matchLabels:
app: es
serviceName: es
volumeClaimTemplates:
- metadata:
name: es-data
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 5Gi
template:
metadata:
labels:
app: es
spec:
initContainers:
- 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.2.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9200
name: es-cli
- containerPort: 9300
name: es-iner
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
volumeMounts:
- mountPath: /usr/share/elasticsearch/data
name: es-data
- mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
name: es-config
subPath: elasticsearch.yml
volumes:
- name: es-config
configMap:
name: es

创建service

apiVersion: v1
kind: Service
metadata:
name: es-out
namespace: log-system
spec:
type: NodePort
selector:
app: es
ports:
- port: 9200
targetPort: 9200
---
apiVersion: v1
kind: Service
metadata:
name: elasticsearch-discovery
namespace: log-system
spec:
clusterIP: None
ports:
- port: 9300
targetPort: 9300
selector:
app: es

查看集群状态

查看pod,svc情况

kubectl get pods,svc -n log-system

使用curl访问es-out svc的9200端口,查看集群健康状态

curl http://10.1.213.20:9200/_cat/health?v