如何在 OpenShift 上部署和使用 KubeBlocks

背景

在当今数字化转型浪潮中,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 之前,请确保您具备以下条件:

  1. OpenShift 集群:版本 4.8 或更高
  2. 集群管理员权限:安装 Operator 和 CRD 需要管理员权限,需要的具体权限可以参考文档
  3. CLI 工具:
    • oc (OpenShift 命令行工具)
    • kubectl (Kubernetes 命令行工具)
    • helm (版本 3.0+)
  4. 资源要求:
    • 至少 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,欢迎访问官方网站了解更多信息或联系我们获取评估版本。

相关推荐
hello_ world.2 小时前
k8s笔记04-常用部署命令
笔记·容器·kubernetes
阿里云云原生2 小时前
拥抱 AI 原生!8月29日深圳,企业实践工作坊火热报名中
云原生
阿里云云原生2 小时前
不增加 GPU,首 Token 延迟下降 50%|LLM 服务负载均衡的新实践
云原生
阿里云云原生3 小时前
性能瓶颈定位更快更准:ARMS 持续剖析能力升级解析
云原生
小猿姐4 小时前
KubeBlocks for Kafka 揭秘
kafka·kubernetes
会飞的土拨鼠呀5 小时前
K8s部署MySQL8.0数据库
数据库·容器·kubernetes
没有bug.的程序员8 小时前
AOT 编译与 GraalVM 实战:Java 云原生的终极进化
java·python·云原生·graalvm·aot
Aurora8 小时前
云原生---企业级Kubernetes
云原生·容器·kubernetes
鼠鼠我捏,要死了捏21 小时前
基于Kubernetes StatefulSet的有状态微服务部署与持久化存储实践经验分享
kubernetes·containers·statefulset