我们想在Kubernetes中设置Elasticsearch高可用性设置。我们想部署以下对象,并希望对其进行独立缩放
如果实施了这种设置,请分享您的建议。最好使用开源工具
答案 0 :(得分:0)
有关建议的体系结构,请参见以下几点:
使用ConfigMap来管理其设置。像这样:
apiVersion: v1
kind: Service
metadata:
name: elasticsearch-discovery
labels:
component: elasticsearch
role: master
version: v6.5.0 // or whatever version you require
spec:
selector:
component: elasticsearch
role: master
version: v6.5.0
ports:
- name: transport
port: 9300 // no need to expose port 9200, as master nodes don't need it
protocol: TCP
clusterIP: None
---
apiVersion: v1
kind: ConfigMap
metadata:
name: elasticsearch-master-configmap
data:
elasticsearch.yml: |
# these should get you going
# if you want more fine-grained control, feel free to add other ES settings
cluster.name: "${CLUSTER_NAME}"
node.name: "${NODE_NAME}"
network.host: 0.0.0.0
# (no_master_eligible_nodes / 2) + 1
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: ${DISCOVERY_SERVICE}
node.master: true
node.data: false
node.ingest: false
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: elasticsearch-master
labels:
component: elasticsearch
role: master
version: v6.5.0
spec:
replicas: 3 // 3 is the recommended minimum
template:
metadata:
labels:
component: elasticsearch
role: master
version: v6.5.0
spec:
affinity:
// you can also add node affinity in case you have a specific node pool
podAntiAffinity:
// make sure 2 ES processes don't end up on the same machine
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: component
operator: In
values:
- elasticsearch
- key: role
operator: In
values:
- master
topologyKey: kubernetes.io/hostname
initContainers:
# just basic ES environment configuration
- name: init-sysctl
image: busybox:1.27.2
command:
- sysctl
- -w
- vm.max_map_count=262144
securityContext:
privileged: true
containers:
- name: elasticsearch-master
image: // your preferred image
imagePullPolicy: Always
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: CLUSTER_NAME
value: elasticsearch-cluster
- name: DISCOVERY_SERVICE
value: elasticsearch-discovery
- name: ES_JAVA_OPTS
value: -Xms256m -Xmx256m // or more, if you want
ports:
- name: tcp-transport
containerPort: 9300
volumeMounts:
- name: configmap
mountPath: /etc/elasticsearch/elasticsearch.yml
subPath: elasticsearch.yml
- name: storage
mountPath: /usr/share/elasticsearch/data
volumes:
- name: configmap
configMap:
name: elasticsearch-master-configmap
- emptyDir:
medium: ""
name: storage
也可以以非常相似的方式部署客户端节点,因此我将避免为此添加代码。
数据节点有点特殊:您需要配置持久性存储,因此必须使用StatefulSets。使用PersistentVolumeClaims为这些Pod创建磁盘。我会做这样的事情:
apiVersion:v1 种类:服务 元数据: 名称:elasticsearch 标签: 组成部分:elasticsearch 角色:数据 版本:v6.5.0 规格: 端口:
端口:9300 名称:运输 选择器: 组成部分:elasticsearch 角色:数据 版本:v6.5.0 类型:ClusterIP
apiVersion:v1 种类:ConfigMap 元数据: 名称:elasticsearch-data-configmap 数据: elasticsearch.yml:| cluster.name:“${CLUSTER_NAME}” node.name:“ $ {NODE_NAME}”
network.host:0.0.0.0
#(no_master_eligible_nodes / 2)+ 1 Discovery.zen.minimum_master_nodes:2 Discovery.zen.ping.unicast.hosts:$ {DISCOVERY_SERVICE}
node.master:否 node.data:true node.ingest:false
apiVersion:apps / v1 种类:StatefulSet 元数据: 名称:elasticsearch-data 标签: 组成部分:elasticsearch 角色:数据 版本:v6.5.0 规格: serviceName:elasticsearch 副本:1 //选择适当的数字 选择器: matchLabels: 组成部分:elasticsearch 角色:数据 版本:v6.5.0 模板: 元数据: 标签: 组成部分:elasticsearch 角色:数据 版本:v6.5.0 规格: 亲和力: #再一次,我建议使用nodeAffinity podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: -labelSelector: matchExpressions: - 关键部件 运算符:在 值: -elasticsearch -关键:角色 运算符:在 值: -数据 topologyKey:kubernetes.io/主机名 TerminationGracePeriodSeconds:180 initContainers:
希望这会有所帮助!