用 KubeBlocks 管理 RabbitMQ
RabbitMQ 是可靠且成熟的消息和流处理中间件,支持在云环境、本地数据中心或个人计算机上部署。
本文档展示了如何通过 kbcli、kubectl 等方式创建和管理 RabbitMQ 集群。您可以在 GitHub 仓库查看 YAML 示例。
当前,KubeBlocks 仅支持通过 kubectl 管理 RabbitMQ 集群.
开始之前
创建集群
KubeBlocks 通过 Cluster 定义集群。以下是创建 RabbitMQ 集群的示例。Pod 默认分布在不同节点。但如果您只有一个节点可用于部署集群,可将 spec.affinity.topologyKeys 设置为 null。
生产环境中,不建议将所有副本部署在同一个节点上,因为这可能会 降低集群的可用性。
cat <<EOF | kubectl apply -f -
apiVersion: apps.kubeblocks.io/v1alpha1
kind: Cluster
metadata:
name: mycluster
namespace: demo
labels:
helm.sh/chart: rabbitmq-cluster-0.9.0
app.kubernetes.io/version: "3.13.2"
app.kubernetes.io/instance: mycluster
spec:
terminationPolicy: Delete
affinity:
podAntiAffinity: Preferred
topologyKeys:
- kubernetes.io/hostname
componentSpecs:
- name: rabbitmq
componentDef: rabbitmq
serviceVersion: 3.13.2
replicas: 3
serviceAccountName: kb-mycluster
resources:
limits:
cpu: "0.5"
memory: "0.5Gi"
requests:
cpu: "0.5"
memory: "0.5Gi"
volumeClaimTemplates:
- name: data # ref clusterDefinition components.containers.volumeMounts.name
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
services:
EOF
| 字段 | 定义 |
|---|---|
spec.terminationPolicy | 集群的终止策略,默认值为 Delete,有效值为 DoNotTerminate、Halt、Delete 和 WipeOut。 具体定义可参考 终止策略。 |
spec.affinity | 为集群的 Pods 定义了一组节点亲和性调度规则。该字段可控制 Pods 在集群中节点上的分布。 |
spec.affinity.podAntiAffinity | 定义了不在同一 component 中的 Pods 的反亲和性水平。该字段决定了 Pods 以何种方式跨节点分布,以提升可用性和性能。 |
spec.affinity.topologyKeys | 用于定义 Pod 反亲和性和 Pod 分布约束的拓扑域的节点标签值。 |
spec.tolerations | 该字段为数组,用于定义集群中 Pods 的容忍,确保 Pod 可被调度到具有匹配污点的节点上。 |
spec.componentSpecs | 集群 components 列表,定义了集群 components。该字段允许对集群中的每个 component 进行自定义配置。 |
spec.componentSpecs.componentDefRef | 表示 cluster definition 中定义的 component definition 的名称,可通过执行 kubectl get clusterdefinition rabbitmq -o json | jq '.spec.componentDefs[].name' 命令获取 component definition 名称。 |
spec.componentSpecs.name | 定义了 component 的名称。 |
spec.componentSpecs.disableExporter | 定义了是否开启监控功能。 |
spec.componentSpecs.replicas | 定义了 component 中 replicas 的数量。 |
spec.componentSpecs.resources | 定义了 component 的资源要求。 |
KubeBlocks operator 监控 Cluster CRD 并创建集群和全部依赖资源。您可执行以下命令获取集群创建的所有资源信息。
kubectl get all,secret,rolebinding,serviceaccount -l app.kubernetes.io/instance=mycluster -n demo
执行以下命令,查看已创建的 RabbitMQ 集群。
kubectl get cluster mycluster -n demo -o yaml
连接集群
可使用 RabbitMQ tools 连接并管理 RabbitMQ 集群。
扩缩容
垂直扩缩容
开始之前
确认集群状态是否为 Running。否则,后续相关操作可能会失败。
kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster Delete Running 47m
步骤
- OpsRequest
- 修改集群 YAML 文件
-
对指定的集群应用 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: rabbitmq
requests:
memory: "2Gi"
cpu: "1"
limits:
memory: "4Gi"
cpu: "2"
EOF -
查看运维任务状态,验证垂直扩缩容操作是否成功。
kubectl get ops -n demo
>
NAME TYPE CLUSTER STATUS PROGRESS AGE
ops-vertical-scaling VerticalScaling mycluster Succeed 3/3 6m如果有报错,可 执行
kubectl describe ops -n demo命令查看该运维操作的相关事件,协助排障。 -
当 OpsRequest 状态为
Succeed或集群状态再次回到Running后,查看相应资源是否变更。kubectl describe cluster mycluster -n demo
-
修改 YAML 文件中
spec.componentSpecs.resources的配置。spec.componentSpecs.resources控制资源的请求值和限制值,修改参数值将触发垂直扩缩容。kubectl edit cluster mycluster -n demo在编辑器中修改
spec.componentSpecs.resources的值。...
spec:
componentSpecs:
- name: rabbitmq
componentDefRef: rabbitmq
replicas: 3
resources: # 修改 resources 中的参数值
requests:
memory: "2Gi"
cpu: "1"
limits:
memory: "4Gi"
cpu: "2"
... -
当集群状态再次回到
Running后,查看相应资源是否变更。kubectl describe cluster mycluster -n demo
水平伸缩
水平扩展改变 Pod 的数量。例如,您可以将副本从三个扩展到五个。
从 v0.9.0 开始,KubeBlocks 还支持了指定实例扩缩容。可通过 水平扩缩容文档 文档了解更多细节和示例。
开始之前
确认集群状态是否为 Running。否则,后续相关操作可能会失败。
kubectl get cluster mycluster -n demo
>
NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
mycluster Delete Running 47m
步骤
- OpsRequest
- 编辑集群 YAML 文件
-
对指定的集群应用 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: rabbitmq
scaleIn:
replicaChanges: 2
EOF如果您想要缩容,可将
scaleOut替换为scaleIn,并修改replicaChanges的参数值。 -
查看运维操作状态,验证水平扩缩容是否成功。
kubectl get ops -n demo
>
NAME TYPE CLUSTER STATUS PROGRESS AGE
ops-horizontal-scaling HorizontalScaling mycluster Succeed 2/2 6m如果有报错,可执行
kubectl describe ops -n demo命令查看该运 维操作的相关事件,协助排障。 -
当 OpsRequest 状态为
Succeed或集群状态再次回到Running后,查看相应资源是否变更。kubectl describe cluster mycluster -n demo
-
修改 YAML 文件中
spec.componentSpecs.replicas的配置。spec.componentSpecs.replicas定义了 pod 数量,修改该参数将触发集群水平扩缩容。kubectl edit cluster mycluster -n demo在编辑器中修改
spec.componentSpecs.replicas的值。...
spec:
componentSpecs:
- name: rabbitmq
componentDefRef: rabbitmq
replicas: 1 # 修改参数值
... -
当集群状态再次回到
Running后,查看相关资源是否变更。kubectl describe cluster mycluster -n demo