【问题标题】:Kubernetes PersistentVolumeClaim issues in AWSAWS 中的 Kubernetes PersistentVolumeClaim 问题
【发布时间】:2018-01-26 06:13:14
【问题描述】:

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

【问题讨论】:

标签: kubernetes


【解决方案1】:

当您使用 ReadWriteOnce 卷(不能同时挂载到多个 pod 的卷)时,简单的 PV/PVC 创建不会削减它。

PV 和 PVC 都非常“单一”,如果您在 Deployment 中引用特定的声明名称,您的 pod 都将尝试获取相同的声明以及绑定到该声明的相同 pv,从而导致一种竞争条件,其中只有一个 pod 将是第一个并且只允许安装该 RWO 存储。

为了缓解这种情况,您不应该直接使用 PVC,而是通过 volumeClaimTemplates 为每个缩放的新 pod 动态创建 PVC,如下所示:

 volumeClaimTemplates:
  - metadata:
      name: claimname
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

【讨论】:

  • 感谢您的回复。我试图修改 PVC YAML 文件并尝试在创建时创建我面临以下错误
  • 错误:“io.k8s.api.core.v1.PersistentVolumeClaim 中的未知字段“volumeClaimTemplates”;如果您选择忽略这些错误”
  • 种类:PersistentVolumeClaim apiVersion:v1 volumeClaimTemplates:-元数据:名称:mongopvc 标签:类型:amazonEBS 规范:accessModes:[“ReadWriteOnce”] 资源:请求:存储:10Gi
  • 我写过这样的脚本。提前谢谢你。
  • volumeClaimTemplates 不是 PVC 规范的一部分,而是 Deployment pod 模板中的 PodSpec
【解决方案2】:

我认为您面临的问题是由底层存储机制引起的,在这种情况下是 EBS。

在复制控制器后面扩展 Pod 时,每个副本都将尝试挂载相同的持久卷。如果您查看有关 EBS 的 K8 docs,您将看到以下内容:

使用 awsElasticBlockStore 卷时有一些限制: 运行 Pod 的节点必须是 AWS EC2 实例 实例需要与 EBS 卷 EBS 仅支持单个 EC2 实例挂载卷

因此,默认情况下,当您在复制控制器后面进行扩展时,Kubernetes 将尝试跨不同节点传播,这意味着第二个节点正在尝试挂载此卷,而 EBS 不允许这样做。

基本上,我看到您有两个选择。

  1. 使用不同的卷类型。 nfsGlusterfs
  2. 使用StatefulSet 代替复制控制器,并让每个副本安装一个独立的卷。需要数据库复制,但提供高可用性。

【讨论】:

  • 不幸的是,如果您想要任何缩放,这不是解决方案,如我的回答中所述,volumeClaimTemplates 是要走的路
  • 您描述的解决方案通常可以工作,但由于我上面概述的原因,它不适用于 ebs。或者您是说当您以这种方式扩大副本时,它们都会安装不同的 pv 或只是创建自己的声明?
  • 没错,每个新的 pod 都会创建自己的 PVC,然后通过这种方式获得自己的 EBS/PV
  • @Radek'Goblin'Pieczonka 很有趣,我没有意识到这一点。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2018-12-23
  • 2018-01-21
  • 2021-11-06
  • 1970-01-01
相关资源
最近更新 更多