elasticsearch - 如何在 K8S 的 Elasticsearch 集群中为不同的 Pod 配置不同的存储挂载?
问题描述
我正在使用节点组将 Elasticsearch 集群部署到 EKS 上的 K8S。我为集群的存储申请了 EBS。当我启动集群时,只有一个 pod 成功运行,但其他 pod 出现此错误:
Warning FailedAttachVolume 3m33s attachdetach-controller Multi-Attach error for volume "pvc-4870bd46-2f1e-402a-acf7-005de83e4588" Volume is already used by pod(s) es-0
Warning FailedMount 90s kubelet Unable to attach or mount volumes: unmounted volumes=[persistent-storage], unattached volumes=[es-config persistent-storage default-token-pqzkp]: timed out waiting for the condition
这意味着存储已在使用中。我了解此卷由第一个 pod 使用,因此其他 pod 无法使用它。但是我不知道当它们使用相同的 EBS 卷时如何为不同的 pod 使用不同的挂载路径。
以下是集群的完整规范。
apiVersion: v1
kind: ConfigMap
metadata:
name: es-config
data:
elasticsearch.yml: |
cluster.name: elk-cluster
network.host: "0.0.0.0"
bootstrap.memory_lock: false
# discovery.zen.minimum_master_nodes: 2
node.max_local_storage_nodes: 9
discovery.seed_hosts:
- es-0.es-entrypoint.default.svc.cluster.local
- es-1.es-entrypoint.default.svc.cluster.local
- es-2.es-entrypoint.default.svc.cluster.local
ES_JAVA_OPTS: -Xms4g -Xmx8g
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: es
namespace: default
spec:
serviceName: es-entrypoint
replicas: 3
selector:
matchLabels:
name: es
template:
metadata:
labels:
name: es
spec:
volumes:
- name: es-config
configMap:
name: es-config
items:
- key: elasticsearch.yml
path: elasticsearch.yml
- name: persistent-storage
persistentVolumeClaim:
claimName: ebs-claim
initContainers:
- name: permissions-fix
image: busybox
volumeMounts:
- name: persistent-storage
mountPath: /usr/share/elasticsearch/data
command: [ 'chown' ]
args: [ '1000:1000', '/usr/share/elasticsearch/data' ]
containers:
- name: es
image: elasticsearch:7.10.1
resources:
requests:
cpu: 2
memory: 8Gi
ports:
- name: http
containerPort: 9200
- containerPort: 9300
name: inter-node
volumeMounts:
- name: es-config
mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
subPath: elasticsearch.yml
- name: persistent-storage
mountPath: /usr/share/elasticsearch/data
---
apiVersion: v1
kind: Service
metadata:
name: es-entrypoint
spec:
selector:
name: es
ports:
- port: 9200
targetPort: 9200
protocol: TCP
clusterIP: None
解决方案
您应该使用volumeClaimTemplates
statefulset,以便每个 pod 都有自己的卷。详情:
volumeClaimTemplates:
- metadata:
name: es
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
# storageClassName: <omit to use default StorageClass or specify>
推荐阅读
- mysql - 是否可以有 1 到 0 或 1 的递归关系以及如何查询这样的表?
- botframework - endOfConversation 不是函数
- reactjs - 如何在反应中正确优化事件处理程序
- python - 如何在 Python 中编写 ffmpeg 命令“-ss”
- android - 在 Xamarin 中出现“您需要在此活动中使用 Theme.AppCompat 主题(或后代)”错误
- xcode - Xcode 11 供应配置文件未能通过资格认证
- javascript - 显示 N 项,共 N 项
- javascript - Angular ngrx:TypeError:无法使用元素冻结数组缓冲区视图
- ubuntu - VS Code:错误:EEXIST:文件已存在,mkdir
- google-app-engine - 使用 Identity Aware Proxy,是否可以向同一 GCP 项目中具有不同主机名的另一个 GAE“服务”发出跨源请求?