在AWS EKS/kubernetes上使用通用EFS存储运行多个go-ethereum pod



我正试图在AWS EKS上运行一个go ethereum节点,为此我使用了以下配置的statefulsets。statefulset.yaml文件

运行kubectl apply -f statefulset.yaml会创建2个pod,其中1个正在运行,1个处于CrashLoopBackOff状态。吊舱状态在检查了第二个pod的日志后,我得到的错误是Fatal: Failed to create the protocol stack: datadir already used by another process。错误日志我正在获取

该问题主要是由于pod使用相同的目录在持久卷上写入(geth data((即pod正在写入"/data"(。如果我使用子路径表达式并将pod的目录装载到具有pod名称的子目录中(例如:"/data/geth-0"(,它就可以正常工作。statefulset.yaml,卷装载到具有podname的子目录但我的要求是,所有三个pod的数据都写在"/data"目录中。下面是我的卷配置文件。卷配置

您需要为每个有状态pod动态地提供访问点。首先创建一个支持动态供应的EFS存储类:

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: efs-dyn-sc
provisioner: efs.csi.aws.com
reclaimPolicy: Retain
parameters:
provisioningMode: efs-ap
directoryPerms: "700"
fileSystemId: <get the ID from the EFS console>

更新您的规范以支持索赔模板:

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: geth
...
spec:
...
template:
...
spec:
containers:
- name: geth
...
volumeMounts:
- name: geth
mountPath: /data
...
volumeClaimTemplates:
- metadata:
name: geth
spec:
accessModes:
- ReadWriteOnce
storageClassName: efs-dyn-sc
resources:
requests:
storage: 5Gi

所有pod现在都写入自己的/data。

go ethereum的多个实例不能重用同一目录,因此您有以下选项:

  1. 对每个pod使用相同的持久卷,并对每个pod 使用子目录

  2. 为每个吊舱使用单独的持久卷,然后每个吊舱都可以使用相同的/data路径

最新更新