跳到主要内容

PostgreSQL 集群扩缩容

KubeBlocks 支持对 PostgreSQL 集群进行垂直扩缩容。

备注

集群垂直或水平扩缩容后,KubeBlocks 会根据新的规格自动匹配合适的配置模板。这因为 KubeBlocks 在 v0.9.0 中引入了动态配置功能。该功能简化了配置参数的过程,节省了时间和精力,并减少了由于配置错误引起的性能问题。有关详细说明,请参阅配置

垂直扩缩容

你可以通过更改资源需求和限制(CPU 和存储)来垂直扩展集群。例如,可通过垂直扩容将资源类别从 1C2G 调整为 2C4G。

开始之前

确保集群处于 Running 状态,否则以下操作可能会失败。

kubectl -n demo get cluster mycluster
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster postgresql postgresql-14.8.0 Delete Running 29m

步骤

  1. 对指定的集群应用 OpsRequest,可根据您的需求配置参数。

    kubectl apply -f - <<EOF
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: OpsRequest
    metadata:
    name: ops-vertical-scaling
    namespace: demo
    spec:
    clusterName: mycluster
    type: VerticalScaling
    verticalScaling:
    - componentName: postgresql
    requests:
    memory: "2Gi"
    cpu: "1"
    limits:
    memory: "4Gi"
    cpu: "2"
    EOF
  2. 查看运维任务状态,验证垂直扩缩容操作是否成功。

    kubectl get ops -n demo
    >
    NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
    demo ops-vertical-scaling VerticalScaling mycluster Succeed 3/3 6m

    如果有报错,可执行 kubectl describe ops -n demo 命令查看该运维操作的相关事件,协助排障。

  3. 当 OpsRequest 状态为 Succeed 或集群状态再次回到 Running 后,查看相应资源是否变更。

    kubectl describe cluster mycluster -n demo
    >
    ......
    Component Specs:
    Component Def Ref: postgresql
    Enabled Logs:
    running
    DisableExporter: true
    Name: postgresql
    Replicas: 2
    Resources:
    Limits:
    Cpu: 2
    Memory: 4Gi
    Requests:
    Cpu: 1
    Memory: 2Gi

水平扩缩容

水平扩缩容会改变 Pod 的数量。例如,你可以应用水平扩容将 Pod 的数量从三个增加到五个。

从 v0.9.0 开始,KubeBlocks 支持指定实例水平扩缩容,可参考 水平扩缩容相关文档,查看详细介绍及示例。

开始之前

确保集群处于 Running 状态,否则以下操作可能会失败。

kubectl -n demo get cluster mycluster
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster postgresql postgresql-14.8.0 Delete Running 29m

步骤

  1. 对指定的集群应用 OpsRequest,可根据您的需求配置参数。

    以下示例演示了增加 2 个副本。

    kubectl apply -f - <<EOF
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: OpsRequest
    metadata:
    name: ops-horizontal-scaling
    namespace: demo
    spec:
    clusterName: mycluster
    type: HorizontalScaling
    horizontalScaling:
    - componentName: postgresql
    scaleOut:
    replicaChanges: 2
    EOF

    如果您想要缩容,可将 scaleOut 替换为 scaleIn

    以下示例演示了删除 2 个副本。

    kubectl apply -f - <<EOF
    apiVersion: apps.kubeblocks.io/v1alpha1
    kind: OpsRequest
    metadata:
    name: ops-horizontal-scaling
    namespace: demo
    spec:
    clusterName: mycluster
    type: HorizontalScaling
    horizontalScaling:
    - componentName: postgresql
    scaleIn:
    replicaChanges: 2
    EOF
  2. 查看运维操作状态,验证水平扩缩容是否成功。

    kubectl get ops -n demo
    >
    NAMESPACE NAME TYPE CLUSTER STATUS PROGRESS AGE
    demo ops-horizontal-scaling HorizontalScaling mycluster Succeed 3/3 6m

    如果有报错,可执行 kubectl describe ops -n demo 命令查看该运维操作的相关事件,协助排障。

  3. 当 OpsRequest 状态为 Succeed 或集群状态再次回到 Running 后,查看相应资源是否变更。

    kubectl describe cluster mycluster -n demo

处理快照异常

如果在水平扩容过程中出现 STATUS=ConditionsError,你可以从 cluster.status.condition.message 中找到原因并进行故障排除。如下所示,该例子中发生了快照异常。

Status:
conditions:
- lastTransitionTime: "2023-04-08T04:20:26Z"
message: VolumeSnapshot/pg-cluster-postgresql-scaling-dbqgp: Failed to set default snapshot
class with error cannot find default snapshot class
reason: ApplyResourcesFailed
status: "False"
type: ApplyResources

原因

此异常发生的原因是未配置 VolumeSnapshotClass。可以通过配置 VolumeSnapshotClass 解决问题。

但此时,水平扩容仍然无法继续运行。这是因为错误的备份(volumesnapshot 由备份生成)和之前生成的 volumesnapshot 仍然存在。需删除这两个错误的资源,KubeBlocks 才能重新生成新的资源。

步骤:

  1. 配置 VolumeSnapshotClass。

    kubectl create -f - <<EOF
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshotClass
    metadata:
    name: csi-aws-vsc
    annotations:
    snapshot.storage.kubernetes.io/is-default-class: "true"
    driver: ebs.csi.aws.com
    deletionPolicy: Delete
    EOF
  2. 删除错误的备份和 volumesnapshot 资源。

    kubectl delete backup -l app.kubernetes.io/instance=mycluster -n demo

    kubectl delete volumesnapshot -l app.kubernetes.io/instance=mycluster -n demo

结果

删除备份和 volumesnapshot 后,水平扩容继续进行,集群恢复到 Running 状态。