写点什么

如何在 OpenShift 上部署和使用 KubeBlocks

作者:小猿姐
  • 2025-09-16
    浙江
  • 本文字数:7832 字

    阅读完需:约 26 分钟

如何在 OpenShift 上部署和使用 KubeBlocks

背景

在当今数字化转型浪潮中,Kubernetes 已成为企业容器编排的标准平台,为应用提供了强大的自动化部署、扩展和管理能力。然而,随着越来越多的企业将关键业务应用迁移至 Kubernetes,如何高效管理数据库工作负载成为一项重要挑战。相比无状态应用,数据库需要处理持久化存储、高可用性、备份恢复、版本升级等复杂场景,这些都是传统 Kubernetes 原生功能难以完全覆盖的领域。


Red Hat OpenShift 是构建在 Kubernetes 之上的企业级容器平台,为企业提供了更完善的功能和工具链。相比开源 Kubernetes,OpenShift 增强了安全性(如 SCC,即 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 之前,请确保您具备以下条件:


  1. OpenShift 集群:版本 4.8 或更高

  2. 集群管理员权限:安装 Operator 和 CRD 需要管理员权限,需要的具体权限可以参考文档

  3. CLI 工具:

  4. oc (OpenShift 命令行工具)

  5. kubectl (Kubernetes 命令行工具)

  6. helm (版本 3.0+)

  7. 资源要求:

  8. 至少 3 个 Node,每个 Node 建议至少 8C16G

  9. 配置默认存储类

准备 OpenShift 集群

笔者在 Azure 上创建了一个由 3 个控制面节点,3 个数据面节点构成的 OpenShift 集群来部署和验证 KubeBlocks。


*# 查看集群节点*oc get nodesNAME                             STATUS   ROLES                  AGE   VERSIONkbe-8rfgv-master-0               Ready    control-plane,master   11d   v1.30.11kbe-8rfgv-master-1               Ready    control-plane,master   11d   v1.30.11kbe-8rfgv-master-2               Ready    control-plane,master   11d   v1.30.11kbe-8rfgv-worker-eastus1-7t2hw   Ready    worker                 11d   v1.30.11kbe-8rfgv-worker-eastus2-cw62z   Ready    worker                 11d   v1.30.11kbe-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 系统安装方式如下, 其他系统安装方式请参考文档


*# 下载并安装 kbcli (Linux/MacOS 示例)*curl -fsSL https://kubeblocks.io/installer/install_cli.sh | bash -s 1.0.1
*# 验证安装*kbcli version
复制代码

部署 KubeBlocks

参考 KubeBlocks 文档 使用 helm 部署 KubeBlocks。


*# 添加 KubeBlocks Helm 仓库*helm repo add kubeblocks https://apecloud.github.io/helm-charts --force-update
*# 查看最新的版本,当前最新版本为 1.0.1*helm search repo kubeblocks/kubeblocks --versions
*# 创建 KubeBlocks 依赖的 CRD*kubectl create -f https://github.com/apecloud/kubeblocks/releases/download/v1.0.1/kubeblocks_crds.yaml
*# 安装 KubeBlocks*helm install kubeblocks kubeblocks/kubeblocks --namespace kb-system --create-namespace --version 1.0.1
复制代码


如果使用私有镜像仓库,可以使用如下命令指定镜像仓库地址和访问凭证。


*# 创建 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 \--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 是否安装成功。


*# 检查 KubeBlocks Pod 是否正在运行*kubectl get podsNAME                                         READY   STATUS    RESTARTS   AGEkubeblocks-84994765cf-zkz6t                  1/1     Running   0          12mkubeblocks-dataprotection-79dc8cd474-cdztr   1/1     Running   0          12m
*# 查看 KubeBlocks Addon*kubectl get addonNAME TYPE VERSION PROVIDER STATUS AGEapecloud-mysql Helm 1.0.1 community Enabled 13metcd Helm 1.0.1 community Enabled 13mkafka Helm 1.0.1 community Enabled 13mmongodb Helm 1.0.1 community Enabled 13mmysql Helm 1.0.1 community Enabled 13mpostgresql Helm 1.0.1 community Enabled 13mqdrant Helm 1.0.1 community Disabled 13mrabbitmq Helm 1.0.1 community Disabled 13mredis 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 存储,并创建一个备份仓库。


*# 创建备份仓库*kbcli backuprepo create azureblob  \    --provider azureblob \    --account-key='<your-account-key>' \    --account-name='<your-account-name>' \    --default=true \    --container='<your-container-name>'
复制代码


在创建备份仓库后,KubeBlocks 会自动创建一个 Job 检测对象存储的可访问性。在 KubeBlocks 1.0.1 版本之前该 Job 需要以 root 账号运行,而 OpenShift 的默认 SCC 策略出于安全考虑不允许这种操作,因此需要为相关的 ServiceAccount 配置适当的 SCC 权限:


*# 为运行备份仓库检测 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 状态。


kubectl get backuprepoNAME        STATUS   STORAGEPROVIDER   ACCESSMETHOD   DEFAULT   AGEazureblob   Ready    azureblob         Tool           true      21h
复制代码

创建和运维数据库

创建项目

首先在 OpenShift 上创建一个项目,用于部署数据库集群。OpenShift 中的一个项目,与 Kubernetes 中的一个 namespace 对应,但提供了额外的安全隔离和资源管理功能。


*# 创建项目*oc new-project demo
复制代码


KubeBlocks 在执行某些操作时(如创建备份、初始化 PostgreSQL 集群等)需要以 root 权限运行 Pod,而 OpenShift 项目的默认安全策略不允许这种操作。为了确保 KubeBlocks 正常工作,需要为项目配置适当的 SCC 权限:


*# 为 demo 项目添加 anyuid SCC,允许 Pod 以任意用户 ID 运行*oc adm policy add-scc-to-group anyuid system:serviceaccounts:demo
复制代码

MySQL

创建 MySQL 集群

参考文档创建一个 MySQL 数据库集群。


kubectl apply -f - <<EOFapiVersion: apps.kubeblocks.io/v1kind: Clustermetadata:  name: example-mysql-cluster  namespace: demospec:  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: 20GiEOF
复制代码


查看 MySQL 集群的状态:


kubectl get cluster example-mysql-cluster -n demoNAME                    CLUSTER-DEFINITION   TERMINATION-POLICY   STATUS    AGEexample-mysql-cluster   mysql                Delete               Running   3m41s
复制代码

垂直扩容

执行如下命令,将集群扩容为 1C1G:


kubectl apply -f - <<EOFapiVersion: operations.kubeblocks.io/v1alpha1kind: OpsRequestmetadata:  name: example-mysql-cluster-vscale-ops  namespace: demospec:  clusterName: example-mysql-cluster  type: VerticalScaling  verticalScaling:  - componentName: mysql    requests:      cpu: '1'      memory: 1Gi    limits:      cpu: '1'      memory: 1GiEOF
复制代码


查看集群资源:


kbcli cluster describe example-mysql-cluster -n demo...Resources Allocation:COMPONENT   INSTANCE-TEMPLATE   CPU(REQUEST/LIMIT)   MEMORY(REQUEST/LIMIT)   STORAGE-SIZE   STORAGE-CLASSmysql                           1 / 1                1Gi / 1Gi               data:20Gi      <none>...
复制代码


读者可以参考官方文档执行其他运维操作,在此不再一一展示。

备份恢复

参考文档创建一个全量备份:


kubectl apply -f - <<EOFapiVersion: operations.kubeblocks.io/v1alpha1kind: OpsRequestmetadata:  name: example-mysql-cluster-backup  namespace: demospec:  clusterName: example-mysql-cluster  force: false  backup:    backupPolicyName: example-mysql-cluster-mysql-backup-policy    backupMethod: xtrabackup    deletionPolicy: Delete    retentionPeriod: 1mo  type: BackupEOF
复制代码


查看备份状态:


kubectl get backup  -n demoNAME                                               POLICY                                      METHOD       REPO        STATUS      TOTAL-SIZE   DURATION   DELETION-POLICY   CREATION-TIME          COMPLETION-TIME        EXPIRATION-TIMEbackup-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 权限。


  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 集群,命令如下:


kbcli cluster restore example-mysql-cluster-restored --backup=backup-demo-example-mysql-cluster-20250823080440
复制代码


查看恢复的集群的状态:


kubectl get cluster example-mysql-cluster-restored -n demoNAME                             CLUSTER-DEFINITION   TERMINATION-POLICY   STATUS    AGEexample-mysql-cluster-restored   mysql                Delete               Running   3m
复制代码

PostgreSQL

创建 PostgreSQL 集群

参考文档创建一个 PostgreSQL 集群。


kubectl apply -f - <<EOFapiVersion: apps.kubeblocks.io/v1kind: Clustermetadata:  name: pg-cluster  namespace: demospec:  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: 20GiEOF
复制代码


查看 PostgreSQL 集群状态:


kubectl get clusterNAME         CLUSTER-DEFINITION   TERMINATION-POLICY   STATUS    AGEpg-cluster   postgresql           Delete               Running   6m7s
复制代码

垂直扩容

执行如下命令,将 PostgreSQL 集群的资源配置扩容为 1C1G:


kubectl apply -f - <<EOFapiVersion: operations.kubeblocks.io/v1alpha1kind: OpsRequestmetadata:  name: pg-cluster-vscale-ops  namespace: demospec:  clusterName: pg-cluster  type: VerticalScaling  verticalScaling:  - componentName: postgresql    requests:      cpu: '1'      memory: 1Gi    limits:      cpu: '1'      memory: 1GiEOF
复制代码


查看集群资源状态:


kbcli cluster describe pg-cluster -n demo...Resources Allocation:COMPONENT    INSTANCE-TEMPLATE   CPU(REQUEST/LIMIT)   MEMORY(REQUEST/LIMIT)   STORAGE-SIZE   STORAGE-CLASSpostgresql                       1 / 1                1Gi / 1Gi               data:20Gi      managed-csi...
复制代码


读者可以参考官方文档执行其他运维操作。

备份恢复

参考文档创建一个全量备份并查看备份状态。


kubectl get backupNAME                                    POLICY                                METHOD          REPO        STATUS      TOTAL-SIZE   DURATION   DELETION-POLICY   CREATION-TIME          COMPLETION-TIME        EXPIRATION-TIMEbackup-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 集群,如下:


*# 使用 kbcli 命令恢复一个新的 PostgreSQL 集群*kbcli cluster restore pg-cluster-restored --backup=backup-demo-pg-cluster-20250823100024
*# 查看集群状态*kubectl get cluster pg-cluster-restoredNAME CLUSTER-DEFINITION TERMINATION-POLICY STATUS AGEpg-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,欢迎访问官方网站了解更多信息或联系我们获取试用版本。


用户头像

小猿姐

关注

还未添加个人签名 2022-08-11 加入

每个开发者都想知道的云原生和数据库技术

评论

发布
暂无评论
如何在 OpenShift 上部署和使用 KubeBlocks_k8s_小猿姐_InfoQ写作社区