一、为什么生产环境的Flux需要做租户隔离?
很多做云原生或者容器编排的团队,可能都用过Flux做GitOps——简单说就是把代码仓库当配置源,让集群自动同步配置,不用手动敲命令改集群。但要是同一个Flux实例给多个业务团队用,麻烦就来了:比如A团队不小心改了B团队的配置,或者B团队能看到A团队的敏感配置(比如数据库密码),甚至有人能乱加权限搞破坏。
举个真实的例子:之前有个电商团队,把支付、物流、会员三个业务的Flux配置都放在同一个实例里,结果支付团队的开发不小心改了物流团队的Deployment副本数,导致物流服务突然扩容到100台,差点把集群资源占满。后来他们才想到,必须做租户隔离——简单说就是让每个团队(租户)只能管自己的配置,不能碰别人的。
二、用命名空间+RBAC做隔离的核心思路
其实隔离的本质就是“权限边界”:每个租户有自己的专属空间,只有特定的人能进这个空间操作,其他人连看的权限都没有。我们用的组合方案是:
- 命名空间(Namespace):相当于每个租户的“专属房间”,所有配置(比如Deployment、Service)都放在自己房间里;
- RBAC(角色权限控制):相当于每个房间的“门禁系统”,只有拿到钥匙(权限)的人才能进房间做特定操作(比如改配置、删配置)。
这个方案的好处是不用改Flux本身的代码,只用Kubernetes自带的功能就能实现,成本低还稳定;缺点是如果租户太多,配置量会变大,需要统一管理。
三、具体实现步骤(附完整示例)
所有示例统一用Kubernetes 1.27 + Flux v2.0.0,没有其他额外工具,确保大家能直接复现。
3.1 第一步:给每个租户建专属命名空间
先给每个业务团队建自己的命名空间,比如给支付团队建tenant-payment,物流团队建tenant-logistics。建命名空间的命令很简单:
# 建支付团队的命名空间
kubectl create namespace tenant-payment
# 建物流团队的命名空间
kubectl create namespace tenant-logistics
建完可以检查一下:
kubectl get namespace
正常会看到这两个命名空间在列表里。
3.2 第二步:给每个租户建专属的Flux资源
Flux的核心资源是GitRepository(拉代码的源)、Kustomization(要同步的配置),这些资源必须放在租户自己的命名空间里,而且只能同步自己的代码仓库。
3.2.1 给支付团队建GitRepository
先建支付团队的GitRepository,指定他们自己的代码仓库(比如https://github.com/payment-team/flux-config.git),而且这个资源只能放在tenant-payment命名空间:
# 支付团队的GitRepository配置
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: payment-git-repo
namespace: tenant-payment # 必须放在自己的命名空间
spec:
interval: 1m # 每1分钟拉一次代码
url: https://github.com/payment-team/flux-config.git # 支付团队自己的代码仓库
ref:
branch: main # 同步main分支
把这个配置保存成payment-git-repo.yaml,然后应用:
kubectl apply -f payment-git-repo.yaml
3.2.2 给支付团队建Kustomization
Kustomization是告诉Flux要同步哪些配置,同样只能放在tenant-payment命名空间,而且只能引用自己的GitRepository:
# 支付团队的Kustomization配置
apiVersion: kustomize.toolkit.fluxcd.io/v1
kind: Kustomization
metadata:
name: payment-kustomization
namespace: tenant-payment # 必须放在自己的命名空间
spec:
interval: 1m # 每1分钟同步一次配置
path: "./payment" # 代码仓库里的配置路径,只同步支付团队的配置
sourceRef:
kind: GitRepository
name: payment-git-repo # 只能引用自己的GitRepository
prune: true # 代码仓库里删了的配置,集群里也自动删
保存成payment-kustomization.yaml,应用:
kubectl apply -f payment-kustomization.yaml
3.2.3 给物流团队重复上面的操作
物流团队的配置只要把命名空间改成tenant-logistics,代码仓库改成自己的就行,比如:
# 物流团队的GitRepository配置
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
metadata:
name: logistics-git-repo
namespace: tenant-logistics # 自己的命名空间
spec:
interval: 1m
url: https://github.com/logistics-team/flux-config.git # 自己的代码仓库
ref:
branch: main
Kustomization同理,这里就不重复写了。
3.3 第三步:用RBAC给租户分配权限
现在每个租户的Flux资源都在自己的命名空间里,但还没给人分配权限——比如支付团队的开发能不能改自己的GitRepository?能不能看自己的Kustomization状态?
RBAC的核心是三个东西:
- Role:定义权限(比如能改GitRepository、能看Pod);
- RoleBinding:把权限分配给特定的人(比如某个开发账号);
- ServiceAccount:如果是用CI/CD自动操作,就用这个账号。
3.3.1 给支付团队建Role
先给支付团队建一个Role,定义他们能操作的权限:
# 支付团队的Role配置
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: payment-tenant-role
namespace: tenant-payment # 权限只在自己的命名空间生效
rules:
# 允许操作GitRepository(拉代码的源)
- apiGroups: ["source.toolkit.fluxcd.io"]
resources: ["gitrepositories"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# 允许操作Kustomization(同步配置的规则)
- apiGroups: ["kustomize.toolkit.fluxcd.io"]
resources: ["kustomizations"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# 允许操作自己的应用配置(比如Deployment、Service)
- apiGroups: ["apps", ""]
resources: ["deployments", "services", "pods"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
保存成payment-role.yaml,应用:
kubectl apply -f payment-role.yaml
3.3.2 给支付团队的开发分配权限(RoleBinding)
假设支付团队的开发账号是dev-alice,我们要把上面的Role分配给她:
# 支付团队的RoleBinding配置
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: payment-tenant-role-binding
namespace: tenant-payment # 只在自己的命名空间生效
subjects:
# 要分配权限的账号,这里是用户账号
- kind: User
name: dev-alice
apiGroup: rbac.authorization.k8s.io
roleRef:
# 引用刚才建的Role
kind: Role
name: payment-tenant-role
apiGroup: rbac.authorization.k8s.io
保存成payment-role-binding.yaml,应用:
kubectl apply -f payment-role-binding.yaml
3.3.3 给CI/CD分配权限(Service Account)
如果要让CI/CD自动更新Flux配置,就要建一个ServiceAccount,然后把Role分配给它:
# 支付团队的ServiceAccount配置
apiVersion: v1
kind: ServiceAccount
metadata:
name: payment-ci-sa
namespace: tenant-payment
然后改RoleBinding,把subjects里的User改成ServiceAccount:
# 支付团队的CI/CD RoleBinding配置
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: payment-ci-role-binding
namespace: tenant-payment
subjects:
# 要分配权限的是ServiceAccount
- kind: ServiceAccount
name: payment-ci-sa
namespace: tenant-payment
roleRef:
kind: Role
name: payment-tenant-role
apiGroup: rbac.authorization.k8s.io
3.4 第四步:验证隔离效果
现在要验证隔离是不是真的生效了,比如:
- 支付团队的开发能不能改自己的GitRepository?
- 支付团队的开发能不能改物流团队的GitRepository?
- 物流团队的开发能不能看支付团队的配置?
3.4.1 验证支付团队的权限
用dev-alice的账号登录集群,执行命令:
# 看自己的GitRepository,应该能看到
kubectl get gitrepositories -n tenant-payment
# 改自己的GitRepository的interval,改成2m,应该能成功
kubectl patch gitrepositories payment-git-repo -n tenant-payment --type='json' -p='[{"op":"replace","path":"/spec/interval","value":"2m"}]'
3.4.2 验证跨租户的权限
用dev-alice的账号尝试改物流团队的配置:
# 看物流团队的GitRepository,应该会报错(没有权限)
kubectl get gitrepositories -n tenant-logistics
# 改物流团队的GitRepository,应该会报错
kubectl patch gitrepositories logistics-git-repo -n tenant-logistics --type='json' -p='[{"op":"replace","path":"/spec/interval","value":"2m"}]'
如果报错“Forbidden”,就说明隔离生效了。
四、应用场景、优缺点和注意事项
4.1 应用场景
这个方案适合以下场景:
- 同一个集群有多个业务团队(租户),每个团队要独立管理自己的Flux配置;
- 团队之间有敏感配置(比如数据库密码、API密钥),需要严格隔离;
- 集群规模不大(比如租户数量不超过20个),不用复杂的多集群隔离。
4.2 技术优缺点
优点
- 无额外成本:只用Kubernetes和Flux自带的功能,不用买额外的软件;
- 隔离性强:每个租户的资源、权限都在自己的命名空间,不会互相干扰;
- 管理简单:只要统一管理每个租户的命名空间和RBAC配置,不用改Flux的核心逻辑。
缺点
- 配置量会膨胀:每个租户都要建自己的GitRepository、Kustomization、Role、RoleBinding,租户多了之后配置不好维护;
- 资源浪费:如果每个租户的Flux资源占的资源不多,但多了之后总和也不小;
- 故障影响范围:如果Flux的核心组件出问题,所有租户都会受影响。
4.3 注意事项
- 命名空间的命名规则:必须统一,比如都用
tenant-xxx,方便管理; - RBAC的权限最小化:不要给租户太多权限,比如不要让租户能改集群级的配置,只能改自己命名空间里的;
- 敏感配置的管理:即使隔离了,敏感配置也要用Secret管理,不要放在代码仓库里;
- 监控每个租户的Flux状态:每个租户的Kustomization状态都要监控,避免某个租户的配置同步失败没人知道。
五、总结
用命名空间+RBAC做Flux的多租户隔离,本质就是给每个租户建一个“专属房间”,再给房间装“门禁”——这个方案简单、实用,适合大多数中小规模的团队。只要按照步骤建命名空间、专属Flux资源、RBAC权限,就能实现严格的隔离,避免之前的配置冲突、权限泄露等问题。
最后要提醒的是,这个方案适合租户数量不多的情况,如果租户数量超过20个,就要考虑用更复杂的方案,比如多集群隔离或者Flux的多实例隔离,但对于大多数团队来说,这个方案已经足够用了。
评论
围绕“生产环境Flux多租户隔离实战:基于RBAC与命名空间的精细化权限控制方案”参与讨论