我们根据项目要求成功创建了pod,服务和复制控制器。现在我们计划使用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
答案 0 :(得分:0)
当您使用ReadWriteOnce卷(无法同时安装到多个pod)时,简单的PV / PVC创建不会削减它。
PV和PVC都很漂亮"奇异"在某种程度上,如果你在部署中引用一个特定的声明名称,你的pod将全部尝试获得相同的一个声明和相同的一个pv绑定到该声明,导致竞争条件,其中只有一个pod将是首先,只允许安装RWO存储。
为了减轻这种影响,您应该直接使用不是PVC,而是通过volumeClaimTemplates,它将为每个缩放的新pod创建PVC动态,如下所示:
volumeClaimTemplates:
- metadata:
name: claimname
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
答案 1 :(得分:0)
我认为您面临的问题是由底层存储机制引起的,在本例中为EBS。
在复制控制器后面扩展Pod时,每个副本将尝试挂载相同的持久卷。如果您查看有关EBS的K8 docs,您将看到以下内容:
使用awsElasticBlockStore卷时存在一些限制: 正在运行pod的节点必须是AWS EC2实例 实例需要位于相同的区域和可用区域中 EBS卷EBS仅支持安装卷的单个EC2实例
因此,默认情况下,当您在复制控制器后面扩展时,Kubernetes将尝试分布在不同的节点上,这意味着第二个节点正在尝试安装此卷,这是EBS不允许的。
基本上,我看到你有两种选择。
nfs
,Glusterfs
等