我正在使用 CrunchyData Postgres Operator 来管理 Kubernetes 集群上的 postgres 数据库。该集群将托管许多项目使用的多个数据库。
我已经在命名空间
PostgresCluster
上设置了运算符和名为
postgres
的
postgres-operator
现在,我正在命名空间
rates
中部署一个 Laravel 应用程序,需要使用用户 rates
和数据库 rates
访问数据库
使用 CrunchyData helm 图表,我在
values.yaml
中有以下内容:
users: [
{
name: "rates",
databases: ["rates"],
}
]
这会在命名空间中创建秘密
postgres-pguser-rates
postgres-operator
在我的 Laravel
Deployement
中,我的 yaml environment 部分中有以下内容:
- name: DB_HOST
valueFrom: { secretKeyRef: { name: postgres-pguser-rates, key: host } }
- name: DB_PORT
valueFrom: { secretKeyRef: { name: postgres-pguser-rates, key: port } }
- name: DB_DATABASE
valueFrom: { secretKeyRef: { name: postgres-pguser-rates, key: dbname } }
- name: DB_USERNAME
valueFrom: { secretKeyRef: { name: postgres-pguser-rates, key: user } }
- name: DB_PASSWORD
valueFrom: { secretKeyRef: { name: postgres-pguser-rates, key: password } }
这基本上可以访问 Postgres 操作员创建的秘密。
问题:由于我的 Laravel 部署和 postgres 集群位于不同的命名空间中,操作员在命名空间中创建秘密
postgres-operator
,并且我尝试从命名空间上的部署访问它 rates
我尝试过在 Kubernetes 中使用 Role、RoleBinding 和 RBAC 功能。但由于我试图从 yaml 文件访问秘密来设置环境变量,因此此方法不起作用。
我尝试探索kubernetes-reflector,但是,由于无法修改操作符以在其生成的秘密上设置标签,因此此方法不起作用
我有两个问题:
主要是如何从不同的命名空间访问操作者创建的DB Secret?
或者,为每个项目部署单独的数据库集群会更好吗?对于很多简单的项目来说,这似乎过于占用资源。
如何从不同的命名空间访问操作者创建的DB Secret?
正如您所发现的,这不是 RBAC 问题;而是问题。从根本上来说,
envFrom
/valueFrom
/etc 指令不支持引用另一个命名空间中的秘密。获得您想要的唯一方法是确保您的应用程序和机密位于同一命名空间中。
我认为你使用 kubernetes-reflector 的想法看起来不错。这将涉及在创建秘密后手动为其添加标签,但这很好;你必须选择将哪些秘密放置在哪个命名空间中以某种方式,这似乎是合理的。
如果您始终如一地命名事物,以便秘密
postgres-pguser-<name>
应在命名空间 <name>
中公开,那么您可以编写自己的运算符来监视与该模式匹配的秘密,然后将它们复制到适当的命名空间。 operator sdk 使这变得相对容易;您也可以使用运行 kubectl get secret --watch
的 shell 脚本来完成同样的事情。
或者为每个项目部署单独的数据库集群会更好吗?对于很多简单的项目来说,这似乎过于占用资源。
我认为这将是一种更常见的配置。
根据简单项目的性质,部署一个普通的 postgres 容器可能比使用脆弱的 postgres 操作符提供的所有功能更有意义。