【问题标题】:Kubernetes PersistentVolumeClaim issues in AWS using Pod AutoscalingAWS 中使用 Pod 自动缩放的 Kubernetes PersistentVolumeClaim 问题
【发布时间】:2018-01-29 23:31:53
【问题描述】:

我们已经根据我们的项目要求成功创建了 pod、服务和复制控制器。现在我们计划使用 Kubernetes 在 AWS 中设置持久性存储。我已经创建了 YAML 文件以在 AWS 中创建 EBS 卷,它按预期工作正常。我能够认领卷并成功挂载到我的 pod(这仅适用于单个副本)。

我能够成功创建文件。卷也在创建,但我的 Pod 将进入挂起状态,卷仍然在 aws 中显示可用状态。我在那里看不到任何错误日志。

存储文件:

kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: mongo-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
  type: gp2

主文件:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
    name: web2
spec:
  selector:
    matchLabels:
      app: mongodb
  serviceName: "mongodb"
  replicas: 2
  template:
    metadata:
      labels:
        app: mongodb
      annotations:
         pod.alpha.kubernetes.io/initialized: "true"
    spec:
      containers:
      - image: mongo
        name: mongodb
        ports:
        - name: web2
          containerPort: 27017
          hostPort: 27017
        volumeMounts:
        - mountPath: "/opt/couchbase/var"
          name: mypd1
  volumeClaimTemplates:
  - metadata:
      name: mypd1
      annotations:
        volume.alpha.kubernetes.io/storage-class: mongo-ssd
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

现在我打算设置一个 pod Autoscaling。我已经看到了用于部署和 ReplicationContoller 的 pod 自动缩放。我可以知道我们也可以为 Stateful set 实现 pod 自动缩放吗?

【问题讨论】:

  • 只是增加replicas。它不应该工作吗?

标签: kubernetes statefulset volume-claim-template


【解决方案1】:

Horizo​​ntal Pod Autoscaler 只能扩展 Deployment、Replica Set 或 Replication Controller。您无法扩展有状态集。 (见Kubernetes Docu for more details

主要原因是大多数在 Stateful Sets 中运行的有状态应用程序(例如您的 MongoDB)通常不像以 Deployments 运行的无状态应用程序那样容易扩展/缩减。对于有状态的应用程序来说,向上和向下扩展通常是相当复杂的过程,您不想仅基于自动缩放器来进行。它通常在它自己的应用程序中需要一些额外的支持逻辑。尤其是随着规模的缩小,它也可能意味着您的数据存在风险。自动缩放对于负载的短期变化更有用。有状态集的扩展需要更长远的思考。由于复杂性,您不希望您的数据库每分钟都在扩大和缩小。

【讨论】:

  • 感谢您的回复。我同意你的观点。如果我使用部署和复制控制器,我们如何在 AWS 中管理卷?
  • 我们已经根据我们的项目要求成功地创建了 Pod、服务和复制控制器。现在我们计划使用 Kubernetes 在 AWS 中设置持久性存储。我已经创建了 YAML 文件以在 AWS 中创建 EBS 卷,它按预期工作正常。我能够声明卷并成功挂载到我的 pod(这仅适用于单个副本)。我能够成功创建文件。卷也在创建,但我的 Pod 将进入挂起状态,卷仍然在 aws 中显示可用状态。我在那里看不到任何错误日志
  • 仅使用 statefulset 我可以在不同的可用区域中创建卷以及我的 pod。如果我使用复制控制器和部署进行自动缩放,我的卷将如何创建?
  • 部署/复制控制器更适合不使用永久磁盘的无状态进程。所以问题是,如果您需要部署/复制控制器创建的 pod 中的持久卷,您的架构是否“正确”。你真的需要一个持久的卷吗?如果只是一些临时数据,您可以使用诸如 emptyDir 卷之类的东西,它可以与部署/复制控制器一起正常工作。
  • 感谢 Jakub 的回复。我们的应用程序堆栈是 Tomcat/JBoss、Kafka、Hivemq、postgress、Mongodb、EFS、持久性卷(Amazon EBS)、Redis、NFS/EFS(来自亚马逊)..等。假设如果计划为每个 pod 设置 2 个副本,如何计划持久性卷?如果我使用“volumeMount”conecpt,我可以为每个 POD 附加一个卷。如果我的 pod 将尝试创建 2 个 POD,第 2 个卷将能够使用适用于 RC 和 Deployement 的“Volume Mont conect”创建。但是如果使用有状态集“使用 VolumeMount 模板”我可以创建没有。卷和我的 pod 一起,但这适用于 AS
猜你喜欢
  • 1970-01-01
  • 2019-08-07
  • 2021-04-07
  • 2021-01-26
  • 2017-01-18
  • 1970-01-01
  • 2017-05-20
  • 1970-01-01
  • 2021-01-22
相关资源
最近更新 更多