我正试图在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的多个实例不能重用同一目录,因此您有以下选项:
-
对每个pod使用相同的持久卷,并对每个pod 使用子目录
-
为每个吊舱使用单独的持久卷,然后每个吊舱都可以使用相同的
/data
路径