【问题标题】:How to use VPA with database pod in kubernetes?如何在 Kubernetes 中将 VPA 与数据库 pod 一起使用?
【发布时间】:2020-11-03 09:12:13
【问题描述】:

我想为数据库 pod 应用 VPA 垂直 pod 自动缩放。我们可以将VPA 用于数据库自动缩放(垂直)吗,因为VPA 需要至少2 个副本(参考:https://github.com/kubernetes/autoscaler/issues/1665#issuecomment-464679271),因为它会在达到设定标准时删除 Pod。因此 pod 被删除,因此数据也被删除。

在数据库 pod 中使用 VPA 有什么好的做法?

【问题讨论】:

  • 要在 pod 被删除/重新创建后保留数据,您需要使用 Statefulset: kubernetes.io/docs/concepts/workloads/controllers/statefulset 。正如您所说,VPA 至少需要 2 个副本才能正常运行。您可以使用 Postgres operator 之类的东西来创建一个带有复制功能的 postgres 集群(具有 2 个或更多副本)。之后,您可以将 VPA 应用于此 Statefulset,即使在重新创建 pod 的情况下,存储在持久卷上的数据也不会丢失。如果此解决方案适合您的需求,请告诉我。

标签: kubernetes google-kubernetes-engine autoscaling


【解决方案1】:

据我了解,真正的问题是如何运行具有多个副本的有状态工作负载。

使用 StatefulSets 为数据库配置 n 个副本。 StatefulSet pod 具有稳定的名称,这些名称在 pod 重新启动(和轮回)时保留。结合PersistentVolumeClaim模板(接受StatefulSet规范)和headless services,它能够跨轮回保留相同的卷和网络FQDN。

查看各种数据库的 Helm 图表,例如MySQL chart,获取有用的见解。

附带说明一下,可能值得考虑为您正在使用的数据库应用程序使用运算符。大多数应用程序的运算符可以在https://operatorhub.io 上找到。

【讨论】:

  • 我可以使用 postgres 做 VPA(垂直 Pod 自动缩放)吗?
  • 我的问题与如何运行具有多个副本的有状态工作负载无关
  • 我不明白为什么不呢?
  • "我们可以将 VPA 用于数据库自动扩展(垂直)吗,因为 VPA 需要至少 2 个副本(参考:github.com/kubernetes/autoscaler/issues/…),因为它会在达到设定条件时删除 pod。所以 pod 是因此也删除了数据。” 我不明白它是怎么回事。如果你有适当的 Postgres 设置,设置 VPA 就不会引起这样的担忧。 Pod 在 Kubernetes 中出现宕机和恢复被认为是正常现象。如果您担心数据丢失,那么您正是需要的答案。
  • 我也可以建议使用超过 2 个副本来避免裂脑吗? en.m.wikipedia.org/wiki/Split-brain_(computing)
【解决方案2】:

VPA - 垂直 pod 自动缩放器可以通过 2 种方式工作:

  • 推荐模式 - 它将根据使用的资源推荐 Pod 的请求和限制
  • 自动模式 - 它将自动分析使用情况并设置 Pod 的请求和限制。这将导致 pod 终止以使用此处所述的新规范重新创建它:

由于 Kubernetes 的限制,修改正在运行的 Pod 的资源请求的唯一方法是重新创建 Pod。如果您创建了一个 updateMode 为 "Auto" 的 VerticalPodAutoscaler,如果需要更改 Pod 的资源请求,VerticalPodAutoscaler 会驱逐 Pod。

Cloud.google.com: Kubernetes Engine: Docs: Concepts: Vertical pod autoscaler

有关VPA 概念的更多信息,请参阅上面的链接。

它需要至少 2 个副本这一事实很可能与高可用性有关。随着 pod 被驱逐以支持新的限制,它们无法处理请求。如果遇到当时只有 1 个副本的情况,该副本在终止/重新创建状态时将无法响应请求。

GKE 上运行 VPA 有官方指南:

VPA 支持:Deployments 以及 StatefulSets

有状态集

与 Deployment 类似,StatefulSet 管理基于相同容器规范的 Pod。与 Deployment 不同,StatefulSet 为其每个 Pod 维护一个粘性标识。这些 pod 是根据相同的规范创建的,但不可互换:每个 pod 都有一个持久标识符,它在任何重新调度时都会维护该标识符。

如果您想使用存储卷为工作负载提供持久性,您可以使用 StatefulSet 作为解决方案的一部分。

Kubernetes.io: StatefulSet

StatefulSet配置为PersistentVolumes将确保存储在PV上的数据不会在pod终止的情况下被删除。

为了能够通过replicas > 1 使用您的数据库,您需要在您的数据库环境中实现replication

有关于在 Kubernetes 环境中运行数据库的指南/资源/解决方案。请选择最适合您的用例的解决方案。其中一些是:

部署数据库后,您将能够运行以下命令来提取 StatefulSet 的名称:

  • $ kubectl get sts

然后您可以将StatefulSet 的名称应用到VPA,如下所示:

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: DB-VPA 
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind:       StatefulSet
    name:       <INSERT_DB_STS_HERE>
  updatePolicy:
    updateMode: "Auto"

我鼓励您也阅读这篇文章:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-08
    • 2021-01-20
    • 1970-01-01
    • 2019-01-17
    • 2020-01-02
    • 1970-01-01
    • 2018-05-29
    • 2019-06-05
    相关资源
    最近更新 更多