我们根据项目要求成功创建了 Pod、服务和复制 Controller 。现在我们计划使用 Kubernetes 在 AWS 中设置持久存储。我已经创建了 YAML 文件来在 AWS 中创建 EBS 卷,它按预期工作正常。我能够声明卷并成功挂载到我的 Pod(这仅适用于单个副本)。
但是当我尝试创建更多单一副本时,我的 pod 没有创建成功。当我尝试创建卷时,它仅在一个可用区中创建。如果我的 pod 是在不同的区域节点中创建的,由于我的卷已经在不同的区域中创建,因此我的 pod 未创建成功。如何为同一应用程序在不同区域创建卷?如何使其成功并复制?如何创建我的持久卷声明?
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: mongo-pvc
labels:
type: amazonEBS
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: ReplicationController
metadata:
labels:
name: mongo-pp
name: mongo-controller-pp
spec:
replicas: 2
template:
metadata:
labels:
name: mongo-pp
spec:
containers:
- image: mongo
name: mongo-pp
ports:
- name: mongo-pp
containerPort: 27017
hostPort: 27017
volumeMounts:
- mountPath: "/opt/couchbase/var"
name: mypd1
volumes:
- name: mypd1
persistentVolumeClaim:
claimName: mongo-pvc
最佳答案
当您使用 ReadWriteOnce 卷(无法同时挂载到多个 Pod 的卷)时,简单的 PV/PVC 创建将无法解决问题。
PV 和 PVC 在某种程度上都非常“单一”,如果您在 Deployment 中引用特定的声明名称,您的 pod 都会尝试获取相同的一个声明以及绑定(bind)到该声明的相同的 pv,从而导致一种竞争条件,其中只有一个 pod 是第一个并且只允许安装该 RWO 存储。
为了缓解这种情况,您不应该直接使用 PVC,而是通过volumeClaimTemplates 来为每个缩放的新 Pod 动态创建 PVC,如下所示:
volumeClaimTemplates:
- metadata:
name: claimname
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
关于AWS 中的 Kubernetes PersistentVolumeClaim 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48456540/