尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

在 Leafcloud 上使用 Kubernetes 与 PostgreSQL Operator 部署运行 FerretDB 的完整指南

发布时间:2026/9/24 15:59:41

资讯中心
01
ARTICLE

在 Leafcloud 上使用 Kubernetes 与 PostgreSQL Operator 部署运行 FerretDB 的完整指南

在 Leafcloud 上使用 Kubernetes 与 PostgreSQL Operator 部署运行 FerretDB 的完整指南
后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载FerretDB 是一款真正开源的 MongoDB 替代方案它以 PostgreSQL 作为后端存储让开发者可以继续使用熟悉 MongoDB 生态的工具与协议同时摆脱厂商锁定。本文以 FerretDB 官方博客指南为主线完整讲解如何在 Leafcloud基于 OpenStack Magnum 的环保型云基础设施上借助 Kubernetes 和 Crunchy Data PostgreSQL Operator从零搭建一套可生产的 FerretDB 运行环境——涵盖 Kubernetes 集群创建、PostgreSQL 集群初始化、FerretDB 部署与连通性验证并结合仓库源码解析连接配置的底层细节。读完本文你将掌握一套可复制的“云上 FerretDB PostgreSQL”落地路径并理解 FerretDB 如何通过FERRETDB_POSTGRESQL_URL等环境变量接入 PostgreSQL以及数据在 PostgreSQL 中的实际存储形态。方案总览本指南的整体技术栈如下Leafcloud提供分布式、节能的云基础设施通过 OpenStack Magnum 项目管理并部署容器集群Kubernetes承载 FerretDB 与 PostgreSQL 集群的容器编排平台Crunchy Data PostgreSQL OperatorPGO在 Kubernetes 上创建高可靠 PostgreSQL 集群并提供持久化存储、自动备份、连接池等能力FerretDB以 PostgreSQL 为后端的 MongoDB 协议兼容层对外提供 MongoDB Wire Protocol 监听默认27017端口。流程分为三大阶段在 Leafcloud 上创建 Kubernetes 集群并配置 Cinder CSI 存储类通过 PostgreSQL Operator 创建 PostgreSQL 集群并初始化用户与数据库部署 FerretDB Deployment 与 Service最后用mongosh验证连通性并做基本读写。前置条件开始之前请确认以下条件已安装kubectl用于连接并操作 Kubernetes 集群拥有一个 Leafcloud 账户且账户内有足够的配额volume来运行集群具备基本的 Linux 命令行、Kubernetes 与 PostgreSQL 使用经验。在 Leafcloud 上创建 Kubernetes 集群Leafcloud 使用 OpenStack Magnum 项目来管理和部署容器集群因此本阶段我们全程使用 OpenStack CLI 操作。安装 OpenStack CLI在本地环境示例为 Debian/Ubuntu安装 OpenStack 命令行客户端与 Magnum 客户端sudo apt update -y sudo apt install -y python3-pip python3-dev -y sudo apt install virtualenv -y virtualenv -p python3 openstack_venv source openstack_venv/bin/activate pip install --upgrade pip pip install python-openstackclient pip install python-magnumclient配置 Leafcloud 账户登录 Leafcloud 账户下载 OpenStack RC 文件其中包含命令行客户端所需的环境变量将文件内容保存为~/leafcloudopenrc.sh然后加载配置并按提示输入账户密码source ~leafcloudopenrc.sh验证 CLI 是否能够访问账户资源openstack server list如果出现认证错误重新执行source ~/leafcloudopenrc.sh并确认密码输入正确。选择集群模板并创建集群Leafcloud 提供可直接使用的集群模板查看模板列表openstack coe cluster template list本指南选用K8s-ha-v1.21.2-template-v2.0-rc3模板因为它自带 Kubernetes OpenStack 自动伸缩autoscaling、容器与主机使用的加密 Cinder 卷持久卷声明 PVC以及高可用负载均衡器。使用该模板创建集群。--keypair参数指定的密钥对会被集成到主机中从而获得 root SSH 访问权限默认用户为coreopenstack coe cluster create my-k8s-cluster --cluster-template k8s-ha-v1.21.2-template-v2.0-rc3 --keypair keypair集群创建可能需要几分钟通过如下命令查看进度openstack coe cluster list当集群状态从CREATE_IN_PROGRESS变为CREATE_COMPLETE时安装完成。获取集群配置并连接 kubectl获取集群的 kubeconfigopenstack coe cluster config my-k8s-cluster这会在主目录下载一个名为config的文件。kubectl依赖它来连接 Kubernetes 集群同一终端会话内后续所有kubectl命令都会使用该配置直到被重置或更换export KUBECONFIG/home/username/config确认集群节点可达kubectl get nodes -o wide配置 Cinder CSI 存储类FerretDB 与 PostgreSQL 都需要持久化存储。创建storageclass.yaml将 Cinder CSI 设为默认存储类以便后续 PVC持久卷声明自动使用kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: cinder-csi annotations: storageclass.kubernetes.io/is-default-class: true provisioner: cinder.csi.openstack.org应用该存储类kubectl apply -f storageclass.yaml创建 PostgreSQL 集群FerretDB 以 PostgreSQL 为存储后端因此接下来借助 Crunchy Data 的 PostgreSQL OperatorPGO版本 5.4.0通过 kustomize 安装创建生产可用的 PostgreSQL 集群。安装 PostgreSQL Operator首先将 postgres-operator-examples 仓库克隆到本地按需 fork 后使用你自己的 GitHub 用户名YOUR_GITHUB_UNyour GitHub username git clone --depth 1 gitgithub.com:${YOUR_GITHUB_UN}/postgres-operator-examples.git cd postgres-operator-examples使用默认配置安装 PGO可根据需要自行修改kubectl apply -k kustomize/install/namespace kubectl apply --server-side -k kustomize/install/default该过程会生成名为postgres-operator的命名空间并创建 PGO 部署所需的全部对象。监控安装进度kubectl -n postgres-operator get pods \ --selectorpostgres-operator.crunchydata.com/control-planepostgres-operator \ --field-selectorstatus.phaseRunning当 PGO Pod 健康运行时输出类似NAME READY STATUS RESTARTS AGE pgo-6f664c9f44-mmptx 1/1 Running 0 10s配置 PostgreSQL 集群清单创建 PostgreSQL 集群前修改克隆目录下的kustomize/postgres/postgres.yaml让集群的数据卷声明使用cinder-csi存储类容量请求为 1GiapiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo spec: image: registry.developers.crunchydata.com/crunchydata/crunchy-postgres:ubi8-15.3-2 postgresVersion: 15 instances: - name: instance1 dataVolumeClaimSpec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: cinder-csi backups: pgbackrest: image: registry.developers.crunchydata.com/crunchydata/crunchy-pgbackrest:ubi8-2.45-2 repos: - name: repo1 volume: volumeClaimSpec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: cinder-csi清单要点dataVolumeClaimSpec指定 PostgreSQL 数据目录使用的 PVC 存储此处为 1Gi 的cinder-csi卷backups.pgbackrest配置 pgBackRest 备份仓库同样使用 1Gi 的cinder-csi卷实现自动备份能力。创建 PostgreSQL 集群kubectl apply -k kustomize/postgres该命令会在postgres-operator命名空间创建名为hippo的 PostgreSQL 集群。跟踪集群进度kubectl -n postgres-operator describe postgresclusters.postgres-operator.crunchydata.com hippo端口转发与数据库初始化在新终端中执行端口转发将集群内 PostgreSQL 的 5432 端口暴露到本地若遇连接错误先执行export KUBECONFIG/home/username/configPG_CLUSTER_PRIMARY_POD$(kubectl get pod -n postgres-operator -o name \ -l postgres-operator.crunchydata.com/clusterhippo,postgres-operator.crunchydata.com/rolemaster) kubectl -n postgres-operator port-forward ${PG_CLUSTER_PRIMARY_POD} 5432:5432接下来按照 FerretDB 的要求配置 PostgreSQL创建用户与密码凭据并创建归属该用户的数据库。生成随机密码并保存为 KubernetesSecret脚本文件secret.sh#!/bin/sh PASSWORD$(openssl rand -base64 8) kubectl -n postgres-operator create secret generic ferretdb-secret \ --from-literalpassword$PASSWORD \执行脚本chmod x secret.sh ./secret.sh注意以上chmod仅用于修改你自己创建的脚本文件权限属于部署操作的一部分不影响仓库内容。由于 PostgreSQL 运行在 Kubernetes Pod 中需要通过psql在 Pod 内执行 SQL。先从Secret中取出密码再创建用户ferretuserPASSWORD$(kubectl -n postgres-operator get secret ferretdb-secret -ojsonpath{.data.password} | base64 -d) kubectl -n postgres-operator exec -it hippo-instance1-mrpt-0 -- psql -U postgres -c CREATE USER ferretuser WITH PASSWORD $PASSWORD;其中hippo-instance1-mrpt-0是运行 PostgreSQL 实例的 Pod 名称请用kubectl -n postgres-operator get pods查询你自己的实例名替换。创建名为ferretdb的数据库并将所有权限授予ferretuserkubectl -n postgres-operator exec -it hippo-instance1-mrpt-0 -- psql -U postgres -c CREATE DATABASE ferretdb OWNER ferretuser;验证用户与数据库创建成功kubectl -n postgres-operator exec -it hippo-instance1-mrpt-0 -- psql -U postgres -l至此Kubernetes 内已有一个带用户与数据库的 PostgreSQL 实例可供 FerretDB 使用。部署 FerretDB编写 Deployment 与 Service 清单创建deployment.yaml定义 FerretDB 容器、相关 MongoDB 组件、Service 配置并通过Secret引用此前创建的ferretuser密码apiVersion: apps/v1 kind: Deployment metadata: name: ferretdb namespace: postgres-operator labels: app: ferretdb spec: replicas: 1 selector: matchLabels: app: ferretdb template: metadata: labels: app: ferretdb spec: containers: - name: ferretdb image: ghcr.io/ferretdb/ferretdb ports: - containerPort: 27017 env: - name: POSTGRES_USERNAME value: ferretuser - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: ferretdb-secret key: password - name: FERRETDB_POSTGRESQL_URL value: postgres://$(POSTGRES_USERNAME):$(POSTGRES_PASSWORD)hippo-ha:5432/ferretdb --- apiVersion: v1 kind: Service metadata: name: ferretdb-service namespace: postgres-operator spec: selector: app: ferretdb ports: - name: mongo protocol: TCP port: 27017 targetPort: 27017清单要点镜像ghcr.io/ferretdb/ferretdb官方生产镜像监听 MongoDB 协议端口 27017凭据注入POSTGRES_PASSWORD通过secretKeyRef从ferretdb-secret读取避免明文写死在清单中连接串拼接FERRETDB_POSTGRESQL_URL使用 Kubernetes 环境变量展开语法$(POSTGRES_USERNAME)、$(POSTGRES_PASSWORD)指向hippo-ha:5432/ferretdb——hippo-ha是 PGO 为集群提供的高可用 Service 名称Serviceferretdb-service将集群内 27017 端口暴露给其他工作负载访问。连接配置的源码视角FERRETDB_POSTGRESQL_URL是 FerretDB 连接 PostgreSQL 的核心配置。从源码看CLI 定义于 cmd/ferretdb/main.go--postgresql-url默认值postgres://127.0.0.1:5432/postgres环境变量对应FERRETDB_POSTGRESQL_URL--postgresql-url-file环境变量对应FERRETDB_POSTGRESQL_URL_FILE若指定则覆盖前者。官网配置文档还说明了连接细节FerretDB 使用 pgx v5 库连接 PostgreSQLURL 支持的查询参数与默认值以 pgx 文档为准pool_min_conns未设置时为 10、pool_max_conns未设置时为 50application_name恒为FerretDBtimezone恒为UTC。同时注意FerretDB 自身的认证完全依赖 PostgreSQL 的认证机制默认开启详见 website/docs/security/authentication.md客户端连接时提供的用户名密码会转发给 PostgreSQL 校验。因此部署时FERRETDB_POSTGRESQL_URL中携带的账号必须是 PostgreSQL 中真实存在的用户。应用清单并验证应用 Deploymentkubectl apply -f deployment.yaml确认当前路径下有deployment.yaml文件。查看 Pod 运行状态kubectl get pods -n postgres-operator NAME READY STATUS RESTARTS AGE ferretdb-86c45849d-bd6tq 1/1 Running 0 6h hippo-backup-6shl-qf9mf 0/1 Completed 0 6h hippo-instance1-mrpt-0 4/4 Running 0 7h hippo-repo-host-0 2/2 Running 0 7h pgo-6f664c9f44-mmptx 1/1 Running 0 7hferretdbPod 为Running状态说明容器已正常启动。查看 Service 以获取 FerretDB 的集群内访问地址kubectl get svc -n postgres-operator NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ferretdb-service ClusterIP 10.254.17.193 none 27017/TCP 4d8h hippo-ha ClusterIP 10.254.153.218 none 5432/TCP 4d8h hippo-ha-config ClusterIP None none none 4d8h hippo-pods ClusterIP None none none 4d8h hippo-primary ClusterIP None none 5432/TCP 4d8h hippo-replicas ClusterIP 10.254.33.136 none 5432/TCP 4d8hFerretDB 服务地址为10.254.17.193:27017以你的实际输出为准。使用 mongosh 连接 FerretDB启动一个临时的mongosh容器kubectl -n postgres-operator run mongosh --imagertsp/mongosh --rm -it -- bash连接 FerretDB 实例用户名密码需与前面设置的 PostgreSQL 凭据一致mongosh mongodb://ferretuser:password{FERRETDB SVC}/ferretdb?authMechanismPLAIN兼容性提示原指南使用了authMechanismPLAIN。需要注意的是FerretDB v2.x 已不再支持PLAIN认证机制参见 website/docs/migration/migrating-from-v1.md 与 website/docs/troubleshooting/overview.md。若连接报错提示PLAIN机制未启用请移除 URI 中的authMechanismPLAIN参数重试。当前 v2 版本在客户端侧支持SCRAM-SHA-256认证且同样依赖 PostgreSQL 中的真实用户凭据。获取ferretuser的密码kubectl get secret ferretdb-secret -n postgres-operator -o jsonpath{.data.password} | base64 --decode成功连接后即可开始使用 FerretDB。基本使用示例插入与查询文档向testing集合批量插入文档db.testing.insertMany([ { a: 23, b: b, c: [1, 5], d: { a: 1 } }, { a: 1, b: 34, c: 1, d: [3, 5] } ])读取全部文档db.testing.find()[ ({ _id: ObjectId(64ca02e119e6b74d10806107), a: 23, b: b, c: [1, 5], d: { a: 1 } }, { _id: ObjectId(64ca02e119e6b74d10806107), a: 1, b: 34, c: 1, d: [3, 5] }) ]FerretDB 自动为每个文档生成_idObjectId文档字段与 MongoDB 行为保持一致。FerretDB 如何在 PostgreSQL 中存储数据FerretDB 并不将文档逐字段映射为关系表而是将整份 BSON 文档序列化后存入 JSONB 列。在另一终端连接 PostgreSQL 集群kubectl exec -it hippo-instance1-mrpt-0 -n postgres-operator -- psql -U postgres切换到ferretdb数据库postgres# \c ferretdb You are now connected to database ferretdb as user postgres.设置search_path为ferretdbset search_path to ferretdb;查看表结构ferretdb# \dt List of relations Schema | Name | Type | Owner -------------------------------------------------------- ferretdb | _ferretdb_database_metadata | table | ferretdb ferretdb | testing_eb5f499b | table | ferretdb (2 rows)可以看到每个 MongoDB 集合对应一张 PostgreSQL 表testing_eb5f499b即testing集合另有_ferretdb_database_metadata元数据表。查看表内容ferretdb# table testing_eb5f499b; _jsonb -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- {a: 23, b: b, c: [1, 5], d: {a: 1}, $s: {p: {a: {t: int}, b: {t: string}, c: {i: [{t: int}, {t: int}], t: array}, d: {t: object, $s: {p: {a: {t: int}}, $k: [a]}}, _id: {t: objectId}}, $k: [_id, a, b, c, d]}, _id: 64ca02e119e6b74d10806107} {a: 1, b: 34, c: 1, d: [3, 5], $s: {p: {a: {t: int}, b: {t: int}, c: {t: string}, d: {i: [{t: int}, {t: int}], t: array}, _id: {t: objectId}}, $k: [_id, a, b, c, d]}, _id: 64ca02e119e6b74d10806108} (2 rows)_jsonb列中的每个值都是一份完整的 BSON 文档 JSON 表示其中内嵌的$s字段记录了文档的 Schema 信息t表示字段类型如int、string、array、object、objectId$k列出键顺序数组元素类型记录在i中嵌套对象类型记录在$s子结构中。这种“文档 类型元数据”的存储设计让 FerretDB 能够在保留 BSON 类型信息如区分整数与字符串的同时充分利用 PostgreSQL 的 JSONB 索引与查询能力。小结至此你已在 Leafcloud 上完成了一套完整的 FerretDB 部署链路用 OpenStack CLI 在 Leafcloud 创建高可用 Kubernetes 集群并配置cinder-csi默认存储类用 Crunchy Data PostgreSQL Operator 部署带持久化存储与自动备份的 PostgreSQL 集群在 PostgreSQL 中创建用户与数据库通过 KubernetesSecret安全传递密码部署 FerretDB Deployment 与 Service用mongosh完成连接与基本读写通过 PostgreSQL 侧查看_jsonb数据理解 FerretDB 的文档存储模型。FerretDB 与 MongoDB 协议兼容这意味着你可以继续使用现有的工具链与框架而 Leafcloud PostgreSQL Operator 的组合则提供了生产可用的持久化卷、自动备份、自动伸缩、连接池与监控等能力。关于 FerretDB 更多的配置项如--postgresql-url、--listen-addr、FERRETDB_AUTH等可参阅 website/docs/configuration/flags.mdKubernetes 上的通用部署模板可参阅 website/docs/installation/ferretdb/kubernetes.md认证机制与用户创建详见 website/docs/security/authentication.md。赞分享后端数据库文档数据库【免费下载链接】FerretDBA truly Open Source MongoDB alternative项目地址https://gitcode.com/gh_mirrors/fe/FerretDB点击查看免费下载相关推荐JDK HotSpot 反汇编插件 hsdisCapstone、LLVM、binutils 三大后端的构建与使用实战指南JDK HotSpot 反汇编插件 hsdisCapstone、LLVM、binutils 三大后端的构建与使用实战指南 本文围绕 JDK 仓库中的 hsdi后端数据库文档数据库在 Kubernetes 上通过 StackGres Operator 部署 FerretDB 的完整实战指南在 Kubernetes 上通过 StackGres Operator 部署 FerretDB 的完整实战指南 本文是一篇围绕 FerretDB Stack后端数据库文档数据库使用 KubeDB 托管 PostgreSQL 在 Kubernetes 上部署 FerretDB 实战指南使用 KubeDB 托管 PostgreSQL 在 Kubernetes 上部署 FerretDB 实战指南 FerretDB 是一款开源文档数据库它在 Po后端数据库文档数据库创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。