AWS中的Kubernetes PersistentVolumeClaim问题

时间:2018-01-26 06:13:15

标签: kubernetes

我们根据项目要求成功创建了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

2 个答案:

答案 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不允许的。

基本上,我看到你有两种选择。

  1. 使用其他卷类型。 nfsGlusterfs
  2. 使用StatefulSet而不是复制控制器,让每个副本装入一个独立的卷。需要数据库复制但提供高可用性。