我按照此链接创建持久卷声明并在 AWS Fargate 上的 Pod 中使用它。
这是我的配置文件
redis-csi.yaml:
kind: CSIDriver
metadata:
name: efs.csi.aws.com
spec:
attachRequired: false```
redis-sc.yaml :
```kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: efs-sc
namespace: $ns
provisioner: efs.csi.aws.com
redis-pv.yaml:
kind: PersistentVolume
metadata:
name: redis-efs-pv
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: efs-sc
csi:
driver: efs.csi.aws.com
volumeHandle: $WOF_EFS_FS_ID::$WOF_EFS_AP
redis-pvc.yaml:
kind: PersistentVolumeClaim
metadata:
name: redis-efs-uploads-pvc
namespace: $ns
spec:
accessModes:
- ReadWriteOnce
storageClassName: efs-sc
resources:
requests:
storage: 2Gi
redis-sts.yaml:
kind: StatefulSet
metadata:
name: redis-cluster
spec:
serviceName: redis-cluster
replicas: 1
selector:
matchLabels:
app: redis-cluster
template:
metadata:
labels:
app: redis-cluster
spec:
containers:
- name: redis
image: redis:alpine
command:
- redis-server
- "/redis-master/redis.conf"
env:
- name: MASTER
value: "true"
ports:
- containerPort: 6379
name: client
- containerPort: 16379
name: gossip
volumeMounts:
- mountPath: /redis-master-data
name: data
- mountPath: /redis-master
name: config
volumes:
- name: data
persistentVolumeClaim:
claimName: redis-efs-uploads-pvc
- name: config
configMap:
name: redis-config-map
items:
- key: redis-config
path: redis.conf
这是我脚本的一部分:
kubectl config set-context --current --namespace=$ns
kubectl apply -f volume/redis-csi.yaml
( echo "cat <<EOF" ; cat volume/redis-sc.yaml; echo EOF ) | sh | kubectl apply -f -
export WOF_EFS_FS_ID=$WOF_EFS_FS_ID
export WOF_EFS_AP=$WOF_EFS_AP
( echo "cat <<EOF" ; cat volume/redis-pv.yaml; echo EOF ) | sh | kubectl apply -f -
( echo "cat <<EOF" ; cat volume/redis-pvc.yaml; echo EOF ) | sh | kubectl apply -f -
( echo "cat <<EOF" ; cat redis-config-map.yaml; echo EOF ) | sh | kubectl apply -f -
kubectl apply -f redis-sts.yaml
问题
当 ns = default 时:一切都很好,我的 redis 容器已启动。但是当我创建其他命名空间并设置 ns=othernamespace 时,我的 pod 出现以下错误:
Warning FailedMount 91s (x11 over 7m43s) kubelet MountVolume.MountDevice failed for volume "redis-efs-pv" : kubernetes.io/csi: attacher.MountDevice failed to create newCsiDriverClient: driver name efs.csi.aws.com not found in the list of registered CSI drivers
Warning FailedMount 67s (x2 over 3m22s) kubelet Unable to attach or mount volumes: unmounted volumes=[data], unattached volumes=[config kube-api-access-t44sq data]: timed out waiting for the condition
每次我删除所有内容并在默认命名空间上重新创建所有内容时,Pod 都会正确启动。但是当我尝试在其他命名空间中部署时,出现上述错误。
根据您提供的配置,您似乎正在手动创建
AWS EFS CSI driver
CSIDriver
我建议您采取正确的行为,即通过 Amazon EKS 附加组件安装 Amazon EFS CSI 驱动程序。要将 Amazon EFS 加载项添加到您的集群,请参阅创建 EFS 加载项。
或者,如果您想要自行管理 Amazon EFS CSI 驱动程序安装,请参阅 GitHub 上的安装。
StorageClass 资源不应该是命名空间的,这可能是您问题的原因吗?
出于兴趣,是否已将
volumeAttributes
添加到您的活动持久卷中的 spec.csi
中?
我遇到了同样的问题,问题的根源是我限制了 EFS CSI 驱动程序的
node
组件仅在我的“关键”节点上运行,而不是在我的“正常”节点上运行。我通过在 AWS 中的 EFS CSI 驱动程序附加组件的可选配置值中包含以下内容,实现了这一令人印象深刻的壮举 (!):
node:
nodeSelector:
eks.amazonaws.com/nodegroup: eks-node-group-critical
tolerations:
- effect: "NoSchedule"
key: "cluster-priority"
operator: "Equal"
value: "critical"
如果您也这样做过,请不要这样做:)。
node
组件需要在每个集群的节点上运行,以确保驱动程序本身安装到每个节点的文件系统中。阅读更多这里