我正在尝试在我们的k8s集群上安装Cassandra有状态副本集。我们希望将AWS EFS挂载到所有Cassandra pod上。在配置卷时,我发现有两种声明卷的方式。
- 创建一个EFS,在我们的集群上安装efs-provisioner(一种持久卷插件),创建一个
PersistentVolume
与EFS-provisioner一起使用,并在Pod模板中使用volumeClaimTemplates
(我认为实际上是指persistentVolumeClaimTemplates,我不知道他们为什么忽略了persistent前缀)。像这样:
apiVersion: v1
kind: Pod
metadata:
name: hello-openshift-nfs-pod
labels:
name: hello-openshift-nfs-pod
spec:
containers:
- name: hello-openshift-nfs-pod
image: openshift/hello-openshift
ports:
- name: web
containerPort: 80
volumeMounts:
- name: nfsvol
mountPath: /usr/share/nginx/html
securityContext:
supplementalGroups: [100003]
privileged: false
volumes:
- name: nfsvol
persistentVolumeClaim:
claimName: nfs-pvc
(来自文章的代码)
- 或者,我可以直接将EFS挂载到我的Cassandra pod上:
apiVersion: v1
kind: Pod
metadata:
name: hello-openshift-nfs-pod
labels:
name: hello-openshift-nfs-pod
spec:
containers:
- name: hello-openshift-nfs-pod
image: openshift/hello-openshift
ports:
- name: web
containerPort: 80
volumeMounts:
- name: nfsvol
mountPath: /usr/share/nginx/html
securityContext:
supplementalGroups: [100003]
privileged: false
volumes:
- name: cassandra-shared-volume
nfs:
server: <EFS file system endpoint url>
path: "/cassandra/shared"
所以对我来说,方法1就像将nfs(在这种情况下是EFS)包装在持久卷中。虽然几乎每个团队都使用nfs,但我不知道方法1的主要好处是什么。在
efs-provisioner
的FAQ中有一个简短的答案:他们说:“我注意到EFS直接挂载到efs-provisioner容器,我可以为我的应用程序做到这一点吗?是的,但不建议这样做。您会失去StorageClass的可重用性,无法为新容器和Pod动态提供新的PersistentVolumes。” 这个答案很好,但我想知道是否比单独的更有含义。有一个StatefulSet
文档说: “给定Pod的存储必须由基于请求的存储类的PersistentVolume Provisioner进行配置,或者由管理员预先配置。”所以我想知道 StatefulSet 是否必须具有 PersistentVolume 存储类型。主要冲突在于,与块存储不同,EFS 本身是持久性的,并且其动态扩展能力已由 AWS 处理,不需要 persistentVolumeProvisioner 来创建新资源。
我想知道方法1是否有任何重大优点或方法2中的缺陷,我必须使用方法1吗?