在 K8s 上用 KubeBlocks 提供的 PostgreSQL Operator 和 Redis Operator 部署高可用 Harbor 集群

张开发
2026/4/17 4:18:53 15 分钟阅读

分享文章

在 K8s 上用 KubeBlocks 提供的 PostgreSQL Operator 和 Redis Operator 部署高可用 Harbor 集群
说到搭建自建 Docker 镜像仓库业内推荐最多的是 Harbor。然而Harbor 并没有集成高可用HA这使得其服务相对不那么可靠。如果开发者想要创建一个高可用 Harbor 集群通常需要先创建和配置高可用 Redis 和 PostgreSQL 集群但这一过程却相当麻烦。图 1. Harbor 架构图现在有了 KubeBlocks 您只需简单几步即可搭建高可用 Harbor 集群。为什么选用 KubeBlocksKubeBlocks 是开源管理控制平面支持在 K8s 上运行和管理数据库、消息队列和其他数据基础设施。KubeBlocks 支持管理多种数据引擎包括 RDBMSs如 MySQL、PostgreSQL、内存型Redis、NoSQLsMongoDB、MQsKafka、Pulsar等等。本文将演示如何使用 KubeBlocks 在 5 分钟内搭建一个高可用 Harbor 集群。环境准备开始之前请确保您的环境满足 KubeBlocks 和 Harbor 的环境要求。安装 kbcli 和 KubeBlocks安装 kbcli。curl-fsSLhttps://kubeblocks.io/installer/install_cli.sh|bash安装 KubeBlocks。kbcli kubeblocks install检查 KubeBlocks 是否安装成功。kbcli kubeblocks status在 KubeBlocks 中开启 PostgreSQL 和 Redis 引擎。这两个引擎默认开启。您可以执行以下命令检查引擎启用状态。如果引擎未启用您可以参考官方文档启用引擎。kbcli addon list创建 PostgreSQL 和 Redis 集群创建一个名为 demo 的独立 namespace将集群资源独立出来。kubectl create namespace demo创建 PostgreSQL 集群。本文中我们使用了 replication 模式创建了主备集群可支持自动故障转移。关于创建集群的细节可参考官方文档。kbcli cluster create postgresql mypg --mode replication --namespace demo创建 Redis 集群。本文中我们使用了 replication 模式指定版本为 redis-7.0.6。KubeBlocks 将创建 sentinel 模式的主备集群关于创建集群的细节可参考官方文档。kbcli cluster create redis myredis --mode replication --version redis-7.0.6 --namespace demo查看已创建的集群状态确保两个集群的状态都为Running。kbcli cluster list --namespace demo连接集群KubeBlocks 官方文档根据不同的情景提供了多种连接集群的方式。您可根据实际场景选择对应的方式。本文中我们将使用试用环境的方式来演示连接至集群。连接到 PostgreSQL 集群连接至 PostgreSQL 集群。kbcli cluster connect mypg --namespace demo在 PostgreSQL CLI 客户端中创建新用户。create user test with password password;为 Harbor 创建新的数据库注册表。CREATE DATABASE registry OWNER test;此处创建的用户和数据库将在安装 Harbor 时使用。连接到 Redis 集群连接至 Redis 集群。kbcli cluster connect myredis --namespace demo创建用户。ACL SETUSER test on password ~* all安装 Harbor下载 Harbor Helm chart。helm repo add harbor https://helm.goharbor.io helm fetch harbor/harbor --untar获取集群中服务信息。mypg-postgresql和myredis-redis-redis的集群 IP 即 Harbor 需连接的地址信息。kubectl get service -n demo NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mypg-postgresql ClusterIP 172.16.155.121 none 5432/TCP,6432/TCP 74m myredis-redis-redis ClusterIP 172.16.190.126 none 6379/TCP 66m在values.yaml文件中配置 PostgreSQL 数据库。使用 KubeBlocks 提供的外部数据库并填写必要的数据库信息。如需配置其他参数如expose.type可参考官方文档。database: type: external ... external: host: 172.16.155.121 # clusterIP of postgresql port: 5432 username: test # your username password: password. # your password coreDatabase: registry # your database name existingSecret: sslmode: disable在values.yaml文件中配置 Redis 数据库。redis: type: external ... external: addr: 172.16.190.126:6379 # clusterIp of redis: port sentinelMasterSet: coreDatabaseIndex: 0 jobserviceDatabaseIndex: 1 registryDatabaseIndex: 2 trivyAdapterIndex: 5 username: test # your username password: password # your password existingSecret: 安装 Harbor。helm install myharbor. -n demo检查 Pod 状态确保所有服务都处于 Running 状态。kubectl get pods -n demo NAME READY STATUS RESTARTS AGE myharbor-core-66d95c9f45-vpcnn 1/1 Running 0 44m myharbor-jobservice-85b5676456-kl5r9 1/1 Running 0 44m myharbor-nginx-55dd86f5d8-s78gn 1/1 Running 0 44m myharbor-portal-869c6656c5-5dtsc 1/1 Running 0 44m myharbor-registry-c66cd79b-77k5j 2/2 Running 0 44m myharbor-trivy-0 1/1 Running 0 44m mypg-postgresql-0 4/4 Running 0 65m mypg-postgresql-1 4/4 Running 0 82s myredis-redis-0 3/3 Running 0 57m myredis-redis-1 3/3 Running 0 57m myredis-redis-sentinel-0 1/1 Running 0 58m myredis-redis-sentinel-1 1/1 Running 0 58m myredis-redis-sentinel-2 1/1 Running 0 58m至此部署完成您可以照常连接 Harbor UI。高可用演示本节将演示 KubeBlocks 创建的 Harbor 集群的高可用能力。我们将通过 PostgreSQL 集群主节点故障来模拟。查看 PostgreSQL 集群和 Pod 的初始状态。当前mypg-postgresql-0为主节点mypg-postgresql-1为备节点。kubectl -n demo get pod -L kubeblocks.io/role NAME READY STATUS RESTARTS AGE ROLE ... mypg-postgresql-0 4/4 Running 0 66m primary mypg-postgresql-1 4/4 Running 0 66m secondary ...向 Harbor 注册表中推送一个名为busybox的测试镜像。docker docker tag busybox harbor.domain.com/library/busybox docker push harbor.domain.com/library/busybox查看 Harbor 仓库可以看到该镜像已成功推送到 Harbor 注册表。接下来模拟 PostgreSQL 主节点故障。# Enter the primary pod kubectl exec -it mypg-postgresql-0 -n demo -- bash # Delete the data directory of PostgreSQL to simulate an exception rootmycluster-postgresql-0:/home/postgres# rm -fr /home/postgres/pgdata/pgroot/data查看集群日志观察故障发生时节点角色变化。# View the primary pod logs kubectl logs mypg-postgresql-0 -n demo从日志中我们可以看到leader lock 从主节点释放出来触发了 HA 切换并从备份数据中创建出新的副本。该服务几十秒便恢复正常。2024-06-26 08:00:51,759 INFO: no action. I am (mypg-postgresql-0), the leader with the lock 2024-06-26 08:01:01,726 INFO: Lock owner: mypg-postgresql-0; I am mypg-postgresql-0 2024-06-26 08:01:01,802 INFO: Leader key released 2024-06-26 08:01:01,824 INFO: released leader key voluntarily as data dir empty and currently leader 2024-06-26 08:01:01,825 INFO: Lock owner: mypg-postgresql-1; I am mypg-postgresql-0 ... 2024-06-26 08:01:04,475 INFO: replica has been created using basebackup_fast_xlog 2024-06-26 08:01:04,475 INFO: bootstrapped from leader mypg-postgresql-1 2024-06-26 08:01:04,476 INFO: closed patroni connection to the postgresql cluster# View secondary pod logs kubectl logs mypg-postgresql-1 -n demo原来的备节点mypg-postgresql-1获得了 leader locks成为主节点。2024-06-26 08:02:13,638 INFO: no action. I am (mypg-postgresql-1), the leader with the lock再次查看 PostgreSQL 集群和 Pod 的状态。故障切换后mypg-posgresql-0变成了备节点mypg-postgresql-1变成了主节点。kubectl -n demo get pod -L kubeblocks.io/role NAME READY STATUS RESTARTS AGE ROLE ... mypg-postgresql-0 4/4 Running 0 89m secondary mypg-postgresql-1 4/4 Running 0 26m primary ...连接到 PostgreSQL 集群查看主节点的 replication 信息。postgres# select * from pg_stat_replication;结果显示mypg-postgresql-0已被分配备节点角色。验证 Harbor 集群的服务。这里我们拉取之前推送的busybox镜像。该镜像可以成功地从 Harbor 注册表中拉取。同时我们也推送了新镜像hello-world。该镜像也能够成功推送到 Harbor 注册表。故障切换后Harbor 集群的读写功能已恢复证实了 KubeBlocks 提供的高可用功能的有效性。集群扩容KubeBlocks 提供了垂直和水平扩容的能力。您可以通过执行以下命令轻松扩容集群。垂直扩容kbcli cluster vscale mypg \ --componentspostgresql \ --memory4Gi --cpu2 \ --namespace demo水平扩容kbcli cluster hscale mypg --replicas 3 \ --namespace demo \ --components postgresql总结通过集成 KubeBlocks仅需 5 分钟您就可以拉起高可用 Harbor 集群并能确保您的 Harbor 集群能提供持续、可信赖的服务。KubeBlocks 简化了整个创建过程因此您可以有更多的精力去关注重要任务而无需担心底层基础设施的配置和管理。参考KubeBlocks Github RepoKubeBlocks.ioKubeBlocks AddonsHarborKubeBlocks Redis K8s OperatorKubeBlocks PostgreSQL K8s Operator

更多文章