背景
在当今数字化转型浪潮中,Kubernetes 已成为企业容器编排的标准平台,为应用提供了强大的自动化部署、扩展和管理能力。然而,随着越来越多的企业将关键业务应用迁移至 Kubernetes,如何高效管理数据库工作负载成为一项重要挑战。相比无状态应用,数据库需要处理持久化存储、高可用性、备份恢复、版本升级等复杂场景,这些都是传统 Kubernetes 原生功能难以完全覆盖的领域。
Red Hat OpenShift 是构建在 Kubernetes 之上的企业级容器平台,为企业提供了更完善的功能和工具链。相比开源 Kubernetes,OpenShift 增强了安全性(如 Security Context Constraints),提供了集成的 CI/CD 流水线、开发者工具和更完善的多租户支持。OpenShift 的项目隔离机制和企业级支持使其成为众多大型企业和组织的首选平台。
然而,即使在 OpenShift 这样成熟的平台上,数据库的管理仍然是一项复杂的工作,需要专业的工具和解决方案来简化操作流程。
KubeBlocks 是专为 Kubernetes 环境设计的云原生数据基础设施,它为企业在云原生环境中管理数据库工作负载提供了完整的解决方案。通过统一的控制平面,KubeBlocks 能够轻松管理 MySQL、PostgreSQL、MongoDB、Redis 等 30+ 种数据库引擎的全生命周期。
KubeBlocks 的核心优势:
- 多引擎支持:支持 30+ 种数据库引擎,避免技术栈碎片化
- 高可用架构:内置高可用配置和灾难恢复能力,确保业务连续性
- 自动化运维:全面自动化 Day-2 运维操作,包括备份、恢复、扩容和版本升级
- 云原生设计:深度集成 Kubernetes 生态,充分利用云原生优势
将 KubeBlocks 部署在 OpenShift 上,可以为企业提供一个统一、强大的数据库管理平台。这种组合充分发挥了 OpenShift 的企业级安全和管理能力,同时利用 KubeBlocks 专业的数据库运维功能,实现了应用和数据库的一体化管理。
通过 KubeBlocks,OpenShift 用户可以:
- 使用统一的接口和工具管理不同类型的数据库
- 自动化执行数据库部署、扩容、备份等复杂操作
- 与 OpenShift 的安全策略和监控系统无缝集成
- 降低数据库管理的复杂度和运维成本
本文将介绍如何在 OpenShift 上部署 KubeBlocks,并演示如何使用它来创建和管理 MySQL 和 PostgreSQL 数据库集群,帮助您构建企业级的统一数据库管理平台。同时,我们也会重点关注 OpenShift 特有的安全机制对部署过程的影响及其解决方案。
部署 KubeBlocks
前置条件
在 OpenShift 上部署 KubeBlocks 之前,请确保您具备以下条件:
- OpenShift 集群:版本 4.8 或更高
- 集群管理员权限:安装 Operator 和 CRD 需要管理员权限,需要的具体权限可以参考文档
- CLI 工具:
oc
(OpenShift 命令行工具)kubectl
(Kubernetes 命令行工具)helm
(版本 3.0+)
- 资源要求:
- 至少 3 个 Node,每个 Node 建议至少 8C16G
- 配置默认存储类
准备 OpenShift 集群
作者在 Azure 上创建了一个由 3 个控制面节点,3 个数据面节点构成的 OpenShift 集群来部署和验证 KubeBlocks。
Bash
*# 查看集群节点*
oc get nodes
NAME STATUS ROLES AGE VERSION
kbe-8rfgv-master-0 Ready control-plane,master 11d v1.30.11
kbe-8rfgv-master-1 Ready control-plane,master 11d v1.30.11
kbe-8rfgv-master-2 Ready control-plane,master 11d v1.30.11
kbe-8rfgv-worker-eastus1-7t2hw Ready worker 11d v1.30.11
kbe-8rfgv-worker-eastus2-cw62z Ready worker 11d v1.30.11
kbe-8rfgv-worker-eastus3-srrlp Ready worker 11d v1.30.11
*# 检查集群状态*
oc cluster-info
*# 验证是否具有集群管理员权限*oc auth can-i create clusterroles
安装 KubeBlocks CLI (kbcli)
kbcli 是 KubeBlocks 的命令行工具,用于管理 KubeBlocks 集群。Linux/MacOS 系统安装方式如下, 其他系统安装方式请参考文档。
Bash
*# 下载并安装 kbcli (Linux/MacOS 示例)*
curl -fsSL https://kubeblocks.io/installer/install_cli.sh | bash -s 1.0.1-beta.2
*# 验证安装*kbcli version
部署 KubeBlocks
参考 KubeBlocks 文档 使用 helm 部署 KubeBlocks。
Bash
*# 添加 KubeBlocks Helm 仓库*
helm repo add kubeblocks https://apecloud.github.io/helm-charts --force-update
*# 查看最新的版本,当前最新版本为 1.0.1-beta.14*
helm search repo kubeblocks/kubeblocks --versions --devel
*# 创建 KubeBlocks 依赖的 CRD*
kubectl create -f https://github.com/apecloud/kubeblocks/releases/download/v1.0.1-beta.14/kubeblocks_crds.yaml
*# 安装 KubeBlocks*helm install kubeblocks kubeblocks/kubeblocks --namespace kb-system --create-namespace --version 1.0.1-beta.14
如果使用私有镜像仓库,可以使用如下命令指定镜像仓库地址和访问凭证。
Bash
*# 创建 secret 用于存储访问私有镜像仓库的凭证*
kubectl create secret docker-registry <your-registry-secret-name> \
--docker-username=<your-username> \
--docker-password=<your-password> \
--docker-server=<your-registry-url>
*# 部署 KubeBlocks 并指定私有镜像仓库地址和访问凭证*
helm install kubeblocks kubeblocks/kubeblocks \
--namespace kb-system --create-namespace \
--version 1.0.1-beta.14 \
--set image.registry=<your-registry-url> \
--set image.imagePullSecrets[0].name=<your-registry-secret-name> \
--set dataProtection.image.registry=<your-registry-url> \
--set dataProtection.image.imagePullSecrets[0].name=<your-registry-secret-name>
执行以下操作验证 KubeBlocks 是否安装成功。
Bash
*# 检查 KubeBlocks Pod 是否正在运行*
kubectl get pods
NAME READY STATUS RESTARTS AGE
kubeblocks-84994765cf-zkz6t 1/1 Running 0 12m
kubeblocks-dataprotection-79dc8cd474-cdztr 1/1 Running 0 12m
*# 查看 KubeBlocks Addon*
kubectl get addon
NAME TYPE VERSION PROVIDER STATUS AGE
apecloud-mysql Helm 1.0.1-beta.0 community Enabled 13m
etcd Helm 1.0.1-beta.0 community Enabled 13m
kafka Helm 1.0.1-beta.0 community Enabled 13m
mongodb Helm 1.0.1-beta.0 community Enabled 13m
mysql Helm 1.0.1-beta.0 community Enabled 13m
postgresql Helm 1.0.1-beta.0 community Enabled 13m
qdrant Helm 1.0.1-beta.0 community Disabled 13m
rabbitmq Helm 1.0.1-beta.0 community Disabled 13m
redis Helm 1.0.1 community Enabled 13m
*# 查看 ServiceAccount 中是否正确设置私有镜像仓库拉取的 Secret*kubectl -n kb-system get sa kubeblocks -o jsonpath='{.imagePullSecrets}'
以上,KubeBlocks 已经安装完成,并且默认安装了 MySQL、PostgreSQL、Redis 等常用数据库引擎插件。
创建备份仓库
备份仓库(BackupRepo)是 KubeBlocks 对存放数据库备份的存储的抽象,目前支持主流云厂商的对象存储。为本文后续使用,在 Azure 上创建一个 Azure Blob 存储,并创建一个备份仓库。
Bash
*# 创建备份仓库*
kbcli backuprepo create azureblob \
--provider azureblob \
--account-key='<your-account-key>' \
--account-name='<your-account-name>' \
--default=true \
--container='<your-container-name>'
在创建备份仓库后,KubeBlocks 会自动创建一个 Job 检测对象存储的可访问性。由于该 Job 需要以 root 账号运行,而 OpenShift 的默认 SCC 策略出于安全考虑不允许这种操作,因此需要为相关的 ServiceAccount 配置适当的 SCC 权限:
Bash
*# 为运行备份仓库检测 Job 的 ServiceAccount 添加 anyuid SCC*oc adm policy add-scc-to-user anyuid -z kubeblocks-dataprotection-worker -n kb-system
安全说明:
anyuid
SCC 允许容器以任意用户 ID 运行,包括 root。请确保只为必要的 ServiceAccount 分配此权限。
查看备份仓库状态,确保达到 Ready
状态。
Bash
kubectl get backuprepo
NAME STATUS STORAGEPROVIDER ACCESSMETHOD DEFAULT AGE
azureblob Ready azureblob Tool true 21h
创建和运维数据库
创建项目
首先在 OpenShift 上创建一个项目,用于部署数据库集群。OpenShift 中的一个项目,与 Kubernetes 中的一个 namespace 对应,但提供了额外的安全隔离和资源管理功能。
Bash
*# 创建项目*oc new-project demo
KubeBlocks 在执行某些操作时(如创建备份、初始化 PostgreSQL 集群等)需要使用 root 权限运行 Pod,而 OpenShift 项目的默认安全策略不允许这种操作。这是使用 KubeBlocks 在 OpenShift 上的关键配置点。为了确保 KubeBlocks 正常工作,需要为项目配置适当的 SCC 权限:
Bash
*# 为 demo 项目添加 anyuid SCC,允许 Pod 以任意用户 ID 运行*oc adm policy add-scc-to-group anyuid system:serviceaccounts:demo
MySQL
创建 MySQL 集群
参考文档创建一个 MySQL 数据库集群。
Bash
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
name: example-mysql-cluster
namespace: demo
spec:
clusterDef: mysql
topology: semisync
terminationPolicy: Delete
componentSpecs:
- name: mysql
serviceVersion: 8.0.35
replicas: 2
resources:
limits:
cpu: '0.5'
memory: 0.5Gi
requests:
cpu: '0.5'
memory: 0.5Gi
volumeClaimTemplates:
- name: data
spec:
storageClassName: ""
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
EOF
查看 MySQL 集群的状态:
Bash
kubectl get cluster example-mysql-cluster -n demo
NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE
example-mysql-cluster mysql Delete Running 3m41s
垂直扩容
执行如下命令,将集群扩容为 1C1G:
Bash
kubectl apply -f - <<EOF
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: example-mysql-cluster-vscale-ops
namespace: demo
spec:
clusterName: example-mysql-cluster
type: VerticalScaling
verticalScaling:
- componentName: mysql
requests:
cpu: '1'
memory: 1Gi
limits:
cpu: '1'
memory: 1Gi
EOF
查看集群资源:
Bash
kbcli cluster describe example-mysql-cluster -n demo
...
Resources Allocation:
COMPONENT INSTANCE-TEMPLATE CPU(REQUEST/LIMIT) MEMORY(REQUEST/LIMIT) STORAGE-SIZE STORAGE-CLASS
mysql 1 / 1 1Gi / 1Gi data:20Gi <none>
...
读者可以参考官方文档执行其他运维操作,在此不再一一展示。
备份恢复
参考文档创建一个全量备份:
Bash
kubectl apply -f - <<EOF
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: example-mysql-cluster-backup
namespace: demo
spec:
clusterName: example-mysql-cluster
force: false
backup:
backupPolicyName: example-mysql-cluster-mysql-backup-policy
backupMethod: xtrabackup
deletionPolicy: Delete
retentionPeriod: 1mo
type: Backup
EOF
查看备份状态:
Bash
kubectl get backup -n demo
NAME POLICY METHOD REPO STATUS TOTAL-SIZE DURATION DELETION-POLICY CREATION-TIME COMPLETION-TIME EXPIRATION-TIME
backup-demo-example-mysql-cluster-20250823080440 example-mysql-cluster-mysql-backup-policy xtrabackup azureblob Completed 2556817 11s Delete 2025-08-23T08:04:40Z 2025-08-23T08:04:50Z 2025-09-22T08:04:50Z
如果备份一直在 Running 状态,可以查看备份对应的 Job 状态。如果有类似以下事件信息,说明 ServiceAccount 的 SCC 没有设置正确,导致 Job 无法以 root 账号运行。这是 OpenShift 特有的安全限制导致的问题,请参考上文设置对应 ServiceAccount 或者 Namespace demo
的 SCC 权限。
PlainText
Warning FailedCreate 4s (x6 over 35s) job-controller Error creating: pods "dp-backup-0-backup-demo-example-mysql-cluster-20250823154613-50-" is forbidden: unable to validate against any security context constraint: [provider "anyuid": Forbidden: not usable by user or serviceaccount, provider restricted-v2: .containers[0].runAsUser: Invalid value: 0: must be in the ranges: [1000760000, 1000769999], provider restricted-v2: .containers[1].runAsUser: Invalid value: 0: must be in the ranges: [1000760000, 1000769999], provider "restricted": Forbidden: not usable by user or serviceaccount, provider "nonroot-v2": Forbidden: not usable by user or serviceaccount, provider "nonroot": Forbidden: not usable by user or serviceaccount, provider "hostmount-anyuid": Forbidden: not usable by user or serviceaccount, provider "machine-api-termination-handler": Forbidden: not usable by user or serviceaccount, provider "hostnetwork-v2": Forbidden: not usable by user or serviceaccount, provider "hostnetwork": Forbidden: not usable by user or serviceaccount, provider "hostaccess": Forbidden: not usable by user or serviceaccount, provider "node-exporter": Forbidden: not usable by user or serviceaccount, provider "privileged": Forbidden: not usable by user or serviceaccount, provider "privileged-genevalogging": Forbidden: not usable by user or serviceaccount]
使用该备份恢复一个新的 MySQL 集群,命令如下:
Bash
kbcli cluster restore example-mysql-cluster-restored --backup=backup-demo-example-mysql-cluster-20250823080440
查看恢复的集群的状态:
Bash
kubectl get cluster example-mysql-cluster-restored -n demo
NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE
example-mysql-cluster-restored mysql Delete Running 3m
PostgreSQL
创建 PostgreSQL 集群
参考文档创建一个 PostgreSQL 集群。
Bash
kubectl apply -f - <<EOF
apiVersion: apps.kubeblocks.io/v1
kind: Cluster
metadata:
name: pg-cluster
namespace: demo
spec:
terminationPolicy: Delete
clusterDef: postgresql
topology: replication
componentSpecs:
- name: postgresql
serviceVersion: 16.4.0
disableExporter: true
replicas: 2
resources:
limits:
cpu: "0.5"
memory: "0.5Gi"
requests:
cpu: "0.5"
memory: "0.5Gi"
volumeClaimTemplates:
- name: data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
EOF
查看 PostgreSQL 集群状态:
Bash
kubectl get cluster
NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE
pg-cluster postgresql Delete Running 6m7s
垂直扩容
执行如下命令,将 PostgreSQL 集群的资源配置扩容为 1C1G:
Bash
kubectl apply -f - <<EOF
apiVersion: operations.kubeblocks.io/v1alpha1
kind: OpsRequest
metadata:
name: pg-cluster-vscale-ops
namespace: demo
spec:
clusterName: pg-cluster
type: VerticalScaling
verticalScaling:
- componentName: postgresql
requests:
cpu: '1'
memory: 1Gi
limits:
cpu: '1'
memory: 1Gi
EOF
查看集群资源状态:
Bash
kbcli cluster describe pg-cluster -n demo
...
Resources Allocation:
COMPONENT INSTANCE-TEMPLATE CPU(REQUEST/LIMIT) MEMORY(REQUEST/LIMIT) STORAGE-SIZE STORAGE-CLASS
postgresql 1 / 1 1Gi / 1Gi data:20Gi managed-csi
...
读者可以参考官方文档执行其他运维操作。
备份恢复
参考文档创建一个全量备份并查看备份状态。
Bash
kubectl get backup
NAME POLICY METHOD REPO STATUS TOTAL-SIZE DURATION DELETION-POLICY CREATION-TIME COMPLETION-TIME EXPIRATION-TIME
backup-demo-pg-cluster-20250823100024 pg-cluster-postgresql-backup-policy pg-basebackup azureblob Completed 3707917 22s Delete 2025-08-23T10:00:24Z 2025-08-23T10:00:46Z 2025-09-22T10:00:46Z
使用该备份恢复一个新的 PostgreSQL 集群,如下:
Bash
*# 使用 kbcli 命令恢复一个新的 PostgreSQL 集群*
kbcli cluster restore pg-cluster-restored --backup=backup-demo-pg-cluster-20250823100024
*# 查看集群状态*
kubectl get cluster pg-cluster-restored
NAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGE
pg-cluster-restored postgresql Delete Running 3m43s
以上,以 MySQL 和 PostgreSQL 为例,说明如何在 OpenShift 上使用 KubeBlocks 创建和管理数据库集群。读者也可以参考 KubeBlocks 官方文档创建其他类型的数据库集群,比如 Redis,MongoDB,Kafka 等,限于篇幅,本文不再一一举例说明。
总结
本文介绍了如何在 OpenShift 上部署和使用开源版 KubeBlocks,展示了如何解决企业在 Kubernetes 环境中面临的数据库管理挑战。结合 OpenShift 的企业级平台能力与 KubeBlocks 的专业数据库管理功能,企业能够获得完整的数据库即服务(DBaaS)能力,实现应用和数据库的一体化管理。
对于有更高要求的企业用户,我们还提供了企业版 KubeBlocks,在开源版的基础上增加了以下核心企业级特性:
- 企业级管理控制台:提供统一的可视化管理界面,支持白屏化操作和完整的 API 集成
- 多租户与增强安全:支持企业级多租户隔离、细粒度访问控制、数据加密和合规审计
- 商业数据库支持:包含 Oracle、SQL Server 等企业级商业数据库引擎和更多版本选择
- 企业级容灾与可观测性:提供跨区域容灾能力、全面的监控指标、日志管理和告警服务
如果您对企业版 KubeBlocks 感兴趣,或希望在生产环境中部署 KubeBlocks,欢迎访问官方网站了解更多信息或联系我们获取评估版本。